根据webpage updates,显然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
吗?从我从那些博客文章中收集到的内容,当我打电话给{{1}}时,这已经被调用了,而且测试仍然失败。
这里接受的协议是什么?
我应该补充一下,因为我认为这很重要:这些都是javascript测试。我正在使用基于qt4(而不是qt5)的capybara-webkit。我正在考虑转向使用poltergeist或其他一些javascript驱动程序作为调试步骤。
答案 0 :(得分:5)
如果您还没有这样做,在您的测试断言中,如果您检查页面上的内容,它将等待一段时间,直到该内容可用。
因此,您可以添加类似
的内容,而不是添加睡眠expect(page).to have_content 'Success'
Capybara可以容纳Ajax和加载元素等,因此在检查内容时会隐式等待。
如果您需要允许加载您知道可能需要更长时间的元素,即第三方参与查询/登录,您可以更改默认等待时间
Capybara.default_wait_time = 5
答案 1 :(得分:0)
wait_until
和sleep
的一个很好的选择是using_wait_time
,其示例如下所示。
using_wait_time 5 do
page.should have_content '<content>'
end
您也可以重新加载页面,之后您可以检查您拥有的任何条件。这有时适合我。
visit current_url