2

I'm using Capybara and Minitest to test my Rails 4 application. We have a page I'm trying to test that loads a Google Map and colorbox via AJAX.

We need to make sure AJAX is loaded before checking for a certain element and are trying to follow this tutorial: https://thoughtbot.com/blog/automatically-wait-for-ajax-with-capybara

Most of the tutorials are using RSpec, so I'm putting the code in test_helper.rb:

class ActionDispatch::IntegrationTest
  # Make the Capybara DSL available in all integration tests
  include Capybara::DSL
  include Warden::Test::Helpers
  Warden.test_mode!

  Capybara.default_max_wait_time = 5
  Capybara.javascript_driver = :webkit

  def wait_for_ajax
    page.evaluate_script("jQuery.active") == 0
    yield
  end
end

Looking through other people that are getting the error, it appears they didn't have the capybara-webkit gem installed. However, we do:

Running bundle install:

...
Using capybara 2.5.0
Using capybara-webkit 1.7.1

Here is the test I'm failing on:

test "colorbox should appear on pageload" do
    visit trips_new_path
    wait_for_ajax do
      assert_selector "#colorbox", "colorbox not created on trips/new"
    end
 end

And I'm receiving the error:

Capybara::NotSupportedByDriverError:         Capybara::NotSupportedByDriverError: Capybara::Driver::Base#evaluate_script
            test/test_helper.rb:35:in `wait_for_ajax'
            test/integration/trip_creation_test.rb:17:in `block in <class:TripCreationTest>'

I've tried setting the JavaScript in a few different places but it still seems not to work.

Update: Tried additional syntax and getting the same error:

  def wait_for_ajax
    Capybara.javascript_driver = :webkit
    Timeout.timeout(Capybara.default_wait_time) do
      loop until finished_all_ajax_requests?
    end
  end

  def finished_all_ajax_requests?
    page.evaluate_script('jQuery.active').zero?
  end

Thank you in advance for your help!

4
  • I think there's an error in the page.evaluate_script("jQuery.active") == 0 syntax Commented Dec 7, 2015 at 10:51
  • Thank you for the reply. I tried an additional syntax from the tutorial but I am still getting the same error. Updated my question with the new code. Commented Dec 7, 2015 at 13:04
  • try to change your test from test "colorbox should appear on pageload" do to describe "colorbox should appear on pageload", :js => true do Commented Dec 7, 2015 at 13:12
  • These days you can make driver equal to :selenium_headless Commented Mar 20, 2020 at 3:56

1 Answer 1

3

The fact you're getting a NotSupportedByDriver error means your test isn't actually using the capybara-webkit driver and probably is still using the default racktest driver. You need to specify that a specific test is supposed to use the JavaScript capable driver. If you're using something like https://github.com/wojtekmach/minitest-capybara you can look through the gems README to see examples of how to specify it manually, or to set up so you can tag tests with metadata. Once you have the test actually using the correct driver you will probably find you don't actually need the wait_for_ajax method since Capybaras finders will then automatically wait for the content to appear.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.