Capybara需要睡觉吗?

显然,根据网页 更新 ,使用最新版本的wait_untilsleepwait_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元素,但其他运行中没有),并且当手动加载站点时,被测试的内容实际上有效。

那么这里适当的行动是什么? 显然,测试期间不允许sleepwait_untilwait_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_untilsleep一个很好的替代方法是using_wait_time ,其示例如下所示。

 using_wait_time 5 do page.should have_content '' end 

您也可以重新加载页面,之后您可以检查您拥有的任何条件。 这有时对我有用。

 visit current_url