Cela 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 un tas de résultats mais aucun ne mentionne heroku.


Aussi:

J'ai considéré phantomjs. Quelqu'un d'autre l'a fait fonctionner ici, Utilisation d'un navigateur sans tête avec la pile Heroku Rails Unicorn

Mais c'est obsolète. Ci-dessous l'erreur lors de son exécution localement.

La prise en charge de Selenium pour PhantomJS est obsolète. Utilisez plutôt Chrome / Firefox ou HTMLUnit sans tête.


Également essayé:

Pour la transparence, j'ai également essayé ce qui suit.

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

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

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


Également essayé:

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

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

Ajout de headless gem.

Et exécutez le script ci-dessous donné dans la watir page de gemmes, http://watir.com/guides/ sans tête /.

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 le binaire Chrome

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


Essayé par suggestion:

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

Exécution de / usr / bin / chromedriver sur ⬢ app-name ... up, run.2151

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

Consultez également les journaux ci-dessous 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 dans le serveur heroku,

heroku run bash --app app-name

Et recherchez les fichiers portant 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.

J'ai donc 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 alors 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 : dans `rescue in block in connect ': Impossible d'ouvrir la connexion TCP vers 127.0.0.1:9515 (Connexion refusée - connect (2) pour le port" 127.0.0.1 "9515) (Errno :: ECONNREFUSED) ...

14
tim_xyz 16 nov. 2017 à 01:40

4 réponses

Meilleure réponse

Ceci est possible sur Heroku.


Confus chrome et chromedriver

Votre configuration mélange chromedriver et Chrome . GOOGLE_CHROME_SHIM pointe vers l'exécutable Chrome google-chrome-stable et non vers chromedriver . La ligne ci-dessous entraîne Selenium exécutant le mauvais binaire, ce qui entraîne un message d'erreur trompeur.

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

Au moment d'écrire ceci (janvier 18), le pack de compilation chromedriver ajoute automatiquement /app/.chromedriver/bin à la variable $PATH. Si vous supprimez la ligne ci-dessus, Selenium devrait à nouveau être en mesure de trouver chromedriver automatiquement.

Et alors?

Vous avez probablement ajouté la ligne ci-dessus pour corriger Selenium ne pouvant 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 le binaire Chrome

Vous pouvez résoudre ce problème en indiquant à Selenium où se trouve le 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 compilation standards chrome et chromedriver:

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

Vous aurez peut-être besoin de heroku-buildpack-xvfb-google-chrome au lieu de vanilla chrome si vous automatisez les clics dans le navigateur, mais cela ne devrait pas être nécessaire uniquement pour faire fonctionner le chrome sans tête.

2
laverick 15 févr. 2019 à 11:29

Cela a fonctionné pour moi. J'ai remplacé la ligne ci-dessous:

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

Pour ça:

Selenium::WebDriver::Chrome::Service.driver_path = "/app/.chromedriver/bin/chromedriver"
0
Carlos Peixoto 2 mars 2020 à 13:25

Je cite Ilya Vassilevsky à partir de ce post

ChromeDriver n'est qu'un pilote pour Chrome. Il a besoin du navigateur Chrome installé sur la même machine pour fonctionner.

Heroku n'a pas installé Chrome sur ses 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 il récupère Chrome:

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

Puis 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 n'importe quel navigateur) sur heroku pourrait être plus compliquée.

Réponses de Ilya Vassilevsky

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

Réponses de Petr Gazarov

Merci pour votre réponse Ilya. J'ai fini par réécrire avec Watir avec phantomjs car je ne pouvais pas faire en sorte que Heroku installe Chrome.

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

1
Fabrizio Bertoglio 19 nov. 2017 à 18:01

Je me débat avec celui-ci depuis plus de quelques heures ...

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

J'avais ce morceau de code dans le spec_helper.rb qui causait des problèmes (car si cela aide quelqu'un):

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

Il contournait toute la configuration capybara ...

0
user3432652 30 août 2018 à 12:18
47318564