Skip to content

Instantly share code, notes, and snippets.

@KevinTriplett
Last active December 14, 2015 12:38
Show Gist options
  • Select an option

  • Save KevinTriplett/5087744 to your computer and use it in GitHub Desktop.

Select an option

Save KevinTriplett/5087744 to your computer and use it in GitHub Desktop.
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
@Hengjie
Copy link
Copy Markdown

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.

@mcfiredrill
Copy link
Copy Markdown

@josepjaume
Copy link
Copy Markdown

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
Copy link
Copy Markdown

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.

@kyleheddon
Copy link
Copy Markdown

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

@kyleheddon
Copy link
Copy Markdown

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