Capybara需要睡觉吗?

时间:2013-11-01 23:28:12

标签: javascript ruby-on-rails capybara sleep capybara-webkit

根据webpage updates,显然sleepwait_until使用最新版本的Capybara无效。

但是,如果我在测试中添加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调用,则测试通过。

测试失败本身表示加载失败(即某些运行中缺少css元素,但其他运行没有),并且当手动加载站点时,被测试的内容实际上有效。

那么这里的适当行动是什么?显然,在测试期间不允许sleepwait_until也不允许#synchronized。然而,睡眠是有效的,但它对我来说似乎非常粗糙。我应该看click_link吗?从我从那些博客文章中收集到的内容,当我打电话给{{1}}时,这已经被调用了,而且测试仍然失败。

这里接受的协议是什么?

我应该补充一下,因为我认为这很重要:这些都是javascript测试。我正在使用基于qt4(而不是qt5)的capybara-webkit。我正在考虑转向使用poltergeist或其他一些javascript驱动程序作为调试步骤。

2 个答案:

答案 0 :(得分:5)

如果您还没有这样做,在您的测试断言中,如果您检查页面上的内容,它将等待一段时间,直到该内容可用。

因此,您可以添加类似

的内容,而不是添加睡眠
expect(page).to have_content 'Success'

Capybara可以容纳Ajax和加载元素等,因此在检查内容时会隐式等待。

如果您需要允许加载您知道可能需要更长时间的元素,即第三方参与查询/登录,您可以更改默认等待时间

Capybara.default_wait_time = 5

答案 1 :(得分:0)

wait_untilsleep的一个很好的选择是using_wait_time,其示例如下所示。

using_wait_time 5 do
  page.should have_content '<content>'
end

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

visit current_url