使用Selenium for Ruby on Rails在Heroku上找不到Chrome二进制文件

时间:2018-07-08 15:48:44

标签: ruby google-chrome selenium heroku capybara

两个星期前,我设法在Heroku上建立了一个工作环境,结合了Capybara,Selenium,Chromedriver和Chrome进行网页抓取。但是,一周前,我必须进行了一些更改,这由于未找到Chrome二进制文件而导致安装程序崩溃。

WARN: Selenium::WebDriver::Error::UnknownError: unknown error: cannot find Chrome binary (Driver info: chromedriver=2.40.565383 (76257d1ab79276b2d53ee976b2c3e3b9f335cde7),platform=Linux 4.4.0-1019-aws x86_64)

我正在使用Heroku-14堆栈上的两个相关的构建包

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

二手宝石:

gem 'selenium-webdriver','>=3.6.0'
gem 'chromedriver-helper'

我花了一个周末试图通过将各种路径直接传递到capybara.rb初始化程序(并通过运行heroku run bash进行比较)来使它起作用,但是无法使其工作。

capybara.rb

require "selenium/webdriver"
chrome_bin = ENV.fetch('GOOGLE_CHROME_SHIM', nil)
    chrome_opts = chrome_bin ? { "chromeOptions" => { "binary" => 'app/.apt/usr/bin/google-chrome-stable' } } : {}
    puts chrome_opts.to_s

    Capybara.register_driver :chrome do |app|
      Capybara::Selenium::Driver.new(
         app,
         browser: :chrome,
         desired_capabilities: Selenium::WebDriver::Remote::Capabilities.chrome(chrome_opts)
      )
    end

    Capybara.default_driver = :chrome
    Capybara.javascript_driver = :chrome

我还通过界面在Heroku中设置了ENV变量,但是当通过heroku运行轨c与ENV进行检查时,似乎BIN变量是从buildpack加载的,并且覆盖了我的配置。

I set GOOGLE_CHROME_BIN and GOOGLE_CHROME_SHIM to: /app/.apt/usr/bin/google-chrome

我不确定必须进行哪些更改才能使其再次正常运行。有很多拼图,我需要修复哪一个?欢迎提出建议!

已解决:

require "selenium/webdriver"

chrome_bin = ENV.fetch('GOOGLE_CHROME_SHIM', nil)

    Capybara.register_driver :chrome do |app|
      browser_options = ::Selenium::WebDriver::Chrome::Options.new
      browser_options.binary = chrome_bin
      Capybara::Selenium::Driver.new(app, browser: :chrome, options: browser_options)
    end

    Capybara.default_driver = :chrome
    Capybara.javascript_driver = :chrome

1 个答案:

答案 0 :(得分:4)

我猜您在过去几周内已升级到最新的selenium-webdriver和chromedriver。 chromeOptions不再是有效的密钥,您可以尝试将其更改为goog:chromeOptions,但实际上您应该只使用Selenium::WebDriver::Chrome::Options类的实例

Capybara.register_driver :chrome do |app|
  options = ::Selenium::WebDriver::Chrome::Options.new
  options.binary = ...
  Capybara::Selenium::Driver.new(app, browser: :chrome, options: browser_options)
end