跳到主要内容

💜page.on()


Playwright Page 的事件(v1.52 可能支持的)

以下是 page.on(...) 通常能监听的一些事件:

事件名事件参数类型 / 回调收到的对象触发时机 / 说明
closePage当页面被关闭时触发 (Playwright)
consoleConsoleMessage当页面内部有 console.log / console.error / console.warn 等被调用时触发 (Playwright)
crash页面进程崩溃(crash)时触发 (Playwright)
dialogDialog当页面弹出对话框(alert / prompt / confirm / beforeunload)时触发 (Playwright)
filechooserFileChooser当页面尝试使用文件上传(例如点击 <input type="file">)时触发 (Playwright)
frameattachedFrame当某个子 frame 被附加(插入)到页面中时触发 (Playwright)
framedetachedFrame当某个子 frame 从页面中移除时触发 (Playwright 中文网)
framenavigatedFrame当已有的 frame 导航到新的 URL(或重载)时触发 (Playwright 中文网)
load当浏览器触发 window.load 事件(所有资源加载完成)时触发 (Playwright)
domcontentloaded当 DOMContentLoaded 事件触发时(文档基本结构解析完成)触发 (Playwright)
pageerror错误对象 / JavaScript 异常当页面内部 JavaScript 抛出未捕获异常时触发 (Playwright 中文网)
popupPage当页面打开新的子页面 / 弹出窗口(window.open 等)时触发 (Playwright 中文网)
requestRequest当页面发起网络请求时触发 (Playwright)
responseResponse当某个请求收到响应头 / 状态时触发 (Playwright)
requestfinishedRequest当请求完成(包括响应体下载完毕)时触发 (Playwright)
requestfailedRequest当请求在中间某环节失败(网络错误、超时等)时触发 (Playwright)
websocketWebSocket当页面发起 WebSocket 请求 / 连接时触发(如果页面使用 WebSocket) (Playwright 中文网)
workerWorker当页面创建新的专用 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 会自动处理回调是协程还是普通函数)。