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

问题描述 投票:0回答:2

两周前,我成功在 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 Stack 上使用两个相关的构建包

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 来比较这些路径)来使其工作,但无法使其工作。

水豚.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 run Rails 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
ruby google-chrome selenium heroku capybara
2个回答
6
投票

我猜您在过去几周内升级到了最新的 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

0
投票

我知道这来得有点晚了。但我也遇到了同样的问题,并且刚刚解决了。我快疯了。事实证明 Heroku 并没有真正维护他们的构建包。因此,安装这些构建包:

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

当然还有这两个之后的 Heroku/Ruby 构建包。

繁荣。它会像发条一样工作。 另外非常重要的是,不要忘记在每次请求后或在一定时间后显式退出浏览器,否则它将无限期地产生,将耗尽所有内存,并最终杀死服务器。你可以这样做

session.quit

我想对你来说(无论你在哪里调用新的水豚会话..也许在你的控制器中?)它应该看起来像这样:

 session = Capybara::Session.new(:selenium)
   // your browser actions or logic here

 session.quit
© www.soinside.com 2019 - 2024. All rights reserved.