Techioz Blog

Ruby on Rails の Selenium を使用した Heroku で Chrome バイナリが見つかりません

概要

2 週間前、Capybara、Selenium、Chromedriver、Web スクレイピング用の Chrome を組み合わせて Heroku 上で作業環境を構築することができました。しかし、1 週間前に何かを変更したため、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 スタックで 2 つの関連するビルドパックを使用しています

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 変数がビルドパックからロードされ、設定がオーバーライドされるようです。

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

解決策

ここ数週間で最新の 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