mmr*_*mmr 8 javascript sleep ruby-on-rails capybara capybara-webkit
根据网页更新,显然,sleep或wait_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驱动程序作为调试步骤.
如果您没有这样做,在您的测试断言中,如果您检查页面上的内容,它将等待一段时间,直到该内容可用.
因此,您可以添加类似的内容,而不是添加睡眠
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)
| 归档时间: |
|
| 查看次数: |
2939 次 |
| 最近记录: |