rspec - 使用 Capybara 关闭模态

标签 rspec capybara poltergeist

我有一个模式,当它的覆盖 div 被点击时关闭。覆盖层延伸到整个页面,但在模态本身之下。我想在我的测试中关闭这个模态,当点击覆盖时它关闭很重要。

# modal, simplified
<div class="modal-container" id="modal">
  <div class="overlay"></div>
  <div class="content">Content</div>
</div>

当模态关闭时,它的样式标签显示为“display: none”
# modal, closed
<div class="modal-container" id="modal" style="display:none;">
  <div class="overlay"></div>
  <div class="content">Content</div>
</div>

我无法在 Capybara 中关闭此模式。我试过了:
1. page.execute_script("$('.overlay').trigger('click')")
2. page.evaluate_script("$('.overlay').trigger('click')")
3. find('.overlay').trigger('click')
4. page.driver.click(10, 10)

当我在浏览器控制台中运行选项 1 和 2 时,它们都有效,但在我的测试中无效。

当我在我的测试中 pry 时,我发现:
find('.overlay')
=> #<Capybara::Element tag="div">
page.has_content?("modal content")
=> true
find('.overlay').trigger('click')
=> "click"
find('.overlay')
Capybara::ElementNotFound: Unable to find css ".overlay"
page.has_content?("modal content")
=> true

sleep 也没有帮助:
sleep(3)
page.evaluate_script("$('.overlay').trigger('click')")
sleep(3)
display = page.execute_script("document.getElementById('modal').style.display")

expect( display ).to eq("none")

有什么想法吗?

RSpec 2、 capybara 、Poltergeist 1.5.1

最佳答案

最可能的问题是,当您在 pry 中手动执行此操作时,您的速度足够慢,以至于在您单击它时已添加了叠加层的点击事件,因此它会导致模态消失。您的测试可能执行得足够快,以至于在添加 click 事件之前就点击了叠加层。

您要么需要添加显式 sleep(n)在单击它之前(不是最佳解决方案)或找到某种方式以编程方式确定页面何时准备好单击叠加层。

关于rspec - 使用 Capybara 关闭模态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26374223/

相关文章:

ruby-on-rails - Cucumber 是否只是 rspec 的包装器以帮助将测试组织成功能?

ruby-on-rails - RSpec 测试 Controller 实例变量收到消息

ruby-on-rails - 让 Capybara 的 inside() 方法找到 Rails 的资源 ID,例如#user_1234?

ruby-on-rails - 如何让poltergeist/PhantomJS延迟将页面返回给Capybara,直到AJAX加载?

Cucumber:使用 Poltergeist (PhantomJS) 禁用或删除本地存储

ruby - 如何使用 capybara 和 poltergeist 检索 innertext?

ruby-on-rails - 有没有办法强制 RSpec 显示中间结果?

ruby-on-rails - 如何在 rspec 中为访问方法设置 cookie?

poltergeist - send_keys 支持 Poltergeist?

ruby-on-rails - 如何使用 RSpec 测试路由约束