【问题标题】:Heroku: unable to connect to chromedriver 127.0.0.1:9515 when using Watir/SeleniumHeroku:使用 Watir/Selenium 时无法连接到 chromedriver 127.0.0.1:9515
【发布时间】:2018-04-29 08:04:44
【问题描述】:

这在本地运行(未指定 driver_path),但不在 Heroku 上。

代码:

Selenium::WebDriver::Chrome.driver_path = ENV['GOOGLE_CHROME_SHIM']
browser = Watir::Browser.new :chrome

我已经在 heroku rails 控制台中确认了以下值

ENV['GOOGLE_CHROME_BIN'] => "/app/.apt/opt/google/chrome/chrome"
ENV['GOOGLE_CHROME_SHIM'] => "/app/.apt/usr/bin/google-chrome-stable"

已安装的构建包:

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

当前错误:

Selenium::WebDriver::Error::WebDriverError: 无法连接到 chromedriver 127.0.0.1:9515

在 SO 上搜索 unable to connect to chromedriver 127.0.0.1:9515 会返回一堆结果,但没有提及 heroku。


还有:

我考虑过 phantomjs。其他人在这里工作, Using a headless browser with Heroku Rails Unicorn stack

但它已被弃用。在本地运行时出现以下错误。

不推荐使用对 PhantomJS 的 Selenium 支持。使用无头 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 gem。

并运行watir gem 页面中给出的以下脚本,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::Error::UnknownError: 未知错误: 找不到 Chrome 二进制文件

我认为这失败了,因为我没有指定 chrome 二进制文件/垫片的位置。在文档中使用 headless 时找不到如何指定此内容。


根据建议尝试:

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

在 ⬢ app-name... 上运行 /usr/bin/chromedriver... up, run.2151

(爱好)bash: /usr/bin/chromedriver: 没有这样的文件或目录

在部署到 heroku 时,请参阅下面提到 chrome 的日志:

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

我可以在/app/.chromedriver/bin/chromedriver 看到 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::Error::WebDriverError: 无法连接到 铬驱动程序 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': 无法打开到 127.0.0.1:9515 的 TCP 连接 (连接被拒绝 - “127.0.0.1”端口 9515 的连接(2)) (Errno::ECONNREFUSED) ...

【问题讨论】:

  • 运行heroku run /usr/bin/chromedriver时heroku主机的输出是什么,这应该在你的heroku服务器上手动运行chrome驱动程序,可能没有安装一些依赖项。 stackoverflow.com/questions/19978577/…
  • @FabrizioBertoglio 我已根据您的建议更新了问题。听起来是不是缺少依赖项?
  • 我们已经启动并运行它,也许我们的回答对您有同样的帮助stackoverflow.com/a/50781946/135160
  • 在 Ubuntu 上你会做 sudo apt-get install chromium-browser 但我不知道如何用 Heroku 做
  • This 解决方案对我有用

标签: ruby-on-rails heroku selenium-chromedriver watir buildpack


【解决方案1】:

这在 Heroku 上是可能的。


混淆chromechromedriver

您的配置混淆了 chromedriverChromeGOOGLE_CHROME_SHIM 指向 Chrome 可执行文件 google-chrome-stable,而不是 chromedriver。下面的行导致 Selenium 执行错误的二进制文件,从而导致误导性错误消息。

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

在撰写本文时(2018 年 1 月),chromedriver 构建包会自动将 /app/.chromedriver/bin 添加到 $PATH 变量中。如果您删除以上行 Selenium 应该能够再次自动找到chromedriver

然后呢?

您可能添加了上面的行来修复 Selenium 无法找到 Chrome 二进制文件。错误消息可能类似于:

Selenium::WebDriver::Error::UnknownError: 未知错误: 找不到 Chrome 二进制文件

您可以通过使用Selenium::WebDriver::Chrome::Options 告诉 Selenium Chrome 二进制文件的位置来解决此问题。下面的代码应该可以做到这一点。

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"

构建包

使用标准的 chromechromedriver 构建包,这一切都应该是可能的:

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

如果您要在浏览器中自动点击,您可能需要heroku-buildpack-xvfb-google-chrome 而不是原版的chrome,但只是为了让无头 chrome 运行而需要。

【讨论】:

    【解决方案2】:

    我从这个post引用Ilya Vassilevsky

    ChromeDriver 只是 Chrome 的驱动程序。它需要在同一台机器上安装实际的 Chrome 浏览器才能真正工作。

    Heroku 默认没有在其测功机上安装 Chrome。您需要使用安装 Chrome 的 buildpack。例如:

    https://github.com/dwayhs/heroku-buildpack-chrome

    您可以查看它是如何获取 Chrome 的:

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

    然后我在 cmets 中阅读了他们的讨论:

    Petr Gazarov

    我尝试了这个 buildpack,但它不起作用。我怀疑在 heroku 上安装谷歌浏览器(或任何浏览器)可能会涉及更多。

    伊利亚·瓦西列夫斯基回复

    是的,Heroku 是一个非常固执且封闭的平台。在您自己的 AWS、Linode 或 DigitalOcean 上的 VM 上使用 ChromeDriver 设置 Chrome 应该会容易得多。

    Petr Gazarov 回复

    感谢您的回答伊利亚。我最终用 phantomjs 重写了 Watir,因为我无法让 Heroku 安装 Chrome。

    您可以在该问题中阅读更多信息。 如果我想到了什么,我会发布它。

    【讨论】:

    • 希望我不需要数字海洋上的迷你应用来执行此操作。但我同意,鉴于 phantomjs 已被弃用,这可能是唯一的选择。
    • 我遇到了和 OP 一样的问题。将修复作为单独的答案发布。在 Heroku 上绝对可以。
    【解决方案3】:

    这对我有用。我替换了下面的行:

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

    为此:

    Selenium::WebDriver::Chrome::Service.driver_path = "/app/.chromedriver/bin/chromedriver"
    

    【讨论】:

    • Stack Overflow 是一个英文网站。可以用英文回答吗?
    【解决方案4】:

    我已经为此苦苦挣扎了几个多小时......

    尝试在 Heroku CI 上进行调试非常令人沮丧。这张票对我找到解决方案有很大帮助。

    我在 spec_helper.rb 中有一段导致麻烦的代码(如果它对某人有帮助的话):

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

    它绕过了所有的水豚设置...

    【讨论】:

      猜你喜欢
      • 2014-07-16
      • 2018-06-18
      • 2022-01-16
      • 1970-01-01
      • 2019-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-14
      相关资源
      最近更新 更多