Puppeteerでブラウザがヘッドレスモードかどうかを判断する


Puppeteerでは下記のようにpuppeteer.launch()のオプションでChromiumをヘッドレスモードで起動するか非ヘッドレスモードで起動するか切り替えることができます。

const puppeteer = require('puppeteer');

// 非ヘッドレスモードで起動、デフォルトはヘッドレスモード
const browser = await puppeteer.launch({headless: false});

ところで、Puppeteerの処理中でブラウザがヘッドレスモードかどうか判定するにはどうすればいいのでしょうか。

puppeteer.launch() に与えたオプションを調べるというのが真っ先に思いつく手ですが、実はヘッドレスモードかどうかを変更する手段は複数あります(例:Chromiumのコマンドラインオプションに--headlessを追加する)。すべての可能性を網羅したコードを書くのは大変ですし、今後Puppeteerのバージョンアップで動かなくなってしまうかもしれません。

解:page.evaluate()でヘッドレスモードかどうか確認する

ブラウザのモードについてはブラウザに問い合わせるのが正攻法のような気がします。

そこで、私は次のようにpage.evaluate()でブラウザ上でJavaScriptを実行してヘッドレスモードかどうかを判断するようにしました。

const page = await browser.newPage();
const isHeadless = await page.evaluate('!window.chrome');

window.chromeはChrome拡張のためのオブジェクトらしいのですが、これがヘッドレスモードでは定義されないことを利用しています。

将来的にChromeの実装が変わって使えなくなるかもしれませんが、少なくともPuppeteer 1.19.0+Chromium 77.0.3844.0ではうまく動いているようです。

参考URL