当前位置:   article > 正文

Playwright中page.on事件监听与page.wait_for_等待页面事件

Playwright中page.on事件监听与page.wait_for_等待页面事件

`page.on(event)` 方法是 Playwright 中用于监听特定事件的方法。你可以使用它来注册事件处理程序,以便在页面上触发该事件时执行相应的操作。下面是该方法的基本用法:

  • page.on(event, callback)

- `event`(字符串):要监听的事件名称
- `callback`(可调用对象):事件发生时要执行的函数,也称为事件处理程序

例如,如果你想要在页面加载完成时执行某些操作,可以使用 `page.on('load', callback)` 来监听页面加载完成事件。

以下是一个示例,演示如何在页面加载完成时打印消息:

  1. from playwright.sync_api import sync_playwright
  2. def on_load():
  3. print("页面加载完成!")
  4. with sync_playwright() as p:
  5. browser = p.chromium.launch()
  6. page = browser.new_page()
  7. # 监听页面加载完成事件
  8. page.on('load', on_load)
  9. # 导航到页面
  10. page.goto('https://example.com')
  11. # 关闭浏览器
  12. browser.close()

示例中使用 `page.on('load', on_load)` 方法来监听页面加载完成事件,并在加载完成时执行 `on_load` 函数,打印出 "页面加载完成!"。

*******************

page.on(event) 方法中的 event 参数指定要监听的事件名称。这个事件名称可以是页面对象支持的各种事件之一。

以下是 Playwright 中页面对象支持的各种事件名称及其含义:

- `"close"`:页面关闭事件。
- `"console"`:页面上发生控制台日志事件。
- `"crash"`:页面崩溃事件。
- `"dialog"`:页面弹出对话框事件。
- `"domcontentloaded"`:DOM 内容加载完成事件。
- `"download"`:页面上触发下载事件。
- `"filechooser"`:页面弹出文件选择对话框事件。
- `"frameattached"`:子框架附加到页面事件。
- `"framedetached"`:子框架从页面分离事件。
- `"framenavigated"`:子框架导航事件。
- `"load"`:页面加载完成事件。
- `"pageerror"`:页面上发生错误事件。
- `"popup"`:页面弹出弹出窗口事件。
- `"request"`:页面发出网络请求事件。
- `"requestfailed"`:页面上的请求失败事件。
- `"requestfinished"`:页面上的请求完成事件。
- `"response"`:页面接收到网络响应事件。
- `"websocket"`:页面上发生 WebSocket 事件。
- `"worker"`:页面上发生 Worker 事件。

