在 Playwright 中,`Page` 类提供了一系列方法,可以用来与浏览器的一个标签页或 Chromium 的扩展背景页进行交互。一个 `Browser` 实例可能有多个 `Page` 实例。
下面是 `Page` 类的详细解释:
- `Page` 类继承自 `EventEmitter` 类,这意味着它可以发出事件,并且可以添加事件处理器来响应这些事件。例如,你可以添加一个处理器来响应 `load` 事件,这个事件在页面加载完成时发出。
- `Page` 类提供了一系列方法,可以用来与页面进行交互,例如导航到一个 URL、点击一个元素、填充一个输入框、截图等。
下面是一些 `Page` 类的用法示例:
- 创建一个页面,导航到一个 URL,然后保存一个截图:
import asyncio
from playwright.async_api import async_playwright, Playwright
async def run(playwright: Playwright):
webkit = playwright.webkit
browser = await webkit.launch()
context = await browser.new_context()
page = await context.new_page()
await page.goto("https://example.com")
await page.screenshot(path="screenshot.png")
await browser.close()
async def main():
async with async_playwright() as playwright:
await run(playwright)
asyncio.run(main())
- 添加一个处理器来响应 `load` 事件:
page.once("load", lambda: print("page loaded!"))
- 添加一个处理器来响应 `request` 事件,然后在某个时刻取消这个处理器:
def log_request(intercepted_request):
print("a request was made:", intercepted_request.url)
page.on("request", log_request)
# sometime later...
page.remove_listener("request", log_request)
这些示例展示了如何使用 `Page` 类来执行各种操作,并响应各种事件。
以下是 `Page` 类的方法、属性和事件的简单解释:
---Methods---
- `add_init_script`: 添加一个在每个新页面加载时运行的脚本。
- `add_locator_handler`: 添加一个定位器处理器。
- `add_script_tag`: 在页面中添加一个 `script` 标签。
- `add_style_tag`: 在页面中添加一个 `style` 标签。
- `bring_to_front`: 将页面带到前台。
- `close`: 关闭页面。
- `content`: 获取页面的 HTML 内容。
- `drag_and_drop`: 拖动一个元素并将其放置到另一个位置。
- `emulate_media`: 模拟媒体类型或颜色方案。
- `evaluate`: 在页面上执行一个 JavaScript 函数。
- `evaluate_handle`: 获取一个可以在页面上执行 JavaScript 的句柄。
- `expect_console_message`: 等待一个控制台消息。
- `expect_download`: 等待一个下载。
- `expect_event`: 等待一个事件。
- `expect_file_chooser`: 等待一个文件选择器。
- `expect_popup`: 等待一个弹出窗口。
- `expect_request`: 等待一个请求。
- `expect_request_finished`: 等待一个请求完成。
- `expect_response`: 等待一个响应。
- `expect_websocket`: 等待一个 WebSocket。
- `expect_worker`: 等待一个 Worker。
- `expose_binding`: 在页面上公开一个绑定。
- `expose_function`: 在页面上公开一个函数。
- `frame`: 获取一个 `Frame` 对象。
- `frame_locator`: 获取一个 `FrameLocator` 对象。
- `get_by_alt_text`: 获取一个 `alt` 属性包含指定文本的元素。
- `get_by_label`: 获取一个 `label` 属性包含指定文本的元素。
- `get_by_placeholder`: 获取一个 `placeholder` 属性包含指定文本的元素。
- `get_by_role`: 获取一个 `role` 属性包含指定文本的元素。
- `get_by_test_id`: 获取一个 `data-testid` 属性包含指定文本的元素。
- `get_by_text`: 获取一个文本包含指定文本的元素。
- `get_by_title`: 获取一个 `title` 属性包含指定文本的元素。
- `go_back`: 导航回上一个页面。
- `go_forward`: 导航到下一个页面。
- `goto`: 导航到一个 URL。
- `locator`: 获取一个 `Locator` 对象。
- `opener`: 获取打开当前页面的页面。
- `pause`: 暂停执行,直到用户手动恢复。
- `pdf`: 将页面保存为 PDF。
- `reload`: 重新加载页面。
- `route`: 添加一个路由。
- `route_from_har`: 从 HAR 文件添加路由。
- `screenshot`: 截图页面。
- `set_content`: 设置页面的 HTML 内容。
- `set_default_navigation_timeout`: 设置默认的导航超时。
- `set_default_timeout`: 设置默认的超时。
- `set_extra_http_headers`: 设置额外的 HTTP 头。
- `set_viewport_size`: 设置视口大小。
- `title`: 获取页面的标题。
- `unroute`: 移除一个路由。
- `unroute_all`: 移除所有路由。
- `wait_for_event`: 等待一个事件。
- `wait_for_function`: 等待一个函数返回 `true`。
- `wait_for_load_state`: 等待页面达到一个加载状态。
- `wait_for_url`: 等待页面的 URL 匹配一个模式。
---Properties---
- `context`: 获取关联的 `BrowserContext` 对象。
- `frames`: 获取所有的 `Frame` 对象。
- `is_closed`: 检查页面是否已关闭。
- `keyboard`: 获取 `Keyboard` 对象,用于模拟键盘输入。
- `main_frame`: 获取主 `Frame` 对象。
- `mouse`: 获取 `Mouse` 对象,用于模拟鼠标操作。
- `request`: 获取 `Request` 对象。
- `touchscreen`: 获取 `Touchscreen` 对象,用于模拟触摸操作。
- `url`: 获取页面的 URL。
- `video`: 获取 `Video` 对象,用于操作录制的视频。
- `viewport_size`: 获取视口大小。
- `workers`: 获取所有的 `Worker` 对象。
---Events---
- `on("close")`: 当页面关闭时发出。
- `on("console")`: 当控制台有消息时发出。
- `on("crash")`: 当页面崩溃时发出。
- `on("dialog")`: 当出现对话框时发出。
- `on("domcontentloaded")`: 当 DOMContentLoaded 事件触发时发出。
- `on("download")`: 当下载开始时发出。
- `on("filechooser")`: 当出现文件选择器时发出。
- `on("frameattached")`: 当一个框架被附加时发出。
- `on("framedetached")`: 当一个框架被分离时发出。
- `on("framenavigated")`: 当一个框架导航到新的 URL 时发出。
- `on("load")`: 当页面加载完成时发出。
- `on("pageerror")`: 当页面发生错误时发出。
- `on("popup")`: 当出现弹出窗口时发出。
- `on("request")`: 当一个请求开始时发出。
- `on("requestfailed")`: 当一个请求失败时发出。
- `on("requestfinished")`: 当一个请求完成时发出。
- `on("response")`: 当一个响应被接收时发出。
- `on("websocket")`: 当一个 WebSocket 被打开时发出。
- `on("worker")`: 当一个 Worker 被创建时发出。
这些方法、属性和事件使 `Page` 对象能够执行各种操作,包括导航、交互、获取信息等,并能响应各种事件。
----------------------------
以下是一些 `Page` 类的方法、属性和事件的示例:
---Methods---
- `add_init_script`: 添加一个在每个新页面加载时运行的脚本。
await page.add_init_script("console.log('Hello, world!');")
- `goto`: 导航到一个 URL。
await page.goto("https://www.example.com")
- `screenshot`: 截图页面。
await page.screenshot(path="screenshot.png")
- `evaluate`: 在页面上执行一个 JavaScript 函数。
result = await page.evaluate("() => document.title")
---Properties---
- `url`: 获取页面的 URL。
print(page.url)
- `title`: 获取页面的标题。
title = await page.title()
---Events---
- `on("load")`: 当页面加载完成时发出。
page.once("load", lambda: print("Page loaded!"))
- `on("request")`: 当一个请求开始时发出。
def log_request(request):
print(f"Request made: {request.url}")
page.on("request", log_request)
这些示例展示了如何使用 `Page` 类的方法和属性,以及如何添加事件处理器。具体的使用方式取决于你的需求,例如你可能需要导航到不同的 URL、执行不同的 JavaScript 函数、获取不同的属性,或者处理不同的事件。
综合示例: 操作浏览器下载Sublime Text文件
import asyncio
from playwright.async_api import async_playwright
downloads = []
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 downloads
page = await context.new_page()
# Listen for download events
page.on("download", handle_download)
# Navigate to URL
await page.goto("https://www.sublimetext.com/download")
# 执行 JavaScript
result = 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 page
download_link_locator = page.locator('#dl_osx a')
# Wait for the page to load
await page.wait_for_load_state("load")
# Click the element
await download_link_locator.click(timeout=60000)
# Wait for all downloads to complete
for download in downloads:
path = await download.path()
print(f"Downloaded file path: {path}")
await asyncio.sleep(15)
# Close the browser
await browser.close()
async def main():
async with async_playwright() as playwright:
await run(playwright)
asyncio.run(main())