rubyselenium-webdrivercucumbercapybaragoogle-chrome-headless

How to use headless Chrome with Capybara and Selenium


Chrome version: 59.0.3071.104

I am using Cucumber, Capybara, Selenium to implement automation testing with Headless Chrome.

features/support/env.rb

require 'rubygems'
require 'capybara/cucumber'

Capybara.register_driver :selenium_chrome do |app|
  Capybara::Selenium::Driver.new(app, :browser => :chrome, args: ['headless'])
end

Capybara.default_driver = :selenium_chrome

When running a cucumber test, it says:

WARN Selenium [DEPRECATION] :args or :switches is deprecated. Use Selenium::WebDriver::Chrome::Options#add_argument instead.

What is the correct way to use capybara and selenium with Headless Chrome. Thank you.

I tried the following using Ruby-Binding, Capybara and Working Example. But it gives errors as well.

require 'rubygems'
require 'capybara/cucumber'
require 'selenium-webdriver'

Capybara.register_driver :selenium_chrome do |app|
  options = Selenium::WebDriver::Chrome::Options.new
  options.add_argument('--headless')
  driver = Selenium::WebDriver.for :chrome, options: options
  Capybara::Selenium::Driver.new(
    app,
    browser: :chrome,
    desired_capabilities: driver
  )
end

Capybara.default_driver = :selenium_chrome

Error:

> undefined method `each' for
> #<Selenium::WebDriver::Remote::Capabilities:0xd13baac> (NoMethodError)

I downloaded the latest ChromeDriver 2.30.

Using the example from ChromeDriver Capabilities and Chrome Command Line Switches, I get an error.

Net::ReadTimeout (Net::ReadTimeout)

require 'rubygems'
require 'capybara/cucumber'
require 'selenium-webdriver'

Capybara.register_driver :selenium_chrome do |app|
  caps = Selenium::WebDriver::Remote::Capabilities.chrome(
    "chromeOptions" => {
      "binary" => "/chromedriver_win32/chromedriver.exe",
      "args" => [ "--disable-web-security", "--headless" ]
    }
  )
  Capybara::Selenium::Driver.new(
    app,
    browser: :chrome,
    desired_capabilities: caps
  )
end

Capybara.default_driver = :selenium_chrome

Solution

  • 1) Make sure you don't have another registered driver, I made this mistake myself and had an iphone driver, which was using the args in the old way, that's why I was getting the warning.

    2) Make sure you have Chrome version 57+ on Linux, 59+ on macOS or 60+ on Windows;

    3) Add/update the gem selenium-webdriver;

    4) Add the following driver to your spec_helper.rb or rails_helper.rb:

    Capybara.register_driver :chrome do |app|
      Capybara::Selenium::Driver.new app, browser: :chrome,
        options: Selenium::WebDriver::Chrome::Options.new(args: %w[headless disable-gpu])
    end
    
    Capybara.javascript_driver = :chrome