你可以根据需要在 `page.on(event, callback)` 方法中选择相应的事件名称,并注册相应的事件处理程序。
------------------------------------
# 这段代码是一个使用 Playwright for Python 进行自动化测试的示例。它展示了如何使用 Playwright 来启动浏览器、导航到网页、执行 JavaScript 代码、捕获页面截图、等待页面加载、点击页面元素并处理下载内容。以下是代码中的一些关键点:
# 使用 page.on("download", handle_download) 方法监听下载事件,并将下载的文件对象存储在 downloads 列表中。
# 通过 page.goto("https://www.sublimetext.com/download") 导航到网页。
# 使用 page.evaluate() 方法执行 JavaScript 代码,获取并打印页面的标题。
# 使用 page.screenshot() 方法对页面进行截图,并保存为 "screenshot.png"。
# 使用 page.once("load", lambda: print("page loaded!")) 监听页面加载完成事件。
# 使用 page.wait_for_load_state("load") 等待页面完全加载。
# 使用 download_link_locator.click(timeout=60000) 点击下载链接,并设置超时时间为 60000 毫秒。
# 最后,等待所有下载完成,并打印每个下载文件的路径。
# 这段代码演示了如何利用 Playwright 的各种功能来模拟用户在浏览器中的操作,以及如何处理页面加载、下载等事件。

  1. import asyncio
  2. from playwright.async_api import async_playwright
  3. downloads = []
  4. async def handle_download(download):
  5. print(f"Download started: {download.url}")
  6. downloads.append(download)
  7. async def run(playwright):
  8. browser = await playwright.chromium.launch(headless=False)
  9. context = await browser.new_context(accept_downloads=True) # Enable downloads
  10. page = await context.new_page()
  11. # Listen for download events
  12. page.on("download", handle_download)
  13. # Navigate to URL
  14. await page.goto("https://www.sublimetext.com/download")
  15. # 执行 JavaScript
  16. result = await page.evaluate("() => document.title")
  17. print(f"Page title: {result}")
  18. # 截图页面
  19. await page.screenshot(path="screenshot.png")
  20. page.once("load", lambda: print("page loaded!"))
  21. # Check if the download link has been added to the page
  22. download_link_locator = page.locator('#dl_osx a')
  23. # Wait for the page to load
  24. await page.wait_for_load_state("load")
  25. # Click the element
  26. await download_link_locator.click(timeout=60000)
  27. # Wait for all downloads to complete
  28. for download in downloads:
  29. path = await download.path()
  30. print(f"Downloaded file path: {path}")
  31. await asyncio.sleep(15)
  32. # Close the browser
  33. await browser.close()
  34. async def main():
  35. async with async_playwright() as playwright:
  36. await run(playwright)
  37. asyncio.run(main())
  38. # 这段代码是一个使用 Playwright for Python 进行自动化测试的示例。它展示了如何使用 Playwright 来启动浏览器、导航到网页、执行 JavaScript 代码、捕获页面截图、等待页面加载、点击页面元素并处理下载内容。以下是代码中的一些关键点:
  39. # 使用 page.on("download", handle_download) 方法监听下载事件,并将下载的文件对象存储在 downloads 列表中。
  40. # 通过 page.goto("https://www.sublimetext.com/download") 导航到网页。
  41. # 使用 page.evaluate() 方法执行 JavaScript 代码,获取并打印页面的标题。
  42. # 使用 page.screenshot() 方法对页面进行截图,并保存为 "screenshot.png"。
  43. # 使用 page.once("load", lambda: print("page loaded!")) 监听页面加载完成事件。
  44. # 使用 page.wait_for_load_state("load") 等待页面完全加载。
  45. # 使用 download_link_locator.click(timeout=60000) 点击下载链接,并设置超时时间为 60000 毫秒。
  46. # 最后,等待所有下载完成,并打印每个下载文件的路径。
  47. # 这段代码演示了如何利用 Playwright 的各种功能来模拟用户在浏览器中的操作,以及如何处理页面加载、下载等事件。

------------------------

