【Python】ChromeDriverのエラーまとめ【selenium】

Python プログラミング

こんにちは、はるです。

centOS8でChromeDriverのエラーと戦い、解決したのでまとめていきます。 

結論を言ってしまうと、オプションを追加します。
なので、事前にオプションをインポートしておきます。

from selenium.webdriver.chrome.options import Options
options = Options()

動作環境

  • さくらのVPS CentOS8
  • Python 3.8.3

記事の内容

  • ChromeDriverのエラーまとめ
  • 追加したコード

記事の内容

ChromeDriverのエラーまとめ

私が戦ったエラーは以下の2つです。

selenium.common.exceptions.WebDriverException: Message: unknown error: Chrome failed to start: exited abnormally.
selenium.common.exceptions.WebDriverException: Message: unknown error: no chrome binary at /opt/scripts/google-chrome

ちなみに、どちらのエラーにも以下のエラーも発生していました。

  (The process started from chrome location /usr/bin/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
「プロセスはもう実行されていないので、ChromeDriverはChromeがクラッシュしたとみなしています」

unknown error: Chrome failed to start: exited abnormally.

日本語訳すると、
「不明なエラーです。Chromeの起動に失敗しました。異常終了。」

調べまくったところ、オプションの
options.add_argument('--headless')

options.add_argument("--no-sandbox")
を追加すれば大丈夫みたいでした。

参考

AWS Lambda(Python3)でSelenium + Chrome Headless + でwebスクレイピングする

options.add_argument('--headless')
options.add_argument("--no-sandbox")
head を haed と間違えないようにしましょう。
私はこのスペルミスで、30分ほど時間を失いました笑

unknown error: Chrome failed to start: exited abnormally.と同時に
(chrome not reachable) 
または
(unknown error: DevToolsActivePort file doesn't exist)
が出てくると思います。

その場合は、以下のようにどちらかを追加すればOK。

  • (chrome not reachable) → --no-sandboxを追加
  • (unknown error: DevToolsActivePort file doesn't exist) → --headlessを追加

unknown error: no chrome binary at /opt/scripts/google-chrome

日本語訳すると、
「不明なエラーです。/opt/scripts/google-chrome にクロームのバイナリがありません。」

バイナリがないとのことなので、インポートします。

import chromedriver_binary 

 
次にオプションで、googlechromeの場所を指定してあげます。
which google-chromeとコマンドを打つと、プログラムの実行パスが出てきます。

/usr/bin/google-chrome

それを、binary_locationとして指定します。

options.binary_location = '/usr/bin/google-chrome'

2021/4/12 追記

options.binary_locationは、無くても動きました。
import chromedriver_binaryとなっていれば、大丈夫そうです。
 

その他のオプションについて

以下のオプションを追加しても効果はありませんでした。

# options.add_argument('--disable-dev-shm-usage')
# options.add_argument('--user-data-dir=user')
# options.add_argument('--profile-directory=profile')
# options.add_argument('--single-process')
# options.add_argument('--disable-application-cache')
# options.add_argument('--ignore-certificate-errors')
# options.add_argument('--start-maximized')

追加したコード

今回追加したコードをまとめます。

from selenium.webdriver.chrome.options import Options

options = Options()
#追記のとおり、options.binary_locationは不要でした。
#options.binary_location = '/usr/bin/google-chrome'
options.add_argument('--headless')
options.add_argument("--no-sandbox")
#Google検索をする

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
import chromedriver_binary

options = Options()
options.add_argument('--headless')
options.add_argument("--no-sandbox")

print('before')
driver = webdriver.Chrome(chrome_options=options)
print('after')
driver.get('https://www.google.co.jp/')

assert 'Google' in driver.title

input_element = driver.find_element_by_name('q')
input_element.send_keys('Python')
input_element.send_keys(Keys.RETURN)

assert 'Python' in driver.title

driver.save_screenshot('search_results.png')

for h3 in driver.find_elements_by_css_selector('a > h3'):
  a = h3.find_element_by_xpath('..')
  print(h3.text)
  print(a.get_attribute('href'))

driver.quit()

以上、参考になれば幸いです。
ご覧いただきありがとうございました。

関連

pythonのwebスクレイピングで得た値をLINEに通知する方法
PythonでWordPressに自動ログインする方法を解説
CentOSでChromeDriver、GoogleChrome、Seleniumを使う方法を解説