要在此处添加现有知识体系:
对于JS测试,Capybara必须保持两个线程(一个用于RSpec,一个用于Rails)和另一个进程(浏览器)保持同步。它通过在大多数匹配器和节点查找方法中等待(直到配置的最大等待时间)来完成此操作。
Capybara主要还具有不需要等待的方法Node#all
。使用它们就像告诉您的规格您希望它们间歇性地失败。
公认的答案表明page.first('selector')
。至少对于JS规范来说,这是不可取的,因为Node#first
使用Node#all
。
也就是说,如果您像这样配置Capybara ,Node#first
将等待:
# rails_helper.rb
Capybara.wait_on_first_by_default = true
此选项是在Capybara 2.5.0中添加的,默认情况下为false。
如Andrei所述,您应该改用
find('selector', match: :first)
或更改您的选择器。无论配置还是驱动程序,两者都可以正常工作。
更复杂的是,在旧版本的Capybara(或启用了config选项)中,它们#find
会很乐意忽略歧义,只是返回第一个匹配的选择器。这也不是一件好事,因为它使您的规范不那么明确,我想这就是为什么不再使用默认行为。我将省略这些细节,因为上面已经讨论过了。
更多资源: