web-dev-qa-db-fra.com

Comment utiliser Selenium Webdriver sur un Chrome sans tête?

J'apprends à utiliser Selenium pour des tâches de base, telles que la capture d'écran, le grattage et les tests, et j'aimerais l'utiliser avec Chrome sans tête, désormais stable à partir de Chrome 59.

J'ai été capable de prendre une capture d'écran en utilisant la gemme 'Selenium-webdriver' et chromedriver, mais pas sans tête.

Voici le script Ruby que je lance et qui se bloque après avoir commencé à initialiser le pilote

require 'rubygems'
require 'Selenium-webdriver'

Selenium::WebDriver.logger.level = :debug
p 'initializing driver'
driver = Selenium::WebDriver.for :chrome, switches: %w[--headless --disable-gpu --screenshot --hide-scrollbars]
p 'navigating to Google'
driver.navigate.to "http://google.com"  
driver.save_screenshot("./screen.png")
driver.quit

et la sortie des journaux:

:> Ruby rubytest.rb
"initializing driver"
2017-06-07 15:55:43 DEBUG Selenium Executing Process 

["/Users/name/Documents/scrapings/python/env/bin/chromedriver", "--port=9515"]
2017-06-07 15:55:43 DEBUG Selenium polling for socket on ["127.0.0.1", 9515]
Starting ChromeDriver 2.29.461585 (0be2cd95f834e9ee7c46bcc7cf405b483f5ae83b) on port 9515
Only local connections are allowed.
2017-06-07 15:55:43 INFO Selenium -> POST session
2017-06-07 15:55:43 INFO Selenium    >>> http://127.0.0.1:9515/session | {"desiredCapabilities":{"browserName":"chrome","version":"","platform":"ANY","javascriptEnabled":true,"cssSelectorsEnabled":true,"takesScreenshot":false,"nativeEvents":false,"rotatable":false,"chromeOptions":{"args":["--headless","--disable-gpu","--screenshot","--hide-scrollbars"]}}}
2017-06-07 15:55:43 DEBUG Selenium      > {"Accept"=>"application/json", "Content-Type"=>"application/json; charset=utf-8", "Content-Length"=>"284"}
[Ruby BACKTRACE TO DRIVER INITIALIZATION]

J'ai essayé d'utiliser les pilotes JavaScript et Python avec un code similaire et rien ne fonctionne. Quand j'essaye cela avec Python, le message d'erreur est

WebDriverException: Message: unknown error: Chrome failed to start: exited abnormally
  (Driver info: chromedriver=2.29.461585 (0be2cd95f834e9ee7c46bcc7cf405b483f5ae83b),platform=Mac OS X 10.12.5 x86_64)
5
Andrew Patterson

J'ai trouvé cet article de blog utile pour configurer du chrome sans tête avec Selenium in Ruby

require "Selenium-webdriver"

# configure the driver to run in headless mode
options = Selenium::WebDriver::Chrome::Options.new
options.add_argument('--headless')
driver = Selenium::WebDriver.for :chrome, options: options

driver.navigate.to "https://www.google.com"

# resize the window and take a screenshot
driver.manage.window.resize_to(800, 800)
driver.save_screenshot "screenshot.png"
4
acowpy

Nous avons finalement réussi à résoudre ce problème via divers documents, articles de blog et critiques.

caps = Selenium::WebDriver::Remote::Capabilities.chrome("desiredCapabilities" => {"takesScreenshot" => true}, "chromeOptions" => {"binary" => "/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary"})

driver = Selenium::WebDriver.for :chrome, desired_capabilities: caps, switches: %w[--headless --no-sandbox --disable-gpu --remote-debugin-port=9222 --screen-size=1200x800]

Vous devez utiliser une version très récente de Chrome (j'utilise Canary) et indiquer à Selenium le chemin d'accès au fichier binaire. Vous devez également définir les fonctionnalités souhaitées pour 'takesScreenshot' sur true.

2
boldfacedesignuk

J'ai écrit un blog sur la façon de le faire. En résumé:

1) Assurez-vous d’avoir Chrome version 57+ sous Linux, 59+ sous macOS ou 60+ sous Windows (le dernier n'a pas encore été publié, vous devez utiliser la version bêta, alias "Canary");

2) Ajouter/mettre à jour le gem Selenium-webdriver;

3) Assurez-vous d’utiliser ChromeDriver version 2.30 ou supérieure;

4) Ajoutez le driver suivant à votre spec_helper.rb ou 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
0
Lucas Caton