Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
Adding back the #wait_until to Capybara v2+ gem. Can probably be adapted for cucumber tests.
# add this file capybara_wait_until.rb to your /test directory
module Capybara
class Session
##
#
# Retry executing the block until a truthy result is returned or the timeout time is exceeded
#
# @param [Integer] timeout The amount of seconds to retry executing the given block
#
# this method was removed in Capybara v2 so adding it back if not already defined
#
unless defined?(wait_until)
def wait_until(timeout = Capybara.default_wait_time)
Capybara.send(:timeout, timeout, driver) { yield }
end
end
end
end
# Use it this way in /test/integration_test_helper.rb:
require 'capybara_wait_until'
module ActionController
class IntegrationTest
def wait_for_ajax_to_complete
# pass timeout in seconds if you need to override default_wait_time
page.wait_until { page.evaluate_script('jQuery.active === 0') }
end
end
end
Owner

KevinTriplett commented Mar 5, 2013

I really, really love Capybara and I also love Ruby for the ability to veto gem authors' choices. ;)

Hengjie commented Mar 6, 2013

I agree, I need something like this as well for a very special case of having to wait on Resque workers to finish processing before it updates the page via a push notification. Capybara just doesn't handle this 'special' case at all.

When you use find, capybara will be actually waiting for the element to appear (by using synchronize behind the scenes), so there's little reason to use wait_for here.

Moreover, this couples your acceptance tests to your underlying implementation and will be a pain to deal with when you decide to use websockets there, or just remove ajax calls for some reason.

mhuggins commented Jul 9, 2013

@josepjaume - can you give a code example on using synchronize? I get an error that the method doesn't exist.

When I try to call wait_until, I get:
class or module required for rescue clause

to be more specific:

Failure/Error: page.wait_until {
     TypeError:
       class or module required for rescue clause
     # ./spec/support/capybara/wait_until.rb:13:in `wait_until'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment