强制 Capybara 在意外模式下失败

Force Capybara to fail on unexpected modals

我正在进行一些测试来触发和验证这样的 JS 警报:

it 'triggers a modal' do
  accept_alert('Hello world') do
    visit '/'
    click_button 'Button'
  end
end

哪个失败了:

 Capybara::ModalNotFound:
       Unable to find modal dialog with Hello world

当 运行 无头的时候,我以为对话框根本没有被触发,这是我的 JS 代码的问题,但我注意到列出了测试日志:

* Listening on tcp://127.0.0.1:3001
Modal window has been opened, but you didn't wrap your code into (`accept_prompt` | `dismiss_prompt` | `accept_confirm` | `dismiss_confirm` | `accept_alert`), accepting by default
F

运行 完整 Chrome 我注意到正在触发模态并显示预期的消息。所以现在我不确定:

我可能有一个愚蠢的语法错误,但我认为以上是正确的并且正在进行另一项测试。为了弄清真相,我想禁用 Capybara 的 "accepting by default".

有什么办法可以:

  1. 使任何意外模态无法通过测试(而不是 accept/dismiss)?
  2. 注销出现的模态文本?

默认情况下接受不是由 Capybara 完成的,它是由您正在使用的驱动程序完成的(我假设基于正在生成的消息的 Cuprite)。如果您包装导致模态出现的操作(基于表现出的行为,我假设 visit)而不是整个测试,那么如果错误消息不正确,它将引发错误 因为 accept_alert 方法只在块完成期待后才期待模态

accept_alert('Hello world') do
  visit '/'
end
click_button 'Button'

auto-accepting(带有警告)意外警报的行为是由于其原始设计基于 Poltergeist,我认为目前无法配置。