Does Capybara require sleep to work?

六眼飞鱼酱① 提交于 2019-12-05 22:06:27

问题


Apparently, sleep or wait_until are not valid using recent versions of Capybara, according to the webpage updates.

However, I have a set of tests that only work on fast machines if I add a sleep(1) call to the test. That is, a test that looks like:

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

becomes

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

where I've defined unix_wait as:

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

The thing is, I have an old Ubuntu 12.04 quadcore laptop running these tests on Jenkins, and everything works well on it without the unix_wait calls. The tests failed randomly on a hexacore desktop running Ubuntu 13.10 and on a macbook pro laptop, but if I add in the unix_wait call, then the tests pass.

The test failures themselves are indicative of loading failures (ie, css elements missing on some runs, but not on others), and the things being tested actually work when the site is loaded manually.

So what's the appropriate action here? Apparently, sleep isn't allowed during testing, nor is wait_until. However, sleep is working, but it does seem extremely crude to me. Should I be looking at #synchronized? From what I gather from those blog posts, that's already getting called when I call click_link, and the tests are still failing.

What is the accepted protocol here?

I should add, because I think it's important: These are all javascript tests. I'm using capybara-webkit built on qt4 (not qt5). I'm considering switching to poltergeist or some other javascript driver as a debug step.


回答1:


In case your not doing this already, in your test assertion if you check for the content on the page it will wait for a set amount of time until that content becomes available.

So, instead of adding a sleep you can add something like

expect(page).to have_content 'Success'

Capybara accommodates Ajax and loading of elements etc. so it will wait implicitly when checking content.

You can alter the default wait time if you need to allow for loading of elements which you know may take longer i.e. 3rd partying queries/logins

Capybara.default_wait_time = 5



回答2:


A good alternative of wait_until and sleep is using_wait_time, an example of which is shown below.

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

You can also reload the page, after which you can check whatever conditions you have. This works for me at times.

visit current_url


来源:https://stackoverflow.com/questions/19737068/does-capybara-require-sleep-to-work

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!