Rspec 水豚闭合模型

Rspec 水豚闭合模型,rspec,capybara,poltergeist,Rspec,Capybara,Poltergeist,我有一个模式,当它的覆盖div被点击时关闭。覆盖层覆盖整个页面,但位于模式本身之下。我想在我的测试中关闭这个模式,重要的是它在单击覆盖时关闭 # modal, simplified <div class="modal-container" id="modal"> <div class="overlay"></div> <div class="content">Content</div> </div> 当我在浏览器控

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

# modal, simplified
<div class="modal-container" id="modal">
  <div class="overlay"></div>
  <div class="content">Content</div>
</div>
当我在浏览器控制台中运行选项1和选项2时,这两个选项都起作用,但在测试中不起作用

当我窥探我的测试时,我发现:

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
有什么想法吗


RSpec 2,Capybara,Poltergeist 1.5.1

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

您需要在单击之前添加一个显式的
sleep(n)
(不是最佳解决方案),或者找到某种方式,通过编程确定页面何时准备好单击覆盖层。

这对我来说很有效:

page.evaluate_script("$('#ModalID').modal('hide')")

谢谢,马特。我试着在执行之前睡3秒钟,在检查之前睡3秒钟,即使这样也没有帮助。不过,我已经用这一尝试更新了我的问题。
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(3)
page.evaluate_script("$('.overlay').trigger('click')")
sleep(3)
display = page.execute_script("document.getElementById('modal').style.display")

expect( display ).to eq("none")
page.evaluate_script("$('#ModalID').modal('hide')")