【问题标题】:Close Modal with Capybara使用 Capybara 关闭模态
【发布时间】:2017-10-20 19:10:55
【问题描述】:

我有一个模式,当它的覆盖 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

【问题讨论】:

    标签: rspec capybara poltergeist


    【解决方案1】:

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

    您要么需要在点击之前添加一个明确的sleep(n)(不是最佳解决方案),要么找到某种方式以编程方式确定页面何时可以点击覆盖。

    【讨论】:

    • 谢谢,@Matt。我尝试在执行前睡 3 秒,然后在检查前睡 3 秒,即使这样也无济于事。不过,我已经用这种尝试更新了我的问题。
    【解决方案2】:

    这对我有用:

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

    【讨论】:

      猜你喜欢
      • 2011-12-13
      • 2020-05-28
      • 1970-01-01
      • 2013-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-12
      • 1970-01-01
      相关资源
      最近更新 更多