Heroku: не удается подключиться к chromedriver 127.0.0.1:9515 при использовании Watir / Selenium
это выполняется локально (без указания driver_path
), но не на Heroku.
код:
Selenium::WebDriver::Chrome.driver_path = ENV['GOOGLE_CHROME_SHIM']
browser = Watir::Browser.new :chrome
я подтвердил ниже значения в Heroku rails console
ENV['GOOGLE_CHROME_BIN'] => "/app/.apt/opt/google/chrome/chrome"
ENV['GOOGLE_CHROME_SHIM'] => "/app/.apt/usr/bin/google-chrome-stable"
Установленные Buildpacks:
https://github.com/heroku/heroku-buildpack-chromedriver
https://github.com/heroku/heroku-buildpack-google-chrome
Текущая Ошибка:
Selenium:: WebDriver:: ошибка:: WebDriverError: не удается подключиться к chromedriver 127.0.0.1:9515
Поиск unable to connect to chromedriver 127.0.0.1:9515
on SO возвращает кучу результатов, но никто не упоминает heroku.
также:
я рассматривал phantomjs. Кто-то другой заставил его работать здесь., использование безголового браузера с Heroku Rails Unicorn stack
но это устарело. Ниже ошибка при локальном запуске.
поддержка Селена для PhantomJS устарела. Использовать безголовый Вместо этого Chrome / Firefox или HTMLUnit.
Тоже Пробовал:
для прозрачности, я также попробовал следующий.
изменение browser = Watir::Browser.new :chrome
до browser = Watir::Browser.new :chrome, headless: true
хотя я не ожидал, что это сработает.
Также Пробовал:
удаление:
https://github.com/heroku/heroku-buildpack-chromedriver
добавить:
https://github.com/heroku/heroku-buildpack-xvfb-google-chrome
.
добавлять headless
драгоценный камень.
и запуск сценария ниже, приведенного в watir
gem page,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
ошибка:
Selenium:: WebDriver:: ошибка:: UnknownError: неизвестная ошибка: не удается найти Chrome binary
я предполагаю, что это не удалось, потому что я не указал местоположение Chrome binary/shim. Не могу найти, Как указать это при использовании headless
в доктора.
Пробовал За Предложение:
heroku run /usr/bin/chromedriver --app app-name
запуск /usr/bin / chromedriver на app-name... вставай, беги.2151
(хобби) bash: /usr/bin/chromedriver: нет такого файла или каталога
Также см. ниже журналы, которые упоминают chrome
при развертывании в 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
Некоторый Прогресс:
если я ssh в heroku сервер,
heroku run bash --app app-name
и поиск файлов с именем 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
я вижу двоичный файл chromedriver на /app/.chromedriver/bin/chromedriver
.
поэтому я попытался
heroku run /app/.chromedriver/bin/chromedriver --app app-name
результат:
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.
но потом работает heroku run rake selenium_namespace:task_one --app app-name
дает тот же результат.
Selenium:: WebDriver:: ошибка:: WebDriverError: не удается подключиться к chromedriver 127.0.0.1:9515 ... / app / vendor / ruby-2.4.1 / lib / ruby / 2.4.0 / net / http.rb: 906: in ' rescue in блок в connect': не удалось открыть TCP-соединение с 127.0.0.1: 9515 (Соединение отказано-подключение (2) для порта" 127.0.0.1 " 9515) (Errno:: ECONNREFUSED) ...
4 ответов
это возможно на Heroku.
заблуждение chrome
и chromedriver
настройки смешивания chromedriver и Chrome. GOOGLE_CHROME_SHIM
точки Chrome исполняемый файл google-chrome-stable
, а не chromedriver. Строка ниже приводит к селену, выполняющему неправильный двоичный файл, что приводит к вводящему в заблуждение сообщению об ошибке.
Selenium::WebDriver::Chrome.driver_path = ENV['GOOGLE_CHROME_SHIM'] # WRONG!
на момент написания этого (Янв '17) в chromedriver
build pack автоматически добавляет /app/.chromedriver/bin
до $PATH
переменной. Если ты ... --18-->удалить вышеуказанная строка Selenium должна снова быть в состоянии найти chromedriver
автоматически.
а потом?
вы, вероятно, добавили строку выше, чтобы исправить Selenium не в состоянии найти двоичный файл Chrome. Сообщение об ошибке для этого выглядело бы примерно так:
Selenium:: WebDriver:: ошибка:: UnknownError: неизвестная ошибка: не удается находить Chrome binary
вы можете исправить это, сообщив Selenium, где находится двоичный файл Chrome, используя Selenium::WebDriver::Chrome::Options
. Этого должен достичь следующий код.
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
все это должно быть возможно со стандартом chrome
и chromedriver
build packs:
https://github.com/heroku/heroku-buildpack-google-chrome.git
https://github.com/heroku/heroku-buildpack-chromedriver.git
возможно, Вам понадобится heroku-buildpack-xvfb-google-chrome
вместо ванили chrome
Если вы автоматизируете клики в браузере, но это должно не требуется только, чтобы получить безголовый chrome работает.
я цитирую Илья Vassilevsky отсюда в должности
ChromeDriver-это просто драйвер для Chrome. Ему нужен фактический браузер Chrome, установленный на той же машине, чтобы действительно работать.
Heroku не имеет Chrome, установленного на его dynos по умолчанию. Вам нужно использовать buildpack, который устанавливает Chrome. Например:
https://github.com/dwayhs/heroku-buildpack-chrome
вы можно увидеть, как он извлекает Chrome:
https://github.com/dwayhs/heroku-buildpack-chrome/blob/master/bin/compile#L36-38
затем я прочитал их обсуждение в комментариях:
Петр Газаров говорит
Я попробовал этот buildpack, и это не сработало. Я подозреваю, что установка google chrome (или любого браузера) на heroku может быть более вовлечена.
Илья Vassilevsky ответы
да, Heroku - очень самоуверенная и закрытая платформа. Гораздо проще настроить Chrome с ChromeDriver на собственной виртуальной машине на AWS, Linode или DigitalOcean.
Петр Газаров ответы
Спасибо за ваш ответ Илья. Я закончил переписывание с Watir с phantomjs, потому что я не мог заставить Heroku установить Chrome.
вы можете прочитать подробнее в этот вопрос. Если что-то придет мне в голову, я это опубликую.
Я боролся с этим более нескольких часов ....
было очень неприятно пытаться отлаживать Heroku CI. Этот билет очень помог мне найти решение.
У меня был этот кусок кода в spec_helper.rb, который вызывал проблемы (если это кому-то помогает):
config.before(:each, type: :system, js: true) do
driven_by :selenium_chrome_headless
end
он обходил все настройки capybara...
Да, я согласен с Фабрицио. DigitalOcean необходимо использовать. ChromeDriver требует браузера Chrome, который создает менее податливую программу и более сложное кодирование