前提
ruby on rails6
selenium
heroku
やりたいこと
selenium web driverを使いheroku上でchromeを起動し自分が仕事で使っているツールをスクレイピング+自動化したいです。
seleniumでクリック等を行う処理は30秒超過するので、worker dyno + sidekiq + active jobを使い実行部分を非同期で呼び出しております。
ローカルで立ち上げている際は上手く起動しており、(ローカルではheadlessではなく普通にブラウザが起動します)
seleniumのスクレイピングコードそのものは問題ないと考えております。
問題点
WARN: Selenium::WebDriver::Error::UnknownError: unknown error: Chrome failed to start: crashed. (The process started from chrome location /app/.apt/usr/bin/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
及び
Selenium::WebDriver::Error::SessionNotCreatedError (session not created
というエラーが出てしまい、google chromeがクラッシュした状態となってしまいます。
該当コードは下で記載しておりますが、恐らく
Selenium::WebDriver::Chrome.path = ENV.fetch('GOOGLE_CHROME_BIN', nil) ```の箇所がネックになっていると考えております。 [こちらのqiita記事](https://qiita.com/ToshioAkaneya/items/954694abc62eb70d33ed)を参考に ```ここに言語を入力 heroku buildpacks:add https://github.com/heroku/heroku-buildpack-google-chrome heroku buildpacks:add https://github.com/heroku/heroku-buildpack-chromedriver heroku config:set GOOGLE_CHROME_BIN=/app/.apt/opt/google/chrome/chrome heroku config:set GOOGLE_CHROME_SHIM=/app/.apt/opt/google/chrome/chrome
という形でchromeとdriverをherokuにインストールし、環境変数にそのパスを通しているのですが
この環境変数のパスが怪しいと感じており、インストールしたchromeとdriverを読み込めていないのかと考えているのですが、パスの確かめ方が分からないのと、またそもそもrubyのコードないで環境変数の読み込み方も間違ってるのではないかと考えています。
以下はselenium webdriverを呼び出している箇所です。
def login(name, password) Selenium::WebDriver.logger.output = File.join("./", "selenium.log") Selenium::WebDriver.logger.level = :warn if Rails.env.production? Selenium::WebDriver::Chrome.path = ENV.fetch('GOOGLE_CHROME_BIN', nil) @driver = Selenium::WebDriver.for :chrome, options: headless_chrome_options elsif Rails.env.development? @driver = Selenium::WebDriver.for :chrome end @driver.manage.timeouts.implicit_wait = 20 @driver.navigate.to'https://tools' @driver.find_element(:name, 'name').send_keys(name) @driver.find_element(:name, 'password').send_keys(password) sleep 1 @driver.find_element(:name, 'password').send_keys(:return) end private def headless_chrome_options options = Selenium::WebDriver::Chrome::Options.new( prefs: { 'profile.default_content_setting_values.notifications': 2 }, binary: ENV.fetch('GOOGLE_CHROME_SHIM', nil) ) options.add_argument('--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36') options.add_argument('--headless') options.add_argument('--no-sandbox') options.add_argument('--disable-gpu') options.binary = '/app/.apt/usr/bin/google-chrome' options end
if文でdev環境では通常webdriverを呼び出しブラウザで立ち上げており、prod環境ではheadlessで立ち上げる様に書いてあります。
headless chromeをheroku上で使うといった記事はそこそこネットに数が落ちているのですが、
人によって実装がまちまちなので何が正解かが全くわかっていない状態です。
またuseragentは直接記載している形としております。
なぜchromeがcrashしてしまっているのでしょうか。
お力をいただけると幸いです。よろしくお願いします。
あなたの回答
tips
プレビュー