Capybara需要睡觉吗?
显然,根据网页 更新 ,使用最新版本的wait_until
, sleep
或wait_until
无效。
但是,如果我在测试中添加sleep(1)
调用,我有一组仅适用于快速计算机的测试。 也就是说,测试看起来像:
describe "dosimeters page" do before do click_link("Dosimeter Read History", :match=>:first) end ...
变
describe "dosimeters page" do before do unix_wait click_link("Dosimeter Read History", :match=>:first) end ...
我把unix_wait
定义为:
def unix_wait case RbConfig::CONFIG['host_os'] when /darwin/ when /linux-gnu/ sleep(1) end end
问题是,我有一台旧的Ubuntu 12.04四核笔记本电脑在Jenkins上运行这些测试,一切都运行良好,没有unix_wait
调用。 测试在运行Ubuntu 13.10和macbook pro笔记本电脑的unix_wait
桌面上随机失败,但如果我添加了unix_wait
调用,则测试通过。
测试失败本身表示加载失败(即某些运行中缺少css元素,但其他运行中没有),并且当手动加载站点时,被测试的内容实际上有效。
那么这里适当的行动是什么? 显然,测试期间不允许sleep
, wait_until
也wait_until
。 然而,睡眠是有效的,但它对我来说似乎非常粗糙。 我应该看#synchronized
吗? 从我从那些博客文章中收集的内容来看,当我调用click_link
时,这些内容已经被调用,并且测试仍然失败。
这里接受的协议是什么?
我应该补充一下,因为我认为这很重要:这些都是javascript测试。 我正在使用基于qt4(不是qt5)的capybara-webkit。 我正在考虑切换到poltergeist或其他一些javascript驱动程序作为调试步骤。
如果您没有这样做,在您的测试断言中,如果您检查页面上的内容,它将等待一段时间,直到该内容可用。
因此,您可以添加类似的内容,而不是添加睡眠
expect(page).to have_content 'Success'
Capybara可以容纳Ajax和加载元素等,因此在检查内容时会隐式等待。
如果您需要允许加载您知道可能需要更长时间的元素,即第3次参加派对查询/登录,您可以更改默认等待时间
Capybara.default_wait_time = 5
wait_until
和sleep
一个很好的替代方法是using_wait_time
,其示例如下所示。
using_wait_time 5 do page.should have_content '' end
您也可以重新加载页面,之后您可以检查您拥有的任何条件。 这有时对我有用。
visit current_url