💜page.on()
Playwright Page 的事件(v1.52 可能支持的)
以下是 page.on(...) 通常能监听的一些事件:
| 事件名 | 事件参数类型 / 回调收到的对象 | 触发时机 / 说明 |
|---|---|---|
close | Page | 当页面被关闭时触发 (Playwright) |
console | ConsoleMessage | 当页面内部有 console.log / console.error / console.warn 等被调用时触发 (Playwright) |
crash | — | 页面进程崩溃(crash)时触发 (Playwright) |
dialog | Dialog | 当页面弹出对话框(alert / prompt / confirm / beforeunload)时触发 (Playwright) |
filechooser | FileChooser | 当页面尝试使用文件上传(例如点击 <input type="file">)时触发 (Playwright) |
frameattached | Frame | 当某个子 frame 被附加(插入)到页面中时触发 (Playwright) |
framedetached | Frame | 当某个子 frame 从页面中移除时触发 (Playwright 中文网) |
framenavigated | Frame | 当已有的 frame 导航到新的 URL(或重载)时触发 (Playwright 中文网) |
load | — | 当浏览器触发 window.load 事件(所有资源加载完成)时触发 (Playwright) |
domcontentloaded | — | 当 DOMContentLoaded 事件触发时(文档基本结构解析完成)触发 (Playwright) |
pageerror | 错误对象 / JavaScript 异常 | 当页面内部 JavaScript 抛出未捕获异常时触发 (Playwright 中文网) |
popup | Page | 当页面打开新的子页面 / 弹出窗口(window.open 等)时触发 (Playwright 中文网) |
request | Request | 当页面发起网络请求时触发 (Playwright) |
response | Response | 当某个请求收到响应头 / 状态时触发 (Playwright) |
requestfinished | Request | 当请求完成(包括响应体下载完毕)时触发 (Playwright) |
requestfailed | Request | 当请求在中间某环节失败(网络错误、超时等)时触发 (Playwright) |
websocket | WebSocket | 当页面发起 WebSocket 请求 / 连接时触发(如果页面使用 WebSocket) (Playwright 中文网) |
worker | Worker | 当页面创建新的专用 Web Worker (Dedicated Worker)时触发 (Playwright 中文网) |
✅ 注意:这些是
Page对象常见支持的事件,不排除某些事件在 1.52 版本中尚未引入或已做兼容性变动。建议在你安装的版本上通过help(Page)或阅读对应版本文档确认。
每个事件的示例代码
下面是这些事件的使用示例(以同步 API 为例,异步 API 用法类似但加 await):
from playwright.sync_api import sync_playwright
def demo():
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
context = browser.new_context(accept_downloads=True) # 对于 download 事件可能需要 accept_downloads=True
page = context.new_page()
# close
page.on("close", lambda pg: print("页面被关闭"))
# console
def on_console(msg):
print(f"Console: type={msg.type}, text={msg.text}")
page.on("console", on_console)
# crash
page.on("crash", lambda: print("页面崩溃"))
# dialog
def on_dialog(dialog):
print(f"Dialog: {dialog.message}")
dialog.accept() # 或 dismiss()
page.on("dialog", on_dialog)
# filechooser
page.on("filechooser", lambda fc: fc.set_files(["/path/to/file.txt"]))
# frameattached / framedetached / framenavigated
page.on("frameattached", lambda fr: print("frame 附加:", fr.url))
page.on("framedetached", lambda fr: print("frame 分离:", fr.url))
page.on("framenavigated", lambda fr: print("frame 导航至:", fr.url))
# load & domcontentloaded
page.on("load", lambda: print("页面完全加载(load)"))
page.on("domcontentloaded", lambda: print("DOMContentLoaded 触发"))
# pageerror
page.on("pageerror", lambda err: print("页面 JS 错误:", err))
# popup
page.on("popup", lambda new_page: print("弹出窗口打开:", new_page.url))
# 请求 / 响应 / 完成 / 失败
page.on("request", lambda req: print("发起请求:", req.method, req.url))
page.on("response", lambda resp: print("收到响应:", resp.status, resp.url))
page.on("requestfinished", lambda req: print("请求完成:", req.url))
page.on("requestfailed", lambda req: print("请求失败:", req.url, req.failure))
# websocket
page.on("websocket", lambda ws: print("WebSocket 打开:", ws.url))
# worker
page.on("worker", lambda w: print("Worker 启动:", w.url))
# 访问一个测试页面
page.goto("https://example.com")
# 为演示,触发一个 popup
page.evaluate("window.open('https://example.org', '_blank')")
# 等待一段时间以便观察输出
page.wait_for_timeout(3000)
browser.close()
if __name__ == "__main__":
demo()
在异步版(async_playwright)中,你可以把 page.on(...) 放在 await context.new_page() 之后,用 async 回调或普通函数都可以(Playwright 会自动处理回调是协程还是普通函数)。