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) ...
4 réponses
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.
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"
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.
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 ...
De nouvelles questions
ruby-on-rails
Ruby on Rails est un framework d'application web open source à pile complète écrit en Ruby. Il suit le modèle de framework MVC populaire et est connu pour son approche "convention sur configuration" pour le développement d'applications.