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.
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.
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.
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.
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
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) ...
Ceci est possible sur Heroku.
chrome
and chromedriver
name__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 chromedriver
ajoute automatiquement /app/.chromedriver/bin
à la variable $PATH
. Si vous deletela ligne ci-dessus, Selenium devrait à nouveau pouvoir trouver chromedriver
automatiquement.
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"
Tout cela devrait être possible avec les packs de build chrome
et chromedriver
standard:
https://github.com/heroku/heroku-buildpack-google-chrome.git
https://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 chrome
name__, mais cela ne devrait pas être nécessaire pour que not ne fonctionne pas.
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 ...
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.