8

根据网页更新,显然,sleep或者wait_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 元素,但在其他运行中没有),并且当手动加载站点时,被测试的东西实际上可以工作。

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

这里接受的协议是什么?

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

4

2 回答 2

5

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

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

expect(page).to have_content 'Success'

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

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

Capybara.default_wait_time = 5
于 2013-11-11T21:35:03.960 回答
0

wait_until和的一个很好的替代方法sleepusing_wait_time,下面显示了一个示例。

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

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

visit current_url
于 2016-06-20T19:52:02.940 回答