最强自动化测试框架Playwright(19)- 事件

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函数,因此事件监听器只会在事件被触发一次后自动注销,不会造成内存泄漏问题。 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值