与Capybara关闭模态

时间:2014-10-15 03:54:39

标签: 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在我在浏览器控制台中运行时都有效,但在我的测试中没有。

当我撬开我的测试时,我发现了这个:

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")

有什么想法吗?

RSpec 2,Capybara,Poltergeist 1.5.1

2 个答案:

答案 0 :(得分:2)

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

您需要在点击之前添加明确的sleep(n)(不是最佳解决方案),或者找到某种方式以编程方式确定页面何时可以点击叠加层。< / p>

答案 1 :(得分:1)

这对我有用:

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