关于 Playwright for Python 中一些page等待页面事件发生的方法的详细说明。
每个方法的作用和用法。

  1. expect_event:

    • 介绍:该方法是在指定事件触发时执行一个断言函数,并返回事件数据值。在断言函数返回真值时返回,如果页面在事件触发前关闭会抛出错误。
    • 用法:使用 page.expect_event() 方法等待指定事件触发,并执行相应的操作。
    • 参数:
      • event:字符串,表示要等待的事件名称,通常与 *.on(event) 中传递的一致。
      • predicate:可调用函数(可选),接收事件数据,当等待应该解析时返回真值。
      • timeout:浮点数(可选),最长等待时间,默认为 30000 毫秒(30秒)。传入 0 表示禁用超时时间。
    • 返回:EventContextManager 对象。
      1. import asyncio
      2. from playwright.async_api import async_playwright
      3. async def main():
      4. async with async_playwright() as p:
      5. browser = await p.chromium.launch()
      6. page = await browser.new_page()
      7. async with page.expect_event("framenavigated") as event_info:
      8. await page.goto("https://www.example.com")
      9. frame = await event_info.value
      10. print("Frame navigated:", frame)
      11. await browser.close()
      12. asyncio.run(main())
  2. wait_for_event:

    • 介绍:该方法等待指定事件触发,如果提供了断言函数,将事件值传递给断言函数,并等待断言函数返回真值。如果页面在事件触发前关闭会抛出错误。
    • 用法:使用 page.wait_for_event(event) 方法等待特定事件的触发。
    • 参数:event:字符串,表示要等待的事件名称,kwargs 表示其他可选参数。
    • 返回:NoneType 对象。
      expect_event 方法更加灵活,可以直接操作事件值并等待条件函数返回真值,而 wait_for_event 方法则更简洁,适合在不需要直接操作事件值时使用。
  3. wait_for_function:

    • 介绍:该方法在表达式返回真值时返回,并将其解析为真值的 JSHandle。
    • 用法:可以使用该方法来观察视窗大小的变化。
    • 参数:
      • expression:字符串,表示要在浏览器上下文中评估的 JavaScript 表达式。如果表达式求值为函数,则会自动调用该函数。
      • arg:EvaluationArgument(可选),要传递给表达式的可选参数。
      • polling:浮点数或"raf"(可选),如果为'raf',则表达式会在 requestAnimationFrame 回调中不断执行。如果是一个数字,则表示执行该函数的时间间隔(毫秒)。默认为 raf。
      • timeout:浮点数(可选),最长等待时间,默认为 30000 毫秒(30秒)。传入 0 表示禁用超时时间。
    • 返回:JSHandle 对象。
      1. # 创建一个 JavaScript 函数,用于检查页面上某个元素是否存在
      2. check_element_exists = """
      3. () => {
      4. return document.querySelector('.my-element') !== null;
      5. }
      6. """
      7. # 等待页面上的特定元素出现
      8. await page.wait_for_function(check_element_exists)

      在这个示例中,我们定义了一个 JavaScript 函数 check_element_exists,它会检查页面上是否存在类名为 "my-element" 的元素。然后,我们使用 wait_for_function 方法来等待这个函数返回真值,即等待页面上的特定元素出现。
      wait_for_function 是 Playwright for Python 中的一个方法,用于等待在页面上下文中执行指定的函数,并在函数返回真值时继续执行后续代码。这个方法通常用于等待特定的条件或操作完成后再进行下一步操作。
      通过 wait_for_function 方法,可以灵活地等待页面上任意自定义的 JavaScript 函数执行并返回真值,从而实现对页面状态的监测和控制。这个方法在处理复杂页面操作和等待逻辑时非常有用。

  4. wait_for_load_state:

    • 介绍:该方法在页面达到所需的加载状态时返回。
    • 用法:使用 page.wait_for_load_state() 方法等待页面达到所需的加载状态。
    • 参数:
      • state:字符串 "load"|"domcontentloaded"|"networkidle"(可选),要等待的加载状态,默认为 load。如果当前文档已经达到所需状态,则立即解析。可以是 'load'、'domcontentloaded' 或 'networkidle'。
      • timeout:浮点数(可选),最长操作时间(毫秒),默认为 30 秒。传入 0 表示禁用超时时间。
    • 返回:NoneType 对象。

      await page.get_by_role("button").click() # 点击按钮触发导航 await page.wait_for_load_state() # 等待加载完成
  5. wait_for_url:

    • 介绍:该方法等待主框架导航到给定的 URL。
    • 用法:使用 page.wait_for_url() 方法等待主框架导航到特定的 URL。
    • 参数:
      • url:字符串|Pattern|Callable[URL]:bool,匹配导航时等待的 URL 的通配符模式、正则表达式模式或接收 URL 的断言函数。如果参数是一个没有通配符字符的字符串,则方法将等待导航到与字符串完全相等的 URL。
      • timeout:浮点数(可选),最长操作时间(毫秒),默认为 30 秒。传入 0 表示禁用超时时间。
      • wait_until:字符串 "load"|"domcontentloaded"|"networkidle"|"commit"(可选),用于确定操作成功的时间,默认为 load。可以是 'domcontentloaded'、'load'、'networkidle' 或 'commit'。
    • 返回:NoneType 对象。

      await page.click("a.delayed-navigation") # 点击链接将间接导致导航 await page.wait_for_url("**/target.html")
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/277819
推荐阅读
相关标签
  

闽ICP备14008679号