Heroku の Chrome ドライバーで Selenium を実行します。
概要
私は Linux のセットアップ (および Heroku) に関しては初心者なので、この質問が基本的なものであれば申し訳ありません。
Heroku で Selenium Webkit (Ruby) を実行したいと考えています。スクリプトが Chrome バイナリ ファイルを見つけられないという問題に直面しています。
実際にChromeを単独で動作させることができました。
~ $ chromedriver
Starting ChromeDriver 2.22.397932 (282ed7cf89cf0053b6542e0d0f039d4123bbb6ad) on port 9515
Only local connections are allowed.
chromedriver は、今のところ簡単にするために /app/vendor/bundle/bin/chromedriver からコピーしたファイルです。 chromedriver-helper gemをインストールしたため、chromedriverファイルが存在します。 gem はバイナリ ファイルを Ruby プロセスで利用できるようにするはずでしたが、そうではありませんでした。
また、パスを明示的に設定しようとしました。私の Ruby コードでは Selenium::WebDriver::Chrome.driver_path = ‘chromedriver’ であり、前述のファイルはルート カテゴリにあります。
すべてローカルで完全に動作します (driver_path の有無にかかわらず)
何が原因でしょうか?私は何年も前にこのスレッドを読んだことがありますが、私にとっては時代遅れのようです。アイデアがあれば大歓迎です。
エラートレース:
~ $ ruby bin/run.rb
/app/vendor/bundle/ruby/2.2.0/gems/selenium-webdriver-2.53.4/lib/selenium/webdriver/remote/response.rb:70:in `assert_ok': unknown error: cannot find Chrome binary (Selenium::WebDriver::Error::UnknownError)
(Driver info: chromedriver=2.22.397932 (282ed7cf89cf0053b6542e0d0f039d4123bbb6ad),platform=Linux 3.13.0-91-generic x86_64)
from /app/vendor/bundle/ruby/2.2.0/gems/selenium-webdriver-2.53.4/lib/selenium/webdriver/remote/response.rb:34:in `initialize'
from /app/vendor/bundle/ruby/2.2.0/gems/selenium-webdriver-2.53.4/lib/selenium/webdriver/remote/http/common.rb:78:in `new'
from /app/vendor/bundle/ruby/2.2.0/gems/selenium-webdriver-2.53.4/lib/selenium/webdriver/remote/http/common.rb:78:in `create_response'
from /app/vendor/bundle/ruby/2.2.0/gems/selenium-webdriver-2.53.4/lib/selenium/webdriver/remote/http/default.rb:90:in `request'
from /app/vendor/bundle/ruby/2.2.0/gems/selenium-webdriver-2.53.4/lib/selenium/webdriver/remote/http/common.rb:59:in `call'
from /app/vendor/bundle/ruby/2.2.0/gems/selenium-webdriver-2.53.4/lib/selenium/webdriver/remote/bridge.rb:649:in `raw_execute'
from /app/vendor/bundle/ruby/2.2.0/gems/selenium-webdriver-2.53.4/lib/selenium/webdriver/remote/bridge.rb:123:in `create_session'
from /app/vendor/bundle/ruby/2.2.0/gems/selenium-webdriver-2.53.4/lib/selenium/webdriver/remote/bridge.rb:87:in `initialize'
from /app/vendor/bundle/ruby/2.2.0/gems/selenium-webdriver-2.53.4/lib/selenium/webdriver/chrome/bridge.rb:48:in `initialize'
from /app/vendor/bundle/ruby/2.2.0/gems/selenium-webdriver-2.53.4/lib/selenium/webdriver/common/driver.rb:64:in `new'
from /app/vendor/bundle/ruby/2.2.0/gems/selenium-webdriver-2.53.4/lib/selenium/webdriver/common/driver.rb:64:in `for'
from /app/vendor/bundle/ruby/2.2.0/gems/selenium-webdriver-2.53.4/lib/selenium/webdriver.rb:84:in `for'
from /app/lib/mealpass_orderer.rb:12:in `initialize'
from /app/lib/mealpass_orderer.rb:8:in `new'
from /app/lib/mealpass_orderer.rb:8:in `run'
from bin/run.rb:3:in `<main>'
アップデート:
AWS EC2サーバーでも同じことを試しました(インスタンスを起動し、gitリポジトリを複製し、すべての依存関係をインストールしました)。そこでも同じことが起こります。つまり、ターミナルから chromedriver を実行できますが、スクリプトを実行すると同じエラーが表示されます。
解決策
ChromeDriver は単なる Chrome 用のドライバーです。実際に動作するには、同じマシンに実際の Chrome ブラウザがインストールされている必要があります。
Heroku では、デフォルトでは dyno に Chrome がインストールされていません。 Chrome をインストールするビルドパックを使用する必要があります。例えば:
https://translate.google.com/translate?hl=ja&sl=en&tl=ja&u=https://github.com/dwayhs/heroku-buildpack-chrome
Chrome を取得する方法を確認できます。
https://translate.google.com/translate?hl=ja&sl=en&tl=ja&u=https://github.com/dwayhs/heroku-buildpack-chrome/blob/master/bin/compile#L36-38