headless modeというのはブラウザを表示させずに裏方で動作して結果のみを返してくる便利な機能です。Seleniumで作ったスクリプトが通常動作しているならheadlessで結果だけ返ってこいばいいわけです。
headlessにするのに1、2行足すだけ、みたいな説明が多くあるのに実際やってみたらだいぶ悩まされたのでこうやったらうまくいったというところをまとめていきます。
FirefoxかChromeどちらを使うのか
Choromeの方が最新版に対応してて良さそう、というのと今までFirefoxを使っていたので乗り換えてみる。
ChromeはそのままFirefoxで動作していたものをchromeに変えると多少途中でクラッシュしたりはありましたが動作する。
しかしheadless modeで動作させると普通に動作していた部分でクラッシュして止まる。という状態だった。find_elementで要素をclickさせるところでなんのエラーも吐かずに終了。直らないのかと検索を探しまくったがなくて、headless modeは断念しそうになった。
環境でchromeでもしっかり動作する場合もあるんだろうけど、MacとSeleniumという組み合わせだとchromeはよくクラッシュしてよろしくなかった。
ダメ元でFirefoxをheadless modeで試してみる
Seleniumが動作するFirefoxのバージョンは55以前に戻さないと動作しない、という点とFirefoxにheadless modeが搭載されたのが56以降という、バージョンの関係で動作しない例は結構ある。
Firefoxがheadless modeに対応しているか調べるには、下記のコマンドを打つと
/Applications/Firefox.app/Contents/MacOS/firefox -headless
対応していれば *** You are running in headless mode.
対応していなければ Error
Firefox55は対応してなくてErrorでした。それ以上のバージョンになるとSeleniumが動作しない可能性があって上げたくなかったんですが、56をインストールしてみたらheadless対応、でSeleniumの動作は、しました。
最新のFirefox QuantumはSeleniumがまだ対応してないだけなのかもしれません。
Firefox56とSeleniumの組み合わせなら今までずっとFirefox向けのスクリプトを書いてたのでそこにheadless modeを追記するだけで動作するようになりました。
headless modeにしたメリット
定期的に動かす自動化したものを、毎回自動でブラウザが開かれて稼働しているのを表示するのはメモリの消費量も大きく、画面に動作してる状況が出るので煩わしい。
自動化がうまく稼働しているならわざわざみる必要はないので。
通常ブラウザを使うと1GB以上のメモリ使用量になるのに対して、headlessは180MB程度。
ごちゃごちゃした動作が非表示になって静かに開始から終了まで動作する。