这段代码可以在本地运行(不需要指定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支持已被弃用。请改用Headless 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
宝石页面给出的以下脚本,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
Error:
Selenium::WebDriver::Error::UnknownError: 未知错误:无法找到 Chrome 二进制文件
我猜测这个错误是因为我没有指定 Chrome 二进制文件或者 shim 的位置。但是在文档中使用 headless
时没有找到如何指定的方法。
按建议尝试过:
heroku run /usr/bin/chromedriver --app app-name
在 ⬢ 应用名称 上运行 /usr/bin/chromedriver... up, run.2151
(Hobby) 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
我可以看到chromedriver二进制文件位于/app/.chromedriver/bin/chromedriver
。
因此,我尝试运行命令:
heroku run /app/.chromedriver/bin/chromedriver --app 应用程序名称
结果:
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: 无法连接到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': 打开TCP连接到127.0.0.1:9515失败(拒绝连接 - connect(2) for "127.0.0.1" port 9515)(Errno::ECONNREFUSED) ...
heroku run /usr/bin/chromedriver
时,Heroku主机的输出是什么?这应该手动在您的Heroku服务器上运行Chrome驱动程序,可能某些依赖项未安装。https://dev59.com/4GIj5IYBdhLWcg3ws3Ff - Fabrizio Bertoglio