modalsoul’s blog

これは“失敗”と呼べるかもしれないが、ぼくは“学習体験”と呼びたい

HeadlessモードのChromeDriverでファイルダウンロードに失敗する現象のトラブルシューティング

ファイルのダウンロードをするSeleniumスクリプトを、docker上でheadlessモードのChromeDriverで動作させた際、ファイルのダウンロード処理に失敗する現象が起きたので、その対処方法のメモ書き

前準備

基本的なところは前回と同じ modalsoul.hatenablog.com

ファイルのダウンロードをする処理を追加しています(と言っても、anchorをクリックするだけですが

ダウンロード先ディレクトリを掘って

> make scraping
> docker-compose run scraping /bin/sh
> python scraping.py

のような感じで実行できます

現象その1

headlessモードで動作させると、ファイルのダウンロードがされない

  • スクリプトが正常終了しても、保存先パスにファイルが存在しない
  • dockerではなくローカルのmacで非headlessモードで実行すると成功する

対処

ggってこれを見つけました

python - Downloading with chrome headless and selenium - Stack Overflow

セキュリティの制約?で失敗しているようで、chromedriverのコマンドにPage.setDownloadBehaviorを追加する必要があるようです

スクリプトを以下のように変更しました

これを実行すると、今度は別のエラーが

現象その2

selenium.common.exceptions.WebDriverExceptionで失敗する

/opt/app/scraping # python scraping.py
Traceback (most recent call last):
  File "scraping.py", line 33, in <module>
    main()
  File "scraping.py", line 23, in main
    enable_download_in_headless_chrome(driver, DOWNLOAD_PATH)
  File "scraping.py", line 11, in enable_download_in_headless_chrome
    driver.execute("send_command", params)
  File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: unknown error: unhandled inspector error: {"code":-32601,"message":"'Page.setDownloadBehavior' wasn't found"}
  (Session info: headless chrome=61.0.3163.100)
  (Driver info: chromedriver=2.30 (30087a73289cd80b9611f658ed81448badaf549e),platform=Linux 4.9.93-linuxkit-aufs x86_64)

原因

Chromedriverのバージョンが古いために、Page.setDownloadBefaviorに対応していなかったようです

この時点でのChromedriverのバージョンは

/opt/app/scraping # chromedriver -v
ChromeDriver 2.30 (30087a73289cd80b9611f658ed81448badaf549e)

対処

alpine3.8を使います

これで2.38がインストールできました

/opt/app/scraping # chromedriver -v
ChromeDriver 2.38 (f91d32489882be7df38da3422a19713bfd113fa5)

スクリプトを実行し、無事ファイルのダウンロードが確認できました


これ以外にもいくつかエラーに遭遇したので、また別にまとめようと思います