Python Playwright教程(1):Page页面操作详解
Python + Playwright(1):Page 页面操作[详细介绍]
概述
Playwright 提供了丰富的页面操作功能,通过 page 对象可以实现对网页的导航、元素定位、交互、页面事件监测等操作。
page 对象是 Playwright 中表示页面的核心对象,它允许我们控制和操作浏览器中的页面。
Page常用方法
Page类的常用方法包括的API类别如下:
导航和页面操作API:控制浏览器的导航行为,如
goto
跳转到新页面,reload
重新加载当前页面,go_back
和go_forward
在历史记录中前进和后退。页面元素定位和交互API:提供了
click
、fill
、type
等方法,模拟用户与页面元素的交互,以及locator
用于通过 CSS 选择器、XPath 等定位页面元素。页面内容获取API:通过
content
获取页面的 HTML 内容,title
获取页面标题,screenshot
进行页面截图,以及页面事件和等待API:使用
wait_for_event
等待页面上的特定事件,wait_for_load_state
等待页面加载到特定状态,以及expect_event
期待事件的发生。JavaScript 执行和脚本处理API:
evaluate
在页面上下文中执行 JavaScript 并获取结果,evaluate_handle
执行脚本并返回一个 JSHandle 对象,允许进一步操作。网络请求和拦截处理API:
route
拦截网络请求,unroute
取消拦截,以及request
、response
和websocket
相关的 API 来处理网络交互。期待特定事件或条件发生API:
expect
系列 API 允许等待页面上特定条件的满足,如expect_navigation
、expect_console_message
等。其他操作API:包括设置页面的 HTTP 头、模拟媒体类型、自定义导航和操作超时等,如
set_extra_http_headers
、emulate_media
、set_default_navigation_timeout
。
1. 导航和页面操作API
page.goto(url, **kwargs)
: 导航到指定的 URL。page.go_back()
: 后退到浏览器历史记录中的上一页。page.go_forward()
: 前进到浏览器历史记录中的下一页。page.reload(**kwargs)
: 重新加载当前页面。page.set_content(html, **kwargs)
: 设置页面的 HTML 内容。page.opener()
: 返回新的 Page 实例,表示打开当前页面的页面。page.wait_for_timeout(timeout)
: 暂停执行一段时间。page.bring_to_front()
: 将页面置于浏览器前台。page.set_viewport_size(width, height)
: 设置页面视口大小。page.close()
: 关闭页面。代码示例如下:
2. 页面元素定位和交互API
page.locator(selector)
: 创建一个定位器,用于查找页面元素。page.click(selector, **kwargs)
: 点击页面元素。page.fill(selector, value, **kwargs)
: 向表单元素填充值。page.drag_and_drop(source, target, **kwargs)
: 拖拽元素从源位置到目标位置。page.frame(url=None, name=None)
: 返回新的 Frame 实例。page.frame_locator(selector)
: 使用选择器返回新的 Frame 实例。代码示例如下:
请注意,上述代码中的选择器(如 ‘button’, ‘#inputField’, ‘.draggable’, ‘.target’, ‘iframe’)是示例选择器,需要根据实际页面的元素来替换它们。
3. 页面内容获取API
page.title()
: 获取当前页面的标题。page.content()
: 获取当前页面的 HTML 内容。page.screenshot(**kwargs)
: 对页面进行截图。page.pdf(**kwargs)
: 生成页面的 PDF 版本。代码示例如下:
4. 页面事件和等待API
page.wait_for_load_state(state=None, timeout=None)
: 等待页面加载状态变为指定状态。page.wait_for_url(url, timeout=None)
: 等待 URL 变为指定值。page.wait_for_event(event, predicate=None, timeout=None)
: 等待特定事件发生。page.wait_for_function(page_function, *args, timeout=None, force_expr=False, polling=None)
: 等待函数执行。代码示例如下:
5. JavaScript 执行和脚本处理API
page.evaluate(page_function, *args, force_expr=False)
: 在页面上下文中执行 JavaScript 代码并返回结果。page.evaluate_handle(page_function, *args, force_expr=False)
: 在页面上下文中执行 JavaScript 代码并返回 JSHandle 对象。page.add_init_script(script, **kwargs)
: 添加一个初始化脚本,将在每次新页面加载时执行。page.add_script_tag(url=None, path=None, content=None)
: 向页面添加一个 script 标签,可以是 URL、文件路径或者直接提供脚本内容。page.add_locator_handler(name, script=None, handler=None)
: 添加一个定位器处理程序,允许使用自定义定位器。page.add_style_tag(url=None, path=None, content=None)
: 向页面添加一个 style 标签,可以是 URL、文件路径或者直接提供样式内容。page.expose_binding(name, callback)
: 公开绑定,使得 JavaScript 环境可以调用 Python 中的函数。page.expose_function(name, callback)
: 公开函数,使得 JavaScript 环境可以调用 Python 中的函数。代码示例如下:
from playwright.sync_api import sync_playwright, Playwright
def run(playwright: Playwright) -> None:
browser = playwright.chromium.launch(headless=False)
page = browser.new_page()
page.add_script_tag(content="window.addScriptTagTest = true;") # 向页面添加一个 script 标签
page.add_style_tag(content="body { background-color: #f0f0f0; }") # 向页面添加一个 style 标签
page.add_init_script("console.log('Initialization script loaded');") # 添加一个初始化脚本,将在每次新页面加载时执行
# 公开一个 Python 函数到页面的 JavaScript 环境中
def greet(name):
return f"Hello, {name}!"
page.expose_binding("greet", greet)
# 导航到指定的URL
page.goto("https://example.com")
# 在页面上下文中执行 JavaScript 代码并返回结果
result = page.evaluate("() => document.title")
print(f"页面标题是: {result}")
# 在页面上下文中执行 JavaScript 代码并返回 JSHandle 对象
handle = page.evaluate_handle("() => document.body")
body_content = handle.json_value()
handle.dispose() # 记得释放handle资源
print(f"页面body内容是: {body_content}")
# 使用自定义定位器处理程序
page.add_locator_handler("myCustomSelector", script="return document.querySelector('.my-selector')")
# 然后可以使用自定义的定位器来查找元素
custom_element = page.locator("myCustomSelector")
custom_element.click()
with sync_playwright() as playwright:
run(playwright)
6. 网络请求和拦截处理API
page.route(url, handler)
: 拦截并路由给定 URL 的请求。page.route_from_har(entries)
: 使用 HAR(HTTP 归档文件格式)中的条目设置路由规则。page.unroute(url=None)
: 取消对指定 URL 的请求拦截。page.unroute_all()
: 取消所有请求的拦截。代码示例如下:
from playwright.sync_api import sync_playwright, Playwright
def handle_request(route, request):
# 可以在这里修改请求头、响应等
# 例如,我们打印请求的 URL 并继续路由
print(f"Intercepted request to {request.url}")
route.continue_()
# 如果你想修改响应,可以使用 route.fulfill 方法
# route.fulfill(method="GET", path=request.url, headers={"Content-Type": "text/plain"}, body="Modified response")
def run(playwright: Playwright) -> None:
# 创建浏览器实例,非无头模式
browser = playwright.chromium.launch(headless=False)
# 创建页面实例
page = browser.new_page()
# 拦截特定的 URL 请求
page.route('**', handle_request)
# 导航到指定的URL
page.goto("https://example.com")
# ... 其他操作 ...
# 取消对指定 URL 的请求拦截
# page.unroute('https://example.com')
# 取消所有请求的拦截
# page.unroute_all()
with sync_playwright() as playwright:
run(playwright)
7. 期待特定事件或条件发生API
page.expect_console_message(text=None, predicate=None, timeout=None)
: 期待控制台消息。page.expect_download(**kwargs)
: 期待下载。page.expect_event(event, predicate=None, timeout=None)
: 期待特定事件。page.expect_file_chooser(predicate=None, timeout=None)
: 期待文件选择器。page.expect_popup(**kwargs)
: 期待弹出窗口。page.expect_request(url=None, predicate=None, timeout=None)
: 期待特定请求。page.expect_request_finished(url=None, predicate=None, timeout=None)
: 期待特定请求完成。expect_response(url=None, predicate=None, timeout=None)
: 期待特定响应。page.expect_websocket(url=None, predicate=None, timeout=None)
: 期待 WebSocket 连接。page.expect_worker(url=None, predicate=None, timeout=None)
: 期待工作线程。代码示例如下:
from playwright.sync_api import sync_playwright, Playwright
def run(playwright: Playwright) -> None:
browser = playwright.chromium.launch(headless=False)
page = browser.new_page()
page.goto("https://example.com")
# 期待控制台消息包含特定的文本
page.expect_console_message(lambda message: "Error" in message.text)
# 期待下载开始
download = page.expect_download()
# 期待特定事件发生,例如 'load'
page.expect_event("load")
# 期待文件选择器出现
file_chooser = page.expect_file_chooser()
# 期待弹出窗口
popup = page.expect_popup()
# 期待特定请求
request = page.expect_request("https://example.com/data")
# 期待请求完成
response = page.expect_request_finished()
# 期待特定响应
response = page.expect_response(lambda response: response.status == 200)
# 期待 WebSocket 连接
ws = page.expect_websocket("wss://example.com/ws")
# 期待工作线程
worker = page.expect_worker()
with sync_playwright() as playwright:
run(playwright)
8. 其他操作API
page.set_default_navigation_timeout(timeout)
: 设置默认的页面导航超时时间。page.set_default_timeout(timeout)
: 设置默认的操作超时时间。page.set_extra_http_headers(headers)
: 设置额外的 HTTP 请求头。page.set_content(html, **kwargs)
: 设置页面内容。page.emulate_media(media=None, **kwargs)
: 模拟媒体类型代码示例如下:
from playwright.sync_api import sync_playwright, Playwright
def run(playwright: Playwright) -> None:
browser = playwright.chromium.launch(headless=False)
page = browser.new_page()
# 设置默认的页面导航超时时间为 60 秒
page.set_default_navigation_timeout(60000)
# 设置默认的操作超时时间为 30 秒
page.set_default_timeout(30000)
# 设置额外的 HTTP 请求头,例如自定义 User-Agent
headers = {
"User-Agent": "Playwright Custom User-Agent"
}
page.set_extra_http_headers(headers)
# 导航到指定的URL
page.goto("https://example.com")
# 设置页面内容
page.set_content("<html><body><h1>自定义页面内容</h1></body></html>")
# 模拟媒体类型,例如打印
page.emulate_media(media="print")
with sync_playwright() as playwright:
run(playwright)
作者:blues_C