selenium-webdriverのヘッドレスモードでファイルをダウンロードする方法 with Node.js(TypeScript)@2021/10/5
ChromeやEdgeの場合、基本的にはこれでいいです。
そちらは、selenium-webdriverの4.0.0-alpha.7だと書いてますが、私の環境の4.0.0-rc.1でもOKだということです(あ、先週金曜にrc2も出てますね。未確認ですが)。Chromeは94です。
ちなみに、Firefoxではそのような特別な対処は不要です。GUIあり版と同じ実装で行けます(あ、もちろん、ChromeやEdgeとは違う実装ですよ)。
注意点
ただ、1点だけ注意点があります。「全部の処理が終わったら、ブラウザを閉じる」という実装にしてる場合、ダウンロード処理が完全終了するのを待ってくれないので、ダウンロードは完了しません。動作確認用の「ダウンロードして、終わり」という実装だと、そうなりえますね。
ヘッドレス版だと、ブラウザを最後に閉じないと、プロセスがたまっていってしまうので、最後は閉じるように書いてる人は多いと思います。そこ、ハマりポイントですね。ちなみに、GUIあり版だと、プロセスがたまってれば見ればわかるので、自分で手動で閉じればいいので、必ずしも最後に閉じるように書く必要はないですね。最後の状況を目視で確認したいこともありますし。。
回避策
ダウンロードが発生するボタンをクリックした後、5秒ぐらい待てばいいです。もしくは、よりいいのは、ダウンロード先のフォルダの中を確認して、ファイルが1件(ダウンロード時にできる一時ファイルでないもの)が増えるまで最大待機秒数まで待機するような処理を作るのがいいです。もしくは、事前にダウンロードするファイルの名前が分かっているのであれば、そのファイルが出現するまで待つ、という感じです。
補足
上のページでは「Page.setDownloadBehavior」は非推奨になってると書いてますが、今、現在(4.0.0-rc.1)でも使えるには使えます。
まぁ、Seleniumとか使わず、axiosとか使って、WebAPI経由とかで直接落とせるなら、そちらのほうが安定感はありそうですね。私の場合、WebAPIはあるんですが、諸事情で(サイト側のバグ?考慮漏れ?)で、私の会社からはWebAPI経由ではダウンロードできないので、やむなくSeleniumでやってます。ダウンロード以外では欲しい情報は全部WebAPIで落とせてます。
というわけで、もうちょっと複雑なことをするついでがあって、ダウンロードもSeleniumで、というのなら通常の所だと思います。
以上です。