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, который создает менее податливую программу и более сложное кодирование