modalsoul’s blog

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

Headlessモード時、ChromeDriverでファイルダウンロードに失敗した話

ChromeDriverでファイルダウンロードするSeleniumスクリプトを書いたとき、非Headlessモードでは成功するのに、Headlessモードで失敗した件のメモ

tl;dr

Headlessモードの場合、

  • target=_blankなアンカーをclick()してもファイルダウンロードできない
  • target属性を削除してclick()するとダウンロードできる

前準備

基本は前の記事と同じです

modalsoul.hatenablog.com

当たり前ですが、docker上では非Headlessモードでは動作させられないので注意

スクリプト

コマンドライン引数でHeadlessモードのON/OFFを替えられるようにしています

検証

ex.) 非Headlessモードで動作

python scraping.py

ex.) Headlessモードで動作

python scraping.py --headless=True

非Headlessモードでは、sample_zengin.csvがダウンロードできますが、Headlessモードではダウンロードされません。

対処

↓では、同じくアンカーをclick()することでファイルダウンロードに成功しています

modalsoul.hatenablog.com

この違いは、ダウンロードに失敗したページのアンカーにはtarget=_blankがあったことで

target属性を削除し、アンカーをclickするようにします

変更点は、L.35の追加のみです

これで、Headlessモードでもファイルダウンロードができようになりました


あまり良い例じゃないですが、挙動から原因を切り分けにくくなかなか面倒だったので、覚えておくといいことあるかも