user1066183
user1066183

Reputation: 2584

Using Capybara and Selenium test suite fail switching from Firefox to Chrome

Using capybara (2.4.4) to test a non Rails application. I have write some tests, I run the tests using selenium with default firefox web browser and all tests are green.

Today I have tried to run same tests against chrome with this configuration:

Capybara.register_driver :selenium do |app|
  Capybara::Selenium::Driver.new(app, :browser => :chrome)
end

Capybara.javascript_driver = :selenium
Capybara.default_driver= :selenium
Capybara.app_host = ENV['WEB_SERVER_URL']

When I start the tests they fail becouse Chrome it seems too quick, infact with Firefox to complete the form it took several seconds, instead with Chrome is very very quick but then the tests fails with random errors:

  1. "email" field not found (??)
  2. current_url is not the expected url (?? in the browser I see the correct url!! )
  3. ect ect..

Errors in my opinion have no sense and is very strange because with Firefox all tests are green.

Have you ever noticed this problem?

Upvotes: 1

Views: 763

Answers (3)

user1066183
user1066183

Reputation: 2584

In accordance with the link provided by Tom Walpole I have switch from Chrome 44 to Chromium 43. I prefer use Chromium becouse I use chrome during my working day and I want to always have the latest version.

In my Ubuntu 14.04:

$sudo apt-get install chromium-browser

Then:

#spec/spec_helper.rb
require 'selenium/webdriver'

if ENV["USE_CHROME_BROWSER"]
  Capybara.register_driver :selenium do |app|
    Selenium::WebDriver::Chrome.path = ENV["CHROME_PATH"] if ENV["CHROME_PATH"]
    Capybara::Selenium::Driver.new app, browser: :chrome
  end
end

Capybara.default_driver = Capybara.javascript_driver = :selenium
Capybara.app_host = ENV['WEB_SERVER_URL']

With this configuration I can easily switch from Firefox (default) to Chromium.

I use dotenv gem to manage the configurations:

#./.env
...
USE_CHROME_BROWSER = true
CHROME_PATH = "/usr/bin/chromium-browser"
...

Upvotes: 1

Thomas Walpole
Thomas Walpole

Reputation: 49870

Chromedriver with Chrome 44 returns from actions much faster than before (incorrectly apparently) so visit is basically fully asynchronous. There have been numerous issues filed against Chromedriver for this such as https://code.google.com/p/chromedriver/issues/detail?id=1158&sort=-id&colspec=ID%20Status%20Pri%20Owner%20Summary

What this means for test stability is potentially needing to specify a longer wait on finds for the first element you're looking for after a visit, and checking for content that should be on the page before checking the current url (because content checks will use capybaras waiting behavior while capybara doesn't provide a waiting url matcher currently). You could also revert to Chrome 43 which will probably fix your issues

Upvotes: 1

user3373470
user3373470

Reputation:

Based on what you have provided, I cannot tell if Chrome actually does load faster than Firefox. However, the following may be of some help. Wherever you define your Capybara conditions, I suggest replacing them with the following:

Capybara.configure do |config|
  config.register_driver :selenium do |app|
    Capybara::Selenium::Driver.new(app, browser: :chrome)
    config.default_wait_time = 5  # default is 2 seconds
  end
  config.javascript_driver = :selenium
  config.default_driver= :selenium
  config.app_host = ENV['WEB_SERVER_URL']
end

Not only can you change the default wait time for Capybara to search for an element, but your code will be a little DRYer!

You may want to test other JavaScript drivers, like Capybara-Webkit. If this works for Chrome, I would suggest editing the config above, so capybara-webkit is set only when using a Chrome browser.

Upvotes: 0

Related Questions