事件
介绍
Playwright 允许监听网页上发生的各种类型的事件,例如网络请求、子页面的创建、专用工作线程等。有几种方法可以订阅此类事件,例如等待事件或添加或移除事件监听器。
等待事件
大多数情况下,脚本需要等待特定事件发生。以下是一些典型的事件等待模式。
使用 page.expect_request() 等待指定 URL 的请求:
- 同步
- 异步
with page.expect_request("**/*logo*.png") as first:
page.goto("https://wikipedia.org")
print(first.value.url)
async with page.expect_request("**/*logo*.png") as first:
await page.goto("https://wikipedia.org")
first_request = await first.value
print(first_request.url)
等待弹出窗口:
- 同步
- 异步
with page.expect_popup() as popup:
page.get_by_text("打开弹出窗口").click()
print(popup.value.url)
async with page.expect_popup() as popup:
await page.get_by_text("打开弹出窗口").click()
child_page = await popup.value
await child_page.goto("https://wikipedia.org")
添加/移除事件监听器
有时,事件在随机时间发生,而不是等待它们,需要立即处理。Playwright 支持传统的语言机制来订阅和取消订阅事件:
- 同步
- 异步
def print_request_sent(request):
print("请求已发送: " + request.url)
def print_request_finished(request):
print("请求已完成: " + request.url)
page.on("request", print_request_sent)
page.on("requestfinished", print_request_finished)
page.goto("https://wikipedia.org")
page.remove_listener("requestfinished", print_request_finished)
page.goto("https://www.openstreetmap.org/")
def print_request_sent(request):
print("请求已发送: " + request.url)
def print_request_finished(request):
print("请求已完成: " + request.url)
page.on("request", print_request_sent)
page.on("requestfinished", print_request_finished)
await page.goto("https://wikipedia.org")
page.remove_listener("requestfinished", print_request_finished)
await page.goto("https://www.openstreetmap.org/")
添加一次性监听器
如果某个事件只需要处理一次,有一个便捷的 API 可以实现这一点:
- 同步
- 异步
page.once("dialog", lambda dialog: dialog.accept("2021"))
page.evaluate("prompt('请输入一个数字:')")
page.once("dialog", lambda dialog: dialog.accept("2021"))
await page.evaluate("prompt('请输入一个数字:')")