Aller au contenu

Événements et débogage

Quels événements de page parviennent à votre client d'automatisation, comment récupérer quand même la sortie de la console, et comment vérifier quel backend de rendu dessine réellement la page.

Événements console et erreurs de page

Le moteur ne transmet pas les événements de console ni d’erreur de page aux clients d’automatisation : page.on("console") et page.on("pageerror") ne reçoivent donc rien. C’est voulu — les transmettre est précisément ce que mesure une sonde de détection de l’automatisation. Dans la page, les handlers window.onerror et unhandledrejection se déclenchent normalement : pour capturer la sortie console, collectez-la dans la page et relisez-la avec page.evaluate(). Au lancement, les SDK Python et Node affichent une note à ce sujet (une seule fois).

Deux appels du driver dépendent de ces événements. Dans Playwright, page.setContent() attend un événement de console et finit donc en timeout (dans Puppeteer, il fonctionne) : ouvrez le HTML sous forme d’URL data:, ou écrivez-le dans la page avec page.evaluate(). Dans Playwright comme dans Puppeteer, exposeFunction() et exposeBinding() fonctionnent dans la page ouverte au moment de l’appel, et disparaissent dès que cette page navigue : appelez-les après la dernière navigation, ou faites remonter les résultats avec 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)

Vérifier la cohérence du backend de rendu (checkRenderCoherence)

Une persona peut annoncer un GPU, mais si la page est en réalité rendue par un rasterizer logiciel (SwiftShader / llvmpipe — courant en headless sans GPU), un détecteur strict peut s’en apercevoir. Sondez une page active : la vérification lit le vendor/renderer WebGL (non masqué) que la page voit réellement, signale un repli sur un rasterizer logiciel (un indice headless rédhibitoire — activez le canvas bridge ou lancez en mode headed sur un vrai GPU) ou une paire vendor/renderer incohérente, et renvoie un verdict structuré. Passez le GPU annoncé pour contrôler aussi la famille effectivement rendue. Disponible en synchrone, en asynchrone et en 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()