Posted over 6 years ago. Visible to the public. Repeats.

Waiting for page loads and AJAX requests to finish with Capybara

If you're using the Capybara webdriver, steps sometimes fail because the browser hasn't finished loading the next page yet, or it still has a pending AJAX request. You'll often see workarounds like

Copy
When I wait for the page to load Then ...

Workarounds like this do not work reliably, will result in flickering tests and should be avoided. There is no known reliable way to detect if the browser has finished loading the page.

Solution

Instead you should wait until you can observe the result of a page load. E.g. if you make an AJAX requests to populate autocomplete suggestions, wait until you can see the suggestions box:

Copy
wait_until do page.has_css?('.suggestions') end

You don't need to do this if you're using Spreewald's web steps, because the steps take care of this automatically. They do this by wrapping all assertions into a helper called patiently do, like this:

Copy
Then /^I should see "([^\"]*)" in the HTML$/ do |text| patiently do page.body.should include(text) end end

This works by rerunning the inner block several times till it succeeds or a timeout is reached, when we're inside a @javascript feature.

You're encouraged to use this for all of your own steps that check for page content. If a step does not actually access the page object, they do not need this, of course.

By refactoring problematic code and creating automated tests, makandra can vastly improve the maintainability of your Rails application.

Owner of this card:

Avatar
Tobias Kraze
Last edit:
over 2 years ago
Keywords:
selenium
About this deck:
We are makandra and do test-driven, agile Ruby on Rails software development.
License for source code
Posted by Tobias Kraze to makandra dev
This website uses cookies to improve usability and analyze traffic.
Accept or learn more