如何使用无头铬与水豚和硒

You*_*ank 9 ruby selenium cucumber capybara google-chrome-headless

Chrome版本:59.0.3071.104

使用Cucumber,Capybara,Selenium实现无头Chrome的自动化测试.

功能/支持/ 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
Run Code Online (Sandbox Code Playgroud)

在进行黄瓜测试时,它说:

警告Selenium [DEPRECATION]:不推荐使用args或:开关.请改用Selenium :: WebDriver :: Chrome :: Options#add_argument.

使用Headless Chrome的水豚和硒的正确方法是什么?谢谢.

编辑1:我尝试使用Ruby-Binding,Capybara工作示例进行以下操作.但它也会产生错误.

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
Run Code Online (Sandbox Code Playgroud)

错误:

> undefined method `each' for
> #<Selenium::WebDriver::Remote::Capabilities:0xd13baac> (NoMethodError)
Run Code Online (Sandbox Code Playgroud)

编辑2:下载最新的ChromeDriver 2.30

使用ChromeDriver功能Chrome命令行开关中的示例,我收到错误消息.

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
Run Code Online (Sandbox Code Playgroud)

Luc*_*ton 9

1)确保你没有其他注册的驱动程序,我自己犯了这个错误并且有一个iphone驱动程序,它使用args旧的方式,这就是我收到警告的原因.

2)确保您在Linux上使用Chrome版本57+,在macOS 上使用59+或在Windows 上使用60+ ;

3)添加/更新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
Run Code Online (Sandbox Code Playgroud)


Edg*_*ega 9

更新 2020-02-01

ChromeDriver 的支持已于20193 月 24 日结束,作者建议大家移至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
Run Code Online (Sandbox Code Playgroud)

运行测试时,您还可以通过传递如下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
Run Code Online (Sandbox Code Playgroud)

上一个答案

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

gem 'chromedriver-helper'
gem 'selenium-webdriver'
Run Code Online (Sandbox Code Playgroud)

并更新您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
Run Code Online (Sandbox Code Playgroud)

无需通过,args因为驱动程序已经可用,可用驱动程序为:rack_test:selenium:selenium_chrome:selenium_chrome_headless

你可以跑 Headless Chrome

$ bin/rails test:system
Run Code Online (Sandbox Code Playgroud)

或者您也可以运行Chrome并查看在其上运行的测试

$ CHROME_HEADLESS=false bin/rails test:system
Run Code Online (Sandbox Code Playgroud)