我有一个模式在单击其叠加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
答案 0 :(得分:2)
最可能的问题是,当您在撬中手动执行此操作时,您的速度已经足够慢,以至于在您点击它时添加了叠加的点击事件,因此它会导致消失的模式。您的测试可能执行得足够快,以至于在添加点击事件之前点击了叠加层。
您需要在点击之前添加明确的sleep(n)
(不是最佳解决方案),或者找到某种方式以编程方式确定页面何时可以点击叠加层。< / p>
答案 1 :(得分:1)
这对我有用:
page.evaluate_script("$('#ModalID').modal('hide')")