Chuyển đến nội dung

Sự kiện và gỡ lỗi

Những sự kiện trang nào đến được client tự động hóa của bạn, cách vẫn thu thập được output console, và cách kiểm tra renderer nào thực sự vẽ trang.

Sự kiện console và page-error

Engine không chuyển tiếp các sự kiện console hay page-error tới client tự động hóa, nên page.on("console") và page.on("pageerror") sẽ không nhận được gì. Đây là thiết kế có chủ đích — việc chuyển tiếp chúng chính là thứ mà một probe phát hiện automation đo lường. Các handler window.onerror và unhandledrejection trong trang vẫn chạy bình thường, nên để lấy output của console, hãy thu thập nó ngay trong trang rồi đọc lại bằng page.evaluate(). SDK Python và Node sẽ in một thông báo về điều này một lần khi khởi chạy.

Có hai lệnh gọi của driver phụ thuộc vào các sự kiện này. page.setContent() của Playwright chờ một sự kiện console, nên sẽ bị timeout (bản của Puppeteer thì vẫn chạy): hãy mở HTML dưới dạng URL data:, hoặc ghi nó vào trang bằng page.evaluate(). exposeFunction() và exposeBinding(), trong cả Playwright lẫn Puppeteer, hoạt động trong trang đang mở lúc bạn gọi chúng, và sẽ mất khi trang đó điều hướng sang trang khác: hãy gọi chúng sau lần điều hướng cuối cùng, hoặc trả kết quả về từ 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)

Kiểm tra tính nhất quán của backend render (checkRenderCoherence)

Persona có thể khai báo một GPU, nhưng nếu trang thực ra được vẽ bằng một software rasterizer (SwiftShader / llvmpipe — thường gặp khi chạy headless không có GPU) thì một detector khắt khe có thể nhận ra. Hãy kiểm tra trên một trang đang chạy: hàm này đọc vendor/renderer WebGL (unmasked) mà trang thực sự thấy, gắn cờ trường hợp fallback sang software rasterizer (một dấu hiệu lộ headless chí mạng — hãy bật canvas bridge hoặc chạy headed trên GPU thật) hoặc một cặp vendor/renderer không nhất quán, rồi trả về một kết luận có cấu trúc. Truyền vào GPU mà persona khai báo để kiểm tra thêm cả dòng GPU thực sự render trang. Dùng được ở API sync, async và trong 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()