Chrome 59のリリースで、「ヘッドレス」モードは 現在利用可能 LinuxおよびmacOSの安定ビルドで(そしてすぐにWindowsもChrome 60)。これにより、ChromeのUIは表示されず、自動テストのための優れた機能を備えたフル機能バージョンを実行できます。 例を示します。
chrome --headless --disable-gpu --dump-dom https://stackoverflow.com/
JavaScriptテストランナーでは、使用されているブラウザーについて可能な限り多くの情報を記録して、問題を切り分けます。たとえば、現在のブラウザプラグインを含む、navigator
の多くのプロパティを記録します。
JSON.stringify(Array.from(navigator.plugins).map(p => p.name))
["Chrome PDF Viewer","Widevine Content Decryption Module","Shockwave Flash","Native Client","Chrome PDF Viewer"]
私の理解では、Chromeshouldはヘッドレスモードでも同じように動作しますが、新しいものには懐疑的である十分な経験がありますレンダリングパイプラインを大幅に変更する可能性のある機能。
ここでは、両方のモードでテストを実行します。テストランナーに、ヘッドレスモードが使用されているかどうかを記録したいと思います。この情報をテスト構成で渡すこともできますが、テストランナー自体に組み込むことができる純粋なJavaScriptソリューションが必要です。ただし、ヘッドレスモードがアクティブかどうかを示すブラウザーインターフェイスを見つけることができませんでした。
ChromeがJavaScriptからヘッドレスモードで実行されているかどうかを検出する方法はありますか?
確認してもいい - navigator.webdriver
プロパティ:
webdriver
インターフェイスのnavigator
読み取り専用プロパティは、ユーザーエージェントが自動化によって制御されているかどうかを示します。...
navigator.webdriver
プロパティは次の場合にtrueです。Chrome
--enable-automation
または--headless
フラグが使用されます。
Firefoxmarionette.enabled
設定または--marionette
フラグが渡されます。
W3C WebDriverの推奨事項 説明 次のとおり:
navigator.webdriver
連携するユーザーエージェントがWebDriverによって制御されていることをドキュメントに通知する標準的な方法を定義します。たとえば、自動化中に代替コードパスをトリガーできます。
user agent文字列 HeadlessChrome
の代わりにChrome
を含む 。これはおそらくあなたが探すことを意図している信号なので、次のように使用できます:
/\bHeadlessChrome\//.test(navigator.userAgent)
その他の興味深い信号には次のものがあります。
window.chrome
は未定義のようです。[innerWidth, innerHeight]
は[800, 600]
(headless_browser.cc
にハードコードされています)、[outerWidth, outerHeight]
は[0, 0]
(通常は発生しません)です。Antoine Vastelによるこの記事 を読むだけで、いくつかの方法が提供されます。
/HeadlessChrome/.test(window.navigator.userAgent)
を使用してユーザーエージェントをテストしますが、これは簡単になりすますnavigator.plugins.length == 0
を使用したプラグインのテストnavigator.languages == ""
を使用した言語のテスト!Modernizr["hairline"]
です。image.width == 0 && image.height == 0
でimage.onerror
をテストします(これが最も堅牢であることがわかりました)。Googleの動機について話すことができません(Headless ChromeはWebアプリケーションのテストを容易にすることだけですか?うーん... )、しかし、これはいつか修正されるかもしれないバグのリストとして見ることができたので、それらのテストがどれくらい長く機能するか疑問に思う必要があります:)
私がこれまでに持っている最良の解決策は、このハックです。 prodコードでは使用しませんが、テストでは使用します。
Chromeのポップアップブロッカーは通常、すべてのWebサイトで有効になっていますが、ヘッドレスモードでは無効になっています。ヘッドレスモードになるためのかなり正確なプロキシとして、ポップアップを開く機能を使用できます。実装は簡単です。ウィンドウをopen(...)
して、null
オブジェクトの代わりにWindow
(ブロックされたことを示す)を取得するかどうかを確認してください。開いた場合は、できるだけ早く閉じます。
_function canPopUp() {
var w = open("");
if (w !== null) {
w.close();
return true;
} else {
return false;
}
}
var isHeadless = canPopUp;
_
簡単な例として、_--headless
_フラグを使用して、または使用せずに次を試すことができます。
chrome --headless --disable-gpu --dump-dom 'data:text/html,<!doctype html><body><script>document.body.innerHTML = `headless: ${open("") !== null}`;</script>'
navigator.plugins
には、ブラウザ内に存在するプラグインの配列を含める必要があります(Flash、ActiveX、またはJavaアプレット)など。headless
ブラウザの場合、null可能です。
セキュリティチェックの一環として、alert
を使用できます。ヘッドレスの場合は無視されます。
var start = Date.now();
alert('Press OK');
var elapse = Date.now() - start;
if (elapse < 15) {
console.log("headless environment detected");
}
ヘッドレスブラウザーを検出するためのいくつかの手法については、OWASP AppSecUSA 2014トークHeadless Browser Hide&Seek( video 、 slides )by Sergey Shekyan and Bei Zhang。