本文へスキップ

イベントとデバッグ

どのページイベントが自動化クライアントに届くのか、届かないコンソール出力を取得する方法、そしてページを実際に描画しているレンダラーを確認する方法を説明します。

コンソールとページエラーのイベント

エンジンはコンソールやページエラーのイベントを自動化クライアントに転送しないため、page.on("console") と page.on("pageerror") は何も受け取りません。これは意図した設計です。これらのイベントを転送すること自体が、自動化の存在を探るプローブの計測対象だからです。ページ内の window.onerror と unhandledrejection のハンドラーは通常どおり発火するので、コンソール出力を取得したい場合はページ内で収集し、page.evaluate() で読み出してください。Python と Node の SDK は、起動時にこの点について一度だけ注意を表示します。

これらのイベントに依存するドライバーの呼び出しが 2 つあります。Playwright の page.setContent() はコンソールイベントを待つため、タイムアウトします(Puppeteer では動作します)。HTML を data: URL として開くか、page.evaluate() でページに書き込んでください。Playwright と Puppeteer の exposeFunction() と exposeBinding() は、呼び出した時点で開いているページでは動作しますが、そのページが遷移すると消えてしまいます。最後の遷移の後に呼び出すか、page.evaluate() の戻り値として結果を受け取ってください。

from urllib.parse import quote

# Instead of page.set_content(html):
# short HTML: a data: URL (the page gets no origin of its own, so no cookies or storage)
page.goto("data:text/html," + quote(html))
# any HTML: write it into a page you have navigated to; it keeps that page's origin
page.evaluate("html => { document.open(); document.write(html); document.close(); }", html)

レンダリングバックエンドの整合性チェック(checkRenderCoherence)

ペルソナで GPU を名乗っていても、実際にはページがソフトウェアラスタライザー(SwiftShader / llvmpipe。GPU のないヘッドレス環境でよくあります)で描画されていれば、厳格な検出器には見分けられてしまいます。そこで、稼働中のページを調べます。このチェックは、ページから実際に見える(アンマスクされた)WebGL のベンダー/レンダラーを読み取り、ソフトウェアラスタライザーへのフォールバック(ヘッドレスであることを決定的に示す手がかりです。canvas ブリッジを有効にするか、実際の GPU 上で headed モードで実行してください)や、整合しないベンダー/レンダラーの組み合わせを検出して、構造化された判定結果を返します。名乗っている GPU を渡すと、描画された GPU ファミリーの検証も行います。同期版、非同期版、Node 版があります。

from clearcote import launch, check_render_coherence

browser = launch(fingerprint="seed-123")
page = browser.new_page(); page.goto("about:blank")

verdict = check_render_coherence(page)   # {'renderer', 'software_suspected', 'coherent', 'warnings'}
if not verdict["coherent"]:
    print(verdict["warnings"])            # e.g. software rasterizer / incoherent GPU family
browser.close()