如何将无头 chrome 与水豚和硒一起使用

How to use headless chrome with capybara and selenium

Chrome版本:59.0.3071.104

使用 Cucumber、Capybara、Selenium 实现 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

当运行一个黄瓜测试时,它说:

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

在 Headless 中使用水豚和硒的正确方法是什么 Chrome。谢谢。

编辑 1:我使用 Ruby-Binding, Capybara and Working Example 尝试了以下操作。但它也会出错。

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

错误:

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

编辑 2: 下载最新的 ChromeDriver 2.30

使用 ChromeDriver Capabilities & Chrome Command Line Switches 中的示例时出现错误。

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

Windows 支持即将到来 Chrome 60.

下载"Chome Canary"并在chromeOptions.

中给出安装路径binary

下载最新的 "chromedriver" 并添加到环境变量中的路径。

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

Capybara.register_driver :selenium_chrome do |app|
  caps = Selenium::WebDriver::Remote::Capabilities.chrome(
    "chromeOptions" => {
      "binary" => "C:/Users/YOURUSERNAME/AppData/Local/Google/Chrome SxS/Application/chrome.exe",
      "args" => [ "--disable-web-security", "--headless", "--disable-gpu" ]
    }
  )
  Capybara::Selenium::Driver.new(
    app, 
    browser: :chrome, 
    desired_capabilities: caps
  )
end

Capybara.default_driver = :selenium_chrome

1) 确保你没有其他注册驱动程序,我自己犯了这个错误并且有一个 iphone 驱动程序,它以旧方式使用 args,这就是为什么我正在收到警告。

2) 确保你在 Linux 上有 Chrome 版本 57+,在 macOS 上有 59+60+ 在 Windows;

3) Add/update gem selenium-webdriver;

4) 将以下 驱动程序 添加到您的 spec_helper.rbrails_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

我可以在当前版本的 Chrome 上使用它,但它会显示空白 window。如果你想摆脱它,那么你需要使用 "Chrome Canary" build.

下面的代码结合了@lucas-caton 和@shawn-derik 的答案,但解决了我上面提到的问题。

Capybara.register_driver :chrome do |app|
  Capybara::Selenium::Driver.new(
    app,
    browser: :chrome,
    options: Selenium::WebDriver::Chrome::Options.new(
      binary: 'C:/Users/USERNAME/AppData/Local/Google/Chrome SxS/Application/chrome.exe',
      args: %w[no-sandbox headless disable-gpu]
    )
  )
end

更新 2020-02-01

对 Chrome 驱动程序的支持已于 Mar 24, 2019, creator recommended everybody to move to https://github.com/titusfortner/webdrivers 结束,话虽如此,以下是对我有用的配置:

require "test_helper"

class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
  driver = ENV['DRIVER'] ? ENV['DRIVER'].to_sym : :headless_chrome
  driven_by :selenium, using: driver, screen_size: [1400, 1400]
end

当 运行 进行测试时,您还可以通过传递 DRIVER 变量来指定不同的驱动程序,例如:

$ DRIVER=firefox bin/rails test:system
$ DRIVER=headless_firefox bin/rails test:system
$ DRIVER=chrome bin/rails test:system
$ DRIVER=headless_chrome bin/rails test:system

上一个答案

使用 Rails 应用 运行 无头 Chrome 的最简单方法是将以下 gem 添加到 Gemfile

gem 'chromedriver-helper'
gem 'selenium-webdriver'

并使用以下内容更新您的 application_system_test_case.rb

require "test_helper"

class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
  driver = ENV['CHROME_HEADLESS'] == 'false' ? :selenium_chrome : :selenium_chrome_headless
  driven_by driver, screen_size: [1400, 1400]
end

不需要传递args,因为驱动程序已经可以使用,可用的驱动程序有:rack_test:selenium:selenium_chrome:selenium_chrome_headless.

你可以运行Headless Chrome

$ bin/rails test:system

或者您也可以 运行 Chrome 并查看测试 运行ning

$ CHROME_HEADLESS=false bin/rails test:system