Capybara需要睡觉吗?

mmr*_*mmr 8 javascript sleep ruby-on-rails capybara capybara-webkit

根据网页更新,显然,sleepwait_until使用最新版本的Capybara无效.

但是,如果我添加sleep(1)对测试的调用,我有一组只能在快速机器上运行的测试.也就是说,测试看起来像:

describe "dosimeters page" do
  before do
    click_link("Dosimeter Read History", :match=>:first)
  end
...
Run Code Online (Sandbox Code Playgroud)

describe "dosimeters page" do
  before do
    unix_wait
    click_link("Dosimeter Read History", :match=>:first)
  end
...
Run Code Online (Sandbox Code Playgroud)

在那里我定义unix_wait为:

def unix_wait
  case RbConfig::CONFIG['host_os']
  when /darwin/
  when /linux-gnu/
    sleep(1)
  end
end
Run Code Online (Sandbox Code Playgroud)

问题是,我有一台旧的Ubuntu 12.04四核笔记本电脑在Jenkins上运行这些测试,一切都运行良好,没有unix_wait电话.测试在运行Ubuntu 13.10和macbook pro笔记本电脑的六核桌面上随机失败,但是如果我添加了unix_wait调用,那么测试就会通过.

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

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

这里接受的协议是什么?

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

Ast*_*sta 5

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

因此,您可以添加类似的内容,而不是添加睡眠

expect(page).to have_content 'Success'
Run Code Online (Sandbox Code Playgroud)

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

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

Capybara.default_wait_time = 5
Run Code Online (Sandbox Code Playgroud)