`page.on(event)` 方法是 Playwright 中用于监听特定事件的方法。你可以使用它来注册事件处理程序,以便在页面上触发该事件时执行相应的操作。下面是该方法的基本用法:
-
page.on(event, callback)
- `event`(字符串):要监听的事件名称。
- `callback`(可调用对象):事件发生时要执行的函数,也称为事件处理程序。
例如,如果你想要在页面加载完成时执行某些操作,可以使用 `page.on('load', callback)` 来监听页面加载完成事件。
以下是一个示例,演示如何在页面加载完成时打印消息:
from playwright.sync_api import sync_playwrightdef on_load():print("页面加载完成!")with sync_playwright() as p:browser = p.chromium.launch()page = browser.new_page()# 监听页面加载完成事件page.on('load', on_load)# 导航到页面page.goto('https://example.com')# 关闭浏览器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 的各种功能来模拟用户在浏览器中的操作,以及如何处理页面加载、下载等事件。
import asyncio
from playwright.async_api import async_playwrightdownloads = []async def handle_download(download):print(f"Download started: {download.url}")downloads.append(download)async def run(playwright):browser = await playwright.chromium.launch(headless=False)context = await browser.new_context(accept_downloads=True) # Enable downloadspage = await context.new_page()# Listen for download eventspage.on("download", handle_download)# Navigate to URLawait page.goto("https://www.sublimetext.com/download")# 执行 JavaScriptresult = await page.evaluate("() => document.title")print(f"Page title: {result}")# 截图页面await page.screenshot(path="screenshot.png")page.once("load", lambda: print("page loaded!"))# Check if the download link has been added to the pagedownload_link_locator = page.locator('#dl_osx a')# Wait for the page to loadawait page.wait_for_load_state("load")# Click the elementawait download_link_locator.click(timeout=60000)# Wait for all downloads to completefor download in downloads:path = await download.path()print(f"Downloaded file path: {path}")await asyncio.sleep(15)# Close the browserawait browser.close()async def main():async with async_playwright() as playwright:await run(playwright)asyncio.run(main())# 这段代码是一个使用 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 的各种功能来模拟用户在浏览器中的操作,以及如何处理页面加载、下载等事件。
------------------------
关于 Playwright for Python 中一些page
等待页面事件发生的方法的详细说明。
每个方法的作用和用法。
-
expect_event:
- 介绍:该方法是在指定事件触发时执行一个断言函数,并返回事件数据值。在断言函数返回真值时返回,如果页面在事件触发前关闭会抛出错误。
- 用法:使用
page.expect_event()
方法等待指定事件触发,并执行相应的操作。 - 参数:
- event:字符串,表示要等待的事件名称,通常与
*.on(event)
中传递的一致。 - predicate:可调用函数(可选),接收事件数据,当等待应该解析时返回真值。
- timeout:浮点数(可选),最长等待时间,默认为 30000 毫秒(30秒)。传入 0 表示禁用超时时间。
- event:字符串,表示要等待的事件名称,通常与
- 返回:EventContextManager 对象。
import asyncio from playwright.async_api import async_playwrightasync def main():async with async_playwright() as p:browser = await p.chromium.launch()page = await browser.new_page()async with page.expect_event("framenavigated") as event_info:await page.goto("https://www.example.com")frame = await event_info.valueprint("Frame navigated:", frame)await browser.close()asyncio.run(main())
-
wait_for_event:
- 介绍:该方法等待指定事件触发,如果提供了断言函数,将事件值传递给断言函数,并等待断言函数返回真值。如果页面在事件触发前关闭会抛出错误。
- 用法:使用
page.wait_for_event(event)
方法等待特定事件的触发。 - 参数:event:字符串,表示要等待的事件名称,kwargs 表示其他可选参数。
- 返回:NoneType 对象。
expect_event
方法更加灵活,可以直接操作事件值并等待条件函数返回真值,而wait_for_event
方法则更简洁,适合在不需要直接操作事件值时使用。
-
wait_for_function:
- 介绍:该方法在表达式返回真值时返回,并将其解析为真值的 JSHandle。
- 用法:可以使用该方法来观察视窗大小的变化。
- 参数:
- expression:字符串,表示要在浏览器上下文中评估的 JavaScript 表达式。如果表达式求值为函数,则会自动调用该函数。
- arg:EvaluationArgument(可选),要传递给表达式的可选参数。
- polling:浮点数或"raf"(可选),如果为'raf',则表达式会在 requestAnimationFrame 回调中不断执行。如果是一个数字,则表示执行该函数的时间间隔(毫秒)。默认为 raf。
- timeout:浮点数(可选),最长等待时间,默认为 30000 毫秒(30秒)。传入 0 表示禁用超时时间。
- 返回:JSHandle 对象。
# 创建一个 JavaScript 函数,用于检查页面上某个元素是否存在 check_element_exists = """ () => {return document.querySelector('.my-element') !== null; } """# 等待页面上的特定元素出现 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 函数执行并返回真值,从而实现对页面状态的监测和控制。这个方法在处理复杂页面操作和等待逻辑时非常有用。
-
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() # 等待加载完成
-
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")