Playwright允许收听网页上发生的各种类型的事件,例如网络请求,创建子页面,专用工作人员等。有几种方法可以订阅此类事件,例如等待事件或添加或删除事件侦听器。
等待事件
大多数情况下,脚本需要等待特定事件的发生。下面是一些典型的事件等待模式。
等待request
使用 page.expect_request() 等待具有指定 url 的请求
```py
with page.expect_request(\"http://example.com/resource\") as first:
page.get_by_text(\"trigger request\").click()
first_request = first.value
# or with a lambda
with page.expect_request(lambda request: request.url == \"http://example.com\" and request.method == \"get\") as second:
page.get_by_text(\"trigger request\").click()
second_request = second.value
```
点击元素,预期request的url是某个url
等待弹出窗口
with page.expect_popup() as popup:
page.get_by_text("open the popup").click()
popup.value.goto("https://wikipedia.org")
添加/删除事件侦听器
有时,事件是随机发生的,而不是等待它们,而是需要处理它们。剧作家支持传统的语言机制来订阅和取消订阅事件:
def print_request_sent(request):
print("Request sent: " + request.url)
def print_request_finished(request):
print("Request finished: " + 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 sent: " + request.url)
def print_request_finished(request):
print("Request finished: " + request.url)
page.on("request", print_request_sent)
page.on("requestfinished", print_request_finished)
page.goto("http://www.baidu.com")
可以看到监听到了发出请求和请求完成。
示例:
from playwright.sync_api import Playwright, sync_playwright
def main(playwright: Playwright) -> None:
# 启动浏览器和页面
browser = playwright.chromium.launch()
page = browser.new_page()
# 监听新页面打开事件
def on_page(page):
print(f"A new page was opened: {page.url}")
page.close()
page.on("popup", on_page)
# 打开新页面并等待
page.goto("https://example.com")
page.click("a[target='_blank']")
page.wait_for_selector("#newpage")
# 关闭浏览器
browser.close()
with sync_playwright() as playwright:
main(playwright)
在上面的例子中,使用了playwright的chromium驱动程序启动了浏览器,并创建了一个新页面。然后,使用page.on来监听新页面打开事件。当新页面被打开时,on_page函数会被调用,并输出新页面的URL。最后,我们在页面上单击一个链接,等待新页面打开并关闭浏览器。
一次性监听特定事件
page.once可以用于监听一次事件,当事件被触发时,执行回调函数并自动注销事件监听器。
once函数第一个参数为event,第二个参数为一个回调函数。
def once(self, event: str, f: typing.Callable[..., None]) -> None: return super().once(event=event, f=f)
page.once("dialog", lambda dialog: dialog.accept("2021"))
page.evaluate("prompt('Enter a number:')")
示例:
from playwright.sync_api import Playwright, sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
def on_load():
print(page.title())
page.once("load", on_load)
page.goto("https://example.com")
browser.close()
在上述示例代码中,使用了page.once函数来监听页面的load事件,当事件触发时,会执行on_load函数并输出页面的标题。由于使用了page.once函数,因此事件监听器只会在事件被触发一次后自动注销,不会造成内存泄漏问题。