web-dev-qa-db-fra.com

Heroku: impossible de se connecter à chromedriver 127.0.0.1:9515 avec Watir/Selenium

Ceci s'exécute localement (sans spécifier driver_path), mais pas sur Heroku.

Code:

Selenium::WebDriver::Chrome.driver_path = ENV['GOOGLE_CHROME_SHIM']
browser = Watir::Browser.new :chrome

J'ai confirmé les valeurs ci-dessous dans la console heroku Rails

ENV['GOOGLE_CHROME_BIN'] => "/app/.apt/opt/google/chrome/chrome"
ENV['GOOGLE_CHROME_SHIM'] => "/app/.apt/usr/bin/google-chrome-stable"

Buildpacks installés:

https://github.com/heroku/heroku-buildpack-chromedriver
https://github.com/heroku/heroku-buildpack-google-chrome

Erreur actuelle:

Selenium :: WebDriver :: Error :: WebDriverError: impossible de se connecter à Chromedriver 127.0.0.1:9515

La recherche de unable to connect to chromedriver 127.0.0.1:9515 sur SO renvoie plusieurs résultats, mais aucun ne mentionne heroku.


Également:

J'ai considéré les fantômes. Quelqu'un d'autre l'a fait fonctionner ici, À l'aide d'un navigateur sans navigateur avec pile Heroku Rails Unicorn

Mais c'est obsolète. Erreur ci-dessous lors de l'exécution locale.

Le support Selenium pour PhantomJS est obsolète. Utilisez plutôt Chrome/Firefox ou HTMLUnit sans tête.


Aussi essayé:

Pour plus de transparence, j'ai également essayé les solutions suivantes.

Changer de browser = Watir::Browser.new :chrome

Pour browser = Watir::Browser.new :chrome, headless: true

Bien que je ne m'attendais pas à ce que cela fonctionne.


Aussi également essayé:

Suppression de: https://github.com/heroku/heroku-buildpack-chromedriver 

Ajout de: https://github.com/heroku/heroku-buildpack-xvfb-google-chrome.

Ajout de headless gem.

Et en exécutant le script ci-dessous indiqué dans la page de la variable watir, http://watir.com/guides/headless/ .

require 'watir'
require 'headless'
headless = Headless.new
headless.start
b = Watir::Browser.start 'www.google.com'
puts b.title
b.close
headless.destroy

Erreur:

Selenium :: WebDriver :: Error :: UnknownError: erreur inconnue: impossible de trouver Chrome binaire

Je suppose que cela a échoué car je n’ai pas spécifié l’emplacement du programme binary/shim de chrome. Impossible de trouver comment spécifier cela lors de l'utilisation de headless dans la documentation.


Essayé Par Suggestion:

heroku run /usr/bin/chromedriver --app app-name

Lancer/usr/bin/chromedriver sur ⬢ app-name ... up, run.2151

(Hobby) bash:/usr/bin/chromedriver: Aucun fichier ni répertoire de ce type

Voir également ci-dessous les journaux qui mentionnent chrome lors du déploiement sur heroku:

remote: -----> chromedriver app detected
remote: -----> Looking up latest chromedriver version...
remote: -----> Downloading chromedriver v2.33...
remote: Archive:  /tmp/chromedriver.Zip
remote:   inflating: /tmp/build_cd35072c5b766edaa2b565cbff57e5d6/.chromedriver/bin/chromedriver  
remote: -----> Creating chromedriver export scripts...
remote: -----> Google Chrome app detected
...
remote: -----> Fetching https://dl.google.com/linux/direct/google-chrome-stable_current_AMD64.deb
remote: -----> Installing google-chrome-stable_current_AMD64.deb
...
remote: -----> Creating google-chrome shims


Quelques progrès:

Si je ssh sur le serveur heroku,

heroku run bash --app app-name

Et recherchez les fichiers avec le nom chrome,

find /app/ -name "*chrome*"

/app/.profile.d/chromedriver.sh
/app/.profile.d/010_google-chrome.sh
/app/.apt/etc/cron.daily/google-chrome
/app/.apt/opt/google/chrome
/app/.apt/opt/google/chrome/chrome
/app/.apt/opt/google/chrome/chrome_100_percent.pak
/app/.apt/opt/google/chrome/chrome-sandbox
/app/.apt/opt/google/chrome/chrome_200_percent.pak
/app/.apt/opt/google/chrome/google-chrome
/app/.apt/opt/google/chrome/cron/google-chrome
/app/.apt/usr/bin/google-chrome-stable
/app/.apt/usr/bin/google-chrome
/app/.apt/usr/share/menu/google-chrome.menu
/app/.apt/usr/share/doc/google-chrome-stable
/app/.apt/usr/share/applications/google-chrome.desktop
/app/.apt/usr/share/gnome-control-center/default-apps/google-chrome.xml
/app/.apt/usr/share/man/man1/google-chrome.1
/app/.apt/usr/share/appdata/google-chrome.appdata.xml
/app/vendor/bundle/Ruby/2.4.0/gems/Selenium-webdriver-3.7.0/lib/Selenium/webdriver/chrome
/app/vendor/bundle/Ruby/2.4.0/gems/Selenium-webdriver-3.7.0/lib/Selenium/webdriver/chrome.rb
/app/vendor/bundle/Ruby/2.4.0/gems/browser-2.4.0/test/unit/chrome_test.rb
/app/vendor/bundle/Ruby/2.4.0/gems/browser-2.4.0/lib/browser/platform/chrome_os.rb
/app/vendor/bundle/Ruby/2.4.0/gems/browser-2.4.0/lib/browser/chrome.rb
/app/.chromedriver
/app/.chromedriver/bin/chromedriver

Je peux voir le binaire chromedriver à /app/.chromedriver/bin/chromedriver.

Alors j'ai essayé

heroku run /app/.chromedriver/bin/chromedriver --app app-name

Résultat:

Running /app/.chromedriver/bin/chromedriver on ⬢ app-name... up, run.2067 (Hobby)
Starting ChromeDriver 2.33.506092 (733a02544d189eeb751fe0d7ddca79a0ee28cce4) on port 9515
Only local connections are allowed.

Mais exécuter heroku run rake Selenium_namespace:task_one --app app-name donne le même résultat.

Selenium :: WebDriver :: Error :: WebDriverError: impossible de se connecter à Chromedriver 127.0.0.1:9515 ... /App/vendor/Ruby-2.4.1/lib/Ruby/2.4 .0/net/http.rb: 906: in "rescue in Block in connect": échec de l'ouverture de la connexion TCP à 127.0.0.1:9515 (Connexion refusée - connect (2) pour "127.0.0.1" port 9515) (Errno :: ECONNREFUSED) ...

12
tim_xyz

Ceci est possible sur Heroku.


Confondre chromeand chromedrivername__

Votre configuration mélange chromedriveret Chrome. GOOGLE_CHROME_SHIM pointe sur le Chromeexecutable google-chrome-stable, pas sur chromedriver. dans le message d'erreur trompeur.

Selenium::WebDriver::Chrome.driver_path = ENV['GOOGLE_CHROME_SHIM'] # WRONG!

Au moment de la rédaction de ce document (Jan '18), le groupe de build chromedriverajoute automatiquement /app/.chromedriver/bin à la variable $PATH. Si vous deletela ligne ci-dessus, Selenium devrait à nouveau pouvoir trouver chromedriverautomatiquement.

Et alors?

Vous avez probablement ajouté la ligne ci-dessus pour empêcher Selenium de ne pas trouver le binaire Chrome. Le message d'erreur pour cela aurait ressemblé à quelque chose comme: 

Selenium :: WebDriver :: Error :: UnknownError: erreur inconnue: impossible de trouver Chrome binaire

Vous pouvez résoudre ce problème en indiquant à Selenium l'emplacement du binaire Chrome à l'aide de Selenium::WebDriver::Chrome::Options. Le code suivant devrait accomplir cela.

options = Selenium::WebDriver::Chrome::Options.new
chrome_bin_path = ENV.fetch('GOOGLE_CHROME_SHIM', nil)
options.binary = chrome_bin_path if chrome_bin_path # only use custom path on heroku
options.add_argument('--headless') # this may be optional
driver = Selenium::WebDriver.for :chrome, options: options
driver.navigate.to "https://stackoverflow.com"

Buildpacks

Tout cela devrait être possible avec les packs de build chromeet chromedriverstandard:

https://github.com/heroku/heroku-buildpack-google-chrome.githttps://github.com/heroku/heroku-buildpack-chromedriver.git

Si vous automatisez les clics dans le navigateur, vous aurez peut-être besoin de heroku-buildpack-xvfb-google-chrome au lieu de Vanilla chromename__, mais cela ne devrait pas être nécessaire pour que not ne fonctionne pas.

0
laverick

Je lutte avec celui-ci depuis plus de quelques heures ... 

Essayer de déboguer sur Heroku CI a été très frustrant. Ce billet m'a beaucoup aidé à trouver une solution.

J'ai eu ce morceau de code dans le spec_helper.rb qui posait problème (car si cela aide quelqu'un):

config.before(:each, type: :system, js: true) do
  driven_by :Selenium_chrome_headless
end

C'était contourner toute la configuration capybara ...

0
user3432652

Je cite Ilya Vassilevsky à partir de ceci post

ChromeDriver est juste un pilote pour Chrome. Le navigateur Chrome doit être installé sur le même ordinateur pour fonctionner.

Heroku n’a pas installé Chrome sur son dynos par défaut. Vous devez utiliser un buildpack qui installe Chrome. Par exemple:

https://github.com/dwayhs/heroku-buildpack-chrome

Vous pouvez voir comment cela va chercher Chrome:

https://github.com/dwayhs/heroku-buildpack-chrome/blob/master/bin/compile#L36-38

Ensuite, j'ai lu leur discussion dans les commentaires:

Petr Gazarov dit

J'ai essayé ce buildpack et cela n'a pas fonctionné. Je soupçonne que l'installation de Google Chrome (ou de tout autre navigateur) sur heroku pourrait être plus complexe. 

Ilya Vassilevsky répond 

Oui, Heroku est une plate-forme très avisée et fermée. Il devrait être beaucoup plus facile de configurer Chrome avec ChromeDriver sur votre propre VM sur AWS, Linode ou DigitalOcean.

Petr Gazarov répond

Merci pour votre réponse, Ilya. J'ai fini par ré-écrire avec Watir avec phantomjs parce que je ne pouvais pas faire installer Heroku pour installer Chrome.

Vous pouvez lire plus d'informations dans cette question. Si quelque chose me vient à l’esprit, je l’afficherai.

0
Fabrizio Bertoglio