Page
- extends: EventEmitter
Page 提供与 Browser 中的单个选项卡或 Chromium 中的 extension background page 交互的方法。一个 Browser 实例可能有多个 Page 实例。
下面的示例创建一个 page,导航到一个 URL,然后保存截图:
- Sync
- Async
from playwright.sync_api import sync_playwright
def run(playwright):
webkit = playwright.webkit
browser = webkit.launch()
context = browser.new_context()
page = context.new_page()
page.goto("https://example.com")
page.screenshot(path="screenshot.png")
browser.close()
with sync_playwright() as playwright:
run(playwright)
import asyncio
from playwright.async_api import async_playwright
async def run(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())
Page 类发出各种事件(如下所述),可以使用任何 Node 的原生 EventEmitter 方法处理,例如 on、once 或 removeListener。
此示例记录单个页面 load 事件的消息:
page.once("load", lambda: print("page loaded!"))
要取消订阅事件,请使用 removeListener 方法:
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.on("close")
- page.on("console")
- page.on("crash")
- page.on("dialog")
- page.on("domcontentloaded")
- page.on("download")
- page.on("filechooser")
- page.on("frameattached")
- page.on("framedetached")
- page.on("framenavigated")
- page.on("load")
- page.on("pageerror")
- page.on("popup")
- page.on("request")
- page.on("requestfailed")
- page.on("requestfinished")
- page.on("response")
- page.on("websocket")
- page.on("worker")
- page.accessibility
- page.add_init_script(**kwargs)
- page.add_script_tag(**kwargs)
- page.add_style_tag(**kwargs)
- page.bring_to_front()
- page.check(selector, **kwargs)
- page.click(selector, **kwargs)
- page.close(**kwargs)
- page.content()
- page.context
- page.dblclick(selector, **kwargs)
- page.dispatch_event(selector, type, **kwargs)
- page.drag_and_drop(source, target, **kwargs)
- page.emulate_media(**kwargs)
- page.eval_on_selector(selector, expression, **kwargs)
- page.eval_on_selector_all(selector, expression, **kwargs)
- page.evaluate(expression, **kwargs)
- page.evaluate_handle(expression, **kwargs)
- page.expect_console_message(**kwargs)
- page.expect_download(**kwargs)
- page.expect_event(event, **kwargs)
- page.expect_file_chooser(**kwargs)
- page.expect_navigation(**kwargs)
- page.expect_popup(**kwargs)
- page.expect_request(url_or_predicate, **kwargs)
- page.expect_request_finished(**kwargs)
- page.expect_response(url_or_predicate, **kwargs)
- page.expect_websocket(**kwargs)
- page.expect_worker(**kwargs)
- page.expose_binding(name, callback, **kwargs)
- page.expose_function(name, callback)
- page.fill(selector, value, **kwargs)
- page.focus(selector, **kwargs)
- page.frame(**kwargs)
- page.frame_locator(selector)
- page.frames
- page.get_attribute(selector, name, **kwargs)
- page.get_by_alt_text(text, **kwargs)
- page.get_by_label(text, **kwargs)
- page.get_by_placeholder(text, **kwargs)
- page.get_by_role(role, **kwargs)
- page.get_by_test_id(test_id)
- page.get_by_text(text, **kwargs)
- page.get_by_title(text, **kwargs)
- page.go_back(**kwargs)
- page.go_forward(**kwargs)
- page.goto(url, **kwargs)
- page.hover(selector, **kwargs)
- page.inner_html(selector, **kwargs)
- page.inner_text(selector, **kwargs)
- page.input_value(selector, **kwargs)
- page.is_checked(selector, **kwargs)
- page.is_closed()
- page.is_disabled(selector, **kwargs)
- page.is_editable(selector, **kwargs)
- page.is_enabled(selector, **kwargs)
- page.is_hidden(selector, **kwargs)
- page.is_visible(selector, **kwargs)
- page.keyboard
- page.locator(selector, **kwargs)
- page.main_frame
- page.mouse
- page.opener()
- page.pause()
- page.pdf(**kwargs)
- page.press(selector, key, **kwargs)
- page.query_selector(selector, **kwargs)
- page.query_selector_all(selector)
- page.reload(**kwargs)
- page.request
- page.route(url, handler, **kwargs)
- page.route_from_har(har, **kwargs)
- page.screenshot(**kwargs)
- page.select_option(selector, **kwargs)
- page.set_checked(selector, checked, **kwargs)
- page.set_content(html, **kwargs)
- page.set_default_navigation_timeout(timeout)
- page.set_default_timeout(timeout)
- page.set_extra_http_headers(headers)
- page.set_input_files(selector, files, **kwargs)
- page.set_viewport_size(viewport_size)
- page.tap(selector, **kwargs)
- page.text_content(selector, **kwargs)
- page.title()
- page.touchscreen
- page.type(selector, text, **kwargs)
- page.uncheck(selector, **kwargs)
- page.unroute(url, **kwargs)
- page.url
- page.video
- page.viewport_size
- page.wait_for_event(event, **kwargs)
- page.wait_for_function(expression, **kwargs)
- page.wait_for_load_state(**kwargs)
- page.wait_for_selector(selector, **kwargs)
- page.wait_for_timeout(timeout)
- page.wait_for_url(url, **kwargs)
- page.workers
page.on("close")
Added in: v1.8- type: <Page>
当页面关闭时触发。
page.on("console")
Added in: v1.8- type: <ConsoleMessage>
当页面内的 JavaScript 调用控制台 API 方法之一时触发,例如 console.log 或 console.dir。如果页面抛出错误或警告,也会触发。
传递给 console.log 的参数显示为事件处理程序的参数。
处理 console 事件的示例:
- Sync
- Async
def print_args(msg):
for arg in msg.args:
print(arg.json_value())
page.on("console", print_args)
page.evaluate("console.log('hello', 5, {foo: 'bar'})")
async def print_args(msg):
values = []
for arg in msg.args:
values.append(await arg.json_value())
print(values)
page.on("console", print_args)
await page.evaluate("console.log('hello', 5, {foo: 'bar'})")
page.on("crash")
Added in: v1.8- type: <Page>
当页面崩溃时触发。如果浏览器页面尝试分配太多内存,它们可能会崩溃。当页面崩溃时,正在进行和后续的操作将抛出异常。
处理崩溃最常见的方法是捕获异常:
- Sync
- Async
try:
# crash might happen during a click.
page.click("button")
# or while waiting for an event.
page.wait_for_event("popup")
except Error as e:
# when the page crashes, exception message contains "crash".
try:
# crash might happen during a click.
await page.click("button")
# or while waiting for an event.
await page.wait_for_event("popup")
except Error as e:
# when the page crashes, exception message contains "crash".
page.on("dialog")
Added in: v1.8- type: <Dialog>
当 JavaScript 对话框出现时触发,例如 alert、prompt、confirm 或 beforeunload。监听器必须执行 dialog.accept(**kwargs) 或 dialog.dismiss() 之一来处理对话框 - 否则页面将冻结等待对话框,并且点击等操作将永远不会完成。
page.on("dialog", lambda dialog: dialog.accept())
当不存在 page.on("dialog") 监听器时,所有对话框都会自动关闭。
page.on("domcontentloaded")
Added in: v1.9- type: <Page>
当 JavaScript DOMContentLoaded 事件被分派时触发。
page.on("download")
Added in: v1.8- type: <Download>
当附件下载开始时触发。用户可以通过传递的 Download 实例访问下载内容的基本文件操作。
page.on("filechooser")
Added in: v1.9- type: <FileChooser>
当文件选择器应该出现时触发,例如在点击 <input type=file> 之后。Playwright 可以通过使用 file_chooser.set_files(files, **kwargs) 设置输入文件来响应该事件,之后可以上传文件。
page.on("filechooser", lambda file_chooser: file_chooser.set_files("/tmp/myfile.pdf"))
page.on("frameattached")
Added in: v1.9- type: <Frame>
当 frame 附加时触发。
page.on("framedetached")
Added in: v1.9- type: <Frame>
当 frame 分离时触发。
page.on("framenavigated")
Added in: v1.9- type: <Frame>
当 frame 导航到新的 url 时触发。
page.on("load")
Added in: v1.8- type: <Page>
当 JavaScript load 事件被分派时触发。
page.on("pageerror")
Added in: v1.9- type: <Error>
当页面内发生未捕获的异常时触发。
- Sync
- Async
# Log all uncaught errors to the terminal
page.on("pageerror", lambda exc: print(f"uncaught exception: {exc}"))
# Navigate to a page with an exception.
page.goto("data:text/html,<script>throw new Error('test')</script>")
# Log all uncaught errors to the terminal
page.on("pageerror", lambda exc: print(f"uncaught exception: {exc}"))
# Navigate to a page with an exception.
await page.goto("data:text/html,<script>throw new Error('test')</script>")
page.on("popup")
Added in: v1.8- type: <Page>
当页面打开新标签页或窗口时触发。也就是 browser_context.on("page") 事件,但仅针对与此页面相关的弹出窗口发出。
最早可用的页面时刻是指它已导航到初始 url。例如,当使用 window.open('http://example.com') 打开弹出窗口时,该事件将在对 "http://example.com" 的网络请求完成且其响应已开始在弹出窗口中加载时触发。
- Sync
- Async
with page.expect_event("popup") as page_info:
page.evaluate("window.open('https://example.com')")
popup = page_info.value
print(popup.evaluate("location.href"))
async with page.expect_event("popup") as page_info:
page.evaluate("window.open('https://example.com')")
popup = await page_info.value
print(await popup.evaluate("location.href"))
使用 page.wait_for_load_state(**kwargs) 等待页面达到特定状态(大多数情况下你不需要它)。
page.on("request")
Added in: v1.8- type: <Request>
当页面发出请求时触发。request 对象是只读的。为了拦截和修改请求,请参阅 page.route(url, handler, **kwargs) 或 browser_context.route(url, handler, **kwargs)。
page.on("requestfailed")
Added in: v1.9- type: <Request>
当请求失败时触发,例如超时。
page.on("requestfailed", lambda request: print(request.url + " " + request.failure.error_text))
HTTP 错误响应(如 404 或 503)从 HTTP 立场来看仍然是成功的响应,因此请求将以 page.on("requestfinished") 事件完成,而不是 page.on("requestfailed")。仅当客户端无法从服务器获取 HTTP 响应(例如由于网络错误 net::ERR_FAILED)时,请求才被视为失败。
page.on("requestfinished")
Added in: v1.9- type: <Request>
当请求在下载响应体后成功完成时触发。对于成功的响应,事件序列为 request、response 和 requestfinished。
page.on("response")
Added in: v1.8- type: <Response>
当接收到请求的 response 状态和标头时触发。对于成功的响应,事件序列为 request、response 和 requestfinished。
page.on("websocket")
Added in: v1.9- type: <WebSocket>
当发送 WebSocket 请求时触发。
page.on("worker")
Added in: v1.8- type: <Worker>
当页面生成专用 WebWorker 时触发。
page.add_init_script(**kwargs)
Added in: v1.8path<Union[str, pathlib.Path]> JavaScript 文件的路径。如果path是相对路径,则相对于当前工作目录进行解析。可选。#script<str> 要在浏览器上下文的所有页面中求值的脚本。可选。#- 返回值: <NoneType>#
添加一个在以下场景中求值的脚本:
- 每当页面导航时。
- 每当子 frame 附加或导航时。在这种情况下,脚本在附加的 frame 的上下文中求值。
脚本在文档创建后但在运行任何脚本之前求值。这对于修改 JavaScript 环境(例如为 Math.random 设定种子)很有用。
在页面加载前重写 Math.random 的示例:
// preload.js
Math.random = () => 42;
- Sync
- Async
# in your playwright script, assuming the preload.js file is in same directory
page.add_init_script(path="./preload.js")
# in your playwright script, assuming the preload.js file is in same directory
await page.add_init_script(path="./preload.js")
通过 browser_context.add_init_script(**kwargs) 和 page.add_init_script(**kwargs) 安装的多个脚本的求值顺序未定义。
page.add_script_tag(**kwargs)
Added in: v1.8content<str> 要注入 frame 的原始 JavaScript 内容。#path<Union[str, pathlib.Path]> 要注入 frame 的 JavaScript 文件路径。如果path是相对路径,则相对于当前工作目录进行解析。#type<str> 脚本类型。使用 'module' 加载 Javascript ES6 模块。有关详细信息,请参阅 script。#url<str> 要添加的脚本 URL。#- 返回值: <ElementHandle>#
将 <script> 标签添加到具有所需 url 或内容的页面中。当脚本的 onload 触发或脚本内容注入 frame 时返回添加的标签。
这是主 frame 的 frame.add_script_tag(**kwargs) 的快捷方式。
page.add_style_tag(**kwargs)
Added in: v1.8content<str> 要注入 frame 的原始 CSS 内容。#path<Union[str, pathlib.Path]> 要注入 frame 的 CSS 文件路径。如果path是相对路径,则相对于当前工作目录进行解析。#url<str><link>标签的 URL。#- 返回值: <ElementHandle>#
将具有所需 url 的 <link rel="stylesheet"> 标签或具有内容的 <style type="text/css"> 标签添加到页面中。当样式表的 onload 触发或 CSS 内容注入 frame 时返回添加的标签。
这是主 frame 的 frame.add_style_tag(**kwargs) 的快捷方式。
page.bring_to_front()
Added in: v1.8将页面带到前台(激活选项卡)。
page.check(selector, **kwargs)
Added in: v1.8selector<str> 要查找元素的选着器。如果有多个元素满足选择器,则使用第一个。有关详细信息,请参阅使用选择器。#force<bool> 是否绕过 actionability 检查。默认为false。#no_wait_after<bool> 启动导航的操作将等待这些导航发生并等待页面开始加载。你可以通过设置此标志来选择不等待。你仅在特殊情况下(例如导航到无法访问的页面)才需要此选项。默认为false。#position<Dict> 相对于元素填充框左上角使用的点。如果未指定,则使用元素的某个可见点。Added in: v1.11#strict<bool> 如果为 true,则调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用抛出异常。Added in: v1.14#timeout<float> 最大时间(以毫秒为单位),默认为 30 秒,传递0以禁用超时。默认值可以使用 browser_context.set_default_timeout(timeout) 或 page.set_default_timeout(timeout) 方法更改。#trial<bool> 设置时,此方法仅执行 actionability 检查并跳过操作。默认为false。用于等待元素准备好执行操作而不执行它。Added in: v1.11#- 返回值: <NoneType>#
此方法通过执行以下步骤检查与 selector 匹配的元素:
- 查找匹配
selector的元素。如果没有,请等待直到匹配的元素附加到 DOM。 - 确保匹配的元素是复选框或单选输入。如果不是,此方法抛出异常。如果元素已选中,此方法立即返回。
- 等待匹配元素上的 actionability 检查,除非设置了
force选项。如果元素在检查期间分离,则重试整个操作。 - 如果需要,将元素滚动到视图中。
- 使用 page.mouse 单击元素的中心。
- 等待启动的导航成功或失败,除非设置了
no_wait_after选项。 - 确保元素现在已选中。如果不是,此方法抛出异常。
当所有步骤结合在一起在指定的 timeout 期间未完成时,此方法抛出 TimeoutError。传递零超时将禁用此功能。
这是主 frame 的 frame.check(selector, **kwargs) 的快捷方式。
page.click(selector, **kwargs)
Added in: v1.8selector<str> 要查找元素的选着器。如果有多个元素满足选择器,则使用第一个。有关详细信息,请参阅使用选择器。#button<"left"|"right"|"middle"> 默认为left。#click_count<int> 默认为 1。参见 UIEvent.detail。#delay<float>mousedown和mouseup之间等待的时间(以毫秒为单位)。默认为 0。#force<bool> 是否绕过 actionability 检查。默认为false。#modifiers<List["Alt"|"Control"|"Meta"|"Shift"]> 要按下的修饰键。确保在操作期间仅按下这些修饰符,然后恢复当前修饰符。如果未指定,则使用当前按下的修饰符。#no_wait_after<bool> 启动导航的操作将等待这些导航发生并等待页面开始加载。你可以通过设置此标志来选择不等待。你仅在特殊情况下(例如导航到无法访问的页面)才需要此选项。默认为false。#position<Dict> 相对于元素填充框左上角使用的点。如果未指定,则使用元素的某个可见点。#strict<bool> 如果为 true,则调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用抛出异常。Added in: v1.14#timeout<float> 最大时间(以毫秒为单位),默认为 30 秒,传递0以禁用超时。默认值可以使用 browser_context.set_default_timeout(timeout) or page.set_default_timeout(timeout) 方法更改。#trial<bool> 设置时,此方法仅执行 actionability 检查并跳过操作。默认为false。用于等待元素准备好执行操作而不执行它。Added in: v1.11#- 返回值: <NoneType>#
此方法通过执行以下步骤单击匹配 selector 的元素:
- 查找匹配
selector的元素。如果没有,请等待直到匹配的元素附加到 DOM。 - 等待匹配元素上的 actionability 检查,除非设置了
force选项。如果元素在检查期间分离,则重试整个操作。 - 如果需要,将元素滚动到视图中。
- 使用 page.mouse 单击元素的中心或指定的
position。 - 等待启动的导航成功或失败,除非设置了
no_wait_after选项。
当所有步骤结合在一起在指定的 timeout 期间未完成时,此方法抛出 TimeoutError。传递零超时将禁用此功能。
这是主 frame 的 frame.click(selector, **kwargs) 的快捷方式。
page.close(**kwargs)
Added in: v1.8run_before_unload<bool> 默认为false。是否运行 before unload 页面处理程序。#- 返回值: <NoneType>#
如果 run_before_unload 为 false,则不运行任何 unload 处理程序并等待页面关闭。如果 run_before_unload 为 true,则该方法将运行 unload 处理程序,但不会等待页面关闭。
默认情况下,page.close() 不运行 beforeunload 处理程序。
如果 run_before_unload 传递为 true,则可能会召唤 beforeunload 对话框,并应通过 page.on("dialog") 事件手动处理。
page.content()
Added in: v1.8获取页面的完整 HTML 内容,包括 doctype。
page.context
Added in: v1.8- 返回值: <BrowserContext>#
获取页面所属的 browser context。
page.dblclick(selector, **kwargs)
Added in: v1.8selector<str> 要查找元素的选着器。如果有多个元素满足选择器,则使用第一个。有关详细信息,请参阅使用选择器。#button<"left"|"right"|"middle"> 默认为left。#delay<float>mousedown和mouseup之间等待的时间(以毫秒为单位)。默认为 0。#force<bool> 是否绕过 actionability 检查。默认为false。#modifiers<List["Alt"|"Control"|"Meta"|"Shift"]> 要按下的修饰键。确保在操作期间仅按下这些修饰符,然后恢复当前修饰符。如果未指定,则使用当前按下的修饰符。#no_wait_after<bool> 启动导航的操作将等待这些导航发生并等待页面开始加载。你可以通过设置此标志来选择不等待。你仅在特殊情况下(例如导航到无法访问的页面)才需要此选项。默认为false。#position<Dict> 相对于元素填充框左上角使用的点。如果未指定,则使用元素的某个可见点。#strict<bool> 如果为 true,则调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用抛出异常。Added in: v1.14#timeout<float> 最大时间(以毫秒为单位),默认为 30 秒,传递0以禁用超时。默认值可以使用 browser_context.set_default_timeout(timeout) or page.set_default_timeout(timeout) 方法更改。#trial<bool> 设置时,此方法仅执行 actionability 检查并跳过操作。默认为false。用于等待元素准备好执行操作而不执行它。Added in: v1.11#- 返回值: <NoneType>#
此方法通过执行以下步骤双击匹配 selector 的元素:
- 查找匹配
selector的元素。如果没有,请等待直到匹配的元素附加到 DOM。 - 等待匹配元素上的 actionability 检查,除非设置了
force选项。如果元素在检查期间分离,则重试整个操作。 - 如果需要,将元素滚动到视图中。
- 使用 page.mouse 双击元素的中心或指定的
position。 - 等待启动的导航成功或失败,除非设置了
no_wait_after选项。注意,如果dblclick()的第一次单击触发导航事件,此方法将抛出异常。
当所有步骤结合在一起在指定的 timeout 期间未完成时,此方法抛出 TimeoutError。传递零超时将禁用此功能。
page.dblclick() 分派两个 click 事件和一个 dblclick 事件。
这是主 frame 的 frame.dblclick(selector, **kwargs) 的快捷方式。
page.dispatch_event(selector, type, **kwargs)
Added in: v1.8selector<str> 要查找元素的选着器。如果有多个元素满足选择器,则使用第一个。有关详细信息,请参阅使用选择器。#type<str> DOM 事件类型:"click","dragstart", 等。#event_init<EvaluationArgument> 可选的特定于事件的初始化属性。#strict<bool> 如果为 true,则调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用抛出异常。Added in: v1.14#timeout<float> 最大时间(以毫秒为单位),默认为 30 秒,传递0以禁用超时。默认值可以使用 browser_context.set_default_timeout(timeout) or page.set_default_timeout(timeout) 方法更改。#- 返回值: <NoneType>#
下面的代码片段在元素上分派 click 事件。不管元素的可见性状态如何,click 都会被分派。这相当于调用 element.click()。
- Sync
- Async
page.dispatch_event("button#submit", "click")
await page.dispatch_event("button#submit", "click")
在底层,它根据给定的 type 创建事件的实例,使用 event_init 属性对其进行初始化,并在元素上分派它。默认情况下,事件是 composed、cancelable 和冒泡的。
由于 event_init 是特定于事件的,请参阅事件文档以获取初始属性列表:
如果是要将实时对象传递到事件中,还可以将 JSHandle 指定为属性值:
- Sync
- Async
# note you can only create data_transfer in chromium and firefox
data_transfer = page.evaluate_handle("new DataTransfer()")
page.dispatch_event("#source", "dragstart", { "dataTransfer": data_transfer })
# note you can only create data_transfer in chromium and firefox
data_transfer = await page.evaluate_handle("new DataTransfer()")
await page.dispatch_event("#source", "dragstart", { "dataTransfer": data_transfer })
page.drag_and_drop(source, target, **kwargs)
Added in: v1.13source<str> 要搜索的拖动元素的选着器。如果有多个元素满足选择器,则使用第一个。有关详细信息,请参阅使用选择器。#target<str> 要搜索的放置元素的选着器。如果有多个元素满足选择器,则使用第一个。有关详细信息,请参阅使用选择器。#force<bool> 是否绕过 actionability 检查。默认为false。#no_wait_after<bool> 启动导航的操作将等待这些导航发生并等待页面开始加载。你可以通过设置此标志来选择不等待。你仅在特殊情况下(例如导航到无法访问的页面)才需要此选项。默认为false。#source_position<Dict> 单击相对于源元素填充框左上角的点。如果未指定,则使用元素的某个可见点。Added in: v1.14#strict<bool> 如果为 true,则调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用抛出异常。Added in: v1.14#target_position<Dict> 放置在相对于目标元素填充框左上角的点。如果未指定,则使用元素的某个可见点。Added in: v1.14#timeout<float> 最大时间(以毫秒为单位),默认为 30 秒,传递0以禁用超时。默认值可以使用 browser_context.set_default_timeout(timeout) or page.set_default_timeout(timeout) 方法更改。#trial<bool> 设置时,此方法仅执行 actionability 检查并跳过操作。默认为false。用于等待元素准备好执行操作而不执行它。#- 返回值: <NoneType>#
此方法将源元素拖动到目标元素。它将首先移动到源元素,执行 mousedown,然后移动到目标元素并执行 mouseup。
- Sync
- Async
page.drag_and_drop("#source", "#target")
# or specify exact positions relative to the top-left corners of the elements:
page.drag_and_drop(
"#source",
"#target",
source_position={"x": 34, "y": 7},
target_position={"x": 10, "y": 20}
)
await page.drag_and_drop("#source", "#target")
# or specify exact positions relative to the top-left corners of the elements:
await page.drag_and_drop(
"#source",
"#target",
source_position={"x": 34, "y": 7},
target_position={"x": 10, "y": 20}
)
page.emulate_media(**kwargs)
Added in: v1.8color_scheme<NoneType|"light"|"dark"|"no-preference"> 模拟'prefers-colors-scheme'媒体功能,支持的值为'light','dark','no-preference'。传递null禁用配色方案模拟。Added in: v1.9#forced_colors<NoneType|"active"|"none"> 模拟'forced-colors'媒体功能,支持的值为'active'和'none'。传递null禁用强制颜色模拟。Added in: v1.15#media<NoneType|"screen"|"print"> 更改页面的 CSS 媒体类型。唯一允许的值是'screen','print'和null。传递null禁用 CSS 媒体模拟。Added in: v1.9#reduced_motion<NoneType|"reduce"|"no-preference"> 模拟'prefers-reduced-motion'媒体功能,支持的值为'reduce','no-preference'。传递null禁用减少动作模拟。Added in: v1.12#- 返回值: <NoneType>#
此方法通过 media 参数更改 CSS media type,和/或使用 colorScheme 参数更改 'prefers-colors-scheme' 媒体功能。
- Sync
- Async
page.evaluate("matchMedia('screen').matches")
# → True
page.evaluate("matchMedia('print').matches")
# → False
page.emulate_media(media="print")
page.evaluate("matchMedia('screen').matches")
# → False
page.evaluate("matchMedia('print').matches")
# → True
page.emulate_media()
page.evaluate("matchMedia('screen').matches")
# → True
page.evaluate("matchMedia('print').matches")
# → False
await page.evaluate("matchMedia('screen').matches")
# → True
await page.evaluate("matchMedia('print').matches")
# → False
await page.emulate_media(media="print")
await page.evaluate("matchMedia('screen').matches")
# → False
await page.evaluate("matchMedia('print').matches")
# → True
await page.emulate_media()
await page.evaluate("matchMedia('screen').matches")
# → True
await page.evaluate("matchMedia('print').matches")
# → False
- Sync
- Async
page.emulate_media(color_scheme="dark")
page.evaluate("matchMedia('(prefers-color-scheme: dark)').matches")
# → True
page.evaluate("matchMedia('(prefers-color-scheme: light)').matches")
# → False
page.evaluate("matchMedia('(prefers-color-scheme: no-preference)').matches")
await page.emulate_media(color_scheme="dark")
await page.evaluate("matchMedia('(prefers-color-scheme: dark)').matches")
# → True
await page.evaluate("matchMedia('(prefers-color-scheme: light)').matches")
# → False
await page.evaluate("matchMedia('(prefers-color-scheme: no-preference)').matches")
# → False
page.eval_on_selector(selector, expression, **kwargs)
Added in: v1.9selector<str> 要查询的选择器。有关更多详细信息,请参阅使用选择器。#expression<str> 要在浏览器上下文中求值的 JavaScript 表达式。如果表达式求值为函数,则会自动调用该函数。#arg<EvaluationArgument> 传递给expression的可选参数。#strict<bool> 如果为 true,则调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用抛出异常。Added in: v1.14#- 返回值: <Serializable>#
此方法不会等待元素通过 actionability 检查,因此可能会导致测试不稳定。建议使用 locator.evaluate(expression, **kwargs)、其他 Locator 辅助方法或 web-first 断言。
该方法在页面内查找与指定选择器匹配的元素,并将其作为第一个参数传递给 expression。如果没有匹配选择器的元素,则该方法抛出异常。返回 expression 的值。
如果 expression 返回一个 Promise,则 page.eval_on_selector(selector, expression, **kwargs) 将等待 promise 解析并返回其值。
示例:
- Sync
- Async
search_value = page.eval_on_selector("#search", "el => el.value")
preload_href = page.eval_on_selector("link[rel=preload]", "el => el.href")
html = page.eval_on_selector(".main-container", "(e, suffix) => e.outer_html + suffix", "hello")
search_value = await page.eval_on_selector("#search", "el => el.value")
preload_href = await page.eval_on_selector("link[rel=preload]", "el => el.href")
html = await page.eval_on_selector(".main-container", "(e, suffix) => e.outer_html + suffix", "hello")
主 frame 的 frame.eval_on_selector(selector, expression, **kwargs) 的快捷方式。
page.eval_on_selector_all(selector, expression, **kwargs)
Added in: v1.9selector<str> 要查询的选择器。有关更多详细信息,请参阅使用选择器。#expression<str> 要在浏览器上下文中求值的 JavaScript 表达式。如果表达式求值为函数,则会自动调用该函数。#arg<EvaluationArgument> 传递给expression的可选参数。#- 返回值: <Serializable>#
在大多数情况下,locator.evaluate_all(expression, **kwargs)、其他 Locator 辅助方法和 web-first 断言效果更好。
该方法在页面内查找与指定选择器匹配的所有元素,并将匹配的元素数组作为第一个参数传递给 expression。返回 expression 调用的结果。
如果 expression 返回一个 Promise,则 page.eval_on_selector_all(selector, expression, **kwargs) 将等待 promise 解析并返回其值。
Examples:
- Sync
- Async
div_counts = page.eval_on_selector_all("div", "(divs, min) => divs.length >= min", 10)
div_counts = await page.eval_on_selector_all("div", "(divs, min) => divs.length >= min", 10)
page.evaluate(expression, **kwargs)
Added in: v1.8expression<str> 要在浏览器上下文中求值的 JavaScript 表达式。如果表达式求值为函数,则会自动调用该函数。#arg<EvaluationArgument> 传递给expression的可选参数。#- 返回值: <Serializable>#
返回 expression 调用的值。
如果传递给 page.evaluate(expression, **kwargs) 的函数返回一个 Promise,则 page.evaluate(expression, **kwargs) 将等待 promise 解析并返回其值。
如果传递给 page.evaluate(expression, **kwargs) 的函数返回非 Serializable 值,则 page.evaluate(expression, **kwargs) 解析为 undefined。Playwright 还支持传输一些 JSON 无法序列化的附加值:-0、NaN、Infinity、-Infinity。
将参数传递给 expression:
- Sync
- Async
result = page.evaluate("([x, y]) => Promise.resolve(x * y)", [7, 8])
print(result) # prints "56"
result = await page.evaluate("([x, y]) => Promise.resolve(x * y)", [7, 8])
print(result) # prints "56"
也可以传递字符串而不是函数:
- Sync
- Async
print(page.evaluate("1 + 2")) # prints "3"
x = 10
print(page.evaluate(f"1 + {x}")) # prints "11"
print(await page.evaluate("1 + 2")) # prints "3"
x = 10
print(await page.evaluate(f"1 + {x}")) # prints "11"
ElementHandle 实例可以作为参数传递给 page.evaluate(expression, **kwargs):
- Sync
- Async
body_handle = page.evaluate("document.body")
html = page.evaluate("([body, suffix]) => body.innerHTML + suffix", [body_handle, "hello"])
body_handle.dispose()
body_handle = await page.evaluate("document.body")
html = await page.evaluate("([body, suffix]) => body.innerHTML + suffix", [body_handle, "hello"])
await body_handle.dispose()
主 frame 的 frame.evaluate(expression, **kwargs) 的快捷方式。
page.evaluate_handle(expression, **kwargs)
Added in: v1.8expression<str> 要在浏览器上下文中求值的 JavaScript 表达式。如果表达式求值为函数,则会自动调用该函数。#arg<EvaluationArgument> 传递给expression的可选参数。#- 返回值: <JSHandle>#
返回 expression 调用的值,作为 JSHandle。
page.evaluate(expression, **kwargs) 和 page.evaluate_handle(expression, **kwargs) 之间的唯一区别是 page.evaluate_handle(expression, **kwargs) 返回 JSHandle。
如果传递给 page.evaluate_handle(expression, **kwargs) 的函数返回一个 Promise,则 page.evaluate_handle(expression, **kwargs) 将等待 promise 解析并返回其值。
- Sync
- Async
a_window_handle = page.evaluate_handle("Promise.resolve(window)")
a_window_handle # handle for the window object.
a_window_handle = await page.evaluate_handle("Promise.resolve(window)")
a_window_handle # handle for the window object.
也可以传递字符串而不是函数:
- Sync
- Async
a_handle = page.evaluate_handle("document") # handle for the "document"
a_handle = await page.evaluate_handle("document") # handle for the "document"
JSHandle 实例可以作为参数传递给 page.evaluate_handle(expression, **kwargs):
- Sync
- Async
a_handle = page.evaluate_handle("document.body")
result_handle = page.evaluate_handle("body => body.innerHTML", a_handle)
print(result_handle.json_value())
result_handle.dispose()
a_handle = await page.evaluate_handle("document.body")
result_handle = await page.evaluate_handle("body => body.innerHTML", a_handle)
print(await result_handle.json_value())
await result_handle.dispose()
page.expect_console_message(**kwargs)
Added in: v1.9predicate<Callable[ConsoleMessage]:bool> 接收 ConsoleMessage 对象并在等待应解析时解析为真值。#timeout<float> 等待的最大时间(以毫秒为单位)。默认为30000(30 秒)。传递0以禁用超时。默认值可以使用 browser_context.set_default_timeout(timeout) 更改。#- 返回值: <EventContextManager[ConsoleMessage]>#
执行操作并等待页面记录 ConsoleMessage。如果提供了 predicate,则将 ConsoleMessage 值传递给 predicate 函数,并等待 predicate(message) 返回真值。如果在触发 page.on("console") 事件之前关闭页面,则会抛出错误。
page.expect_download(**kwargs)
Added in: v1.9predicate<Callable[Download]:bool> 接收 Download 对象并在等待应解析时解析为真值。#timeout<float> 等待的最大时间(以毫秒为单位)。默认为30000(30 秒)。传递0以禁用超时。默认值可以使用 browser_context.set_default_timeout(timeout) 更改。#- 返回值: <EventContextManager[Download]>#
执行操作并等待新的 Download。如果提供了 predicate,则将 Download 值传递给 predicate 函数,并等待 predicate(download) 返回真值。如果在触发下载事件之前关闭页面,则会抛出错误。
page.expect_event(event, **kwargs)
Added in: v1.8event<str> 事件名称,通常传递给*.on(event)的名称相同。#predicate<Callable> 接收事件数据并在等待应解析时解析为真值。#timeout<float> 等待的最大时间(以毫秒为单位)。默认为30000(30 秒)。传递0以禁用超时。默认值可以使用 browser_context.set_default_timeout(timeout) 更改。#- 返回值: <EventContextManager>#
等待事件触发并将其值传递给 predicate 函数。当 predicate 返回真值时返回。如果在触发事件之前关闭页面,则会抛出错误。返回事件数据值。
- Sync
- Async
with page.expect_event("framenavigated") as event_info:
page.get_by_role("button")
frame = event_info.value
async with page.expect_event("framenavigated") as event_info:
await page.get_by_role("button")
frame = await event_info.value
page.expect_file_chooser(**kwargs)
Added in: v1.9predicate<Callable[FileChooser]:bool> 接收 FileChooser 对象并在等待应解析时解析为真值。#timeout<float> 等待的最大时间(以毫秒为单位)。默认为30000(30 秒)。传递0以禁用超时。默认值可以使用 browser_context.set_default_timeout(timeout) 更改。#- 返回值: <EventContextManager[FileChooser]>#
执行操作并等待新的 FileChooser 创建。如果提供了 predicate,则将 FileChooser 值传递给 predicate 函数,并等待 predicate(fileChooser) 返回真值。如果在打开文件选择器之前关闭页面,则会抛出错误。
page.expect_navigation(**kwargs)
Added in: v1.8timeout<float> 最大操作时间(以毫秒为单位),默认为 30 秒,传递0以禁用超时。默认值可以使用 browser_context.set_default_navigation_timeout(timeout), browser_context.set_default_timeout(timeout), page.set_default_navigation_timeout(timeout) 或 page.set_default_timeout(timeout) 方法更改。#url<str|Pattern|Callable[URL]:bool> 匹配导航时等待的 glob 模式、正则表达式模式或接收 URL 的断言。注意,如果参数是不带通配符的字符串,则该方法将等待导航到与字符串完全相同的 URL。#wait_until<"load"|"domcontentloaded"|"networkidle"|"commit"> 何时考虑操作成功,默认为load。事件可以是:#'domcontentloaded'- 当DOMContentLoaded事件触发时,认为操作完成。'load'- 当load事件触发时,认为操作完成。'networkidle'- 当至少500毫秒内没有网络连接时,认为操作完成。'commit'- 当收到网络响应且文档开始加载时,认为操作完成。
- 返回值: <EventContextManager[Response]>#
等待主机架导航并返回主资源响应。如果发生多次重定向,导航将使用最后一次重定向的响应进行解析。如果导航到不同的锚点或由于使用了 History API 而进行导航,则导航将解析为 null。
当页面导航到新 URL 或重新加载时,这将解析。这对于运行将间接导致页面导航的代码非常有用。例如,单击目标的 onclick 处理程序会触发来自 setTimeout 的导航。考虑这个例子:
- Sync
- Async
with page.expect_navigation():
page.click("a.delayed-navigation") # clicking the link will indirectly cause a navigation
# Resolves after navigation has finished
async with page.expect_navigation():
await page.click("a.delayed-navigation") # clicking the link will indirectly cause a navigation
# Resolves after navigation has finished
Usage of the History API to change the URL is considered a navigation.
Shortcut for main frame's frame.expect_navigation(**kwargs).
page.expect_popup(**kwargs)
Added in: v1.9predicate<Callable[Page]:bool> 接收 Page 对象并在等待应解析时解析为真值。#timeout<float> 等待的最大时间(以毫秒为单位)。默认为30000(30 秒)。传递0以禁用超时。默认值可以使用 browser_context.set_default_timeout(timeout) 更改。#- 返回值: <EventContextManager[Page]>#
执行操作并等待弹出窗口 Page。如果提供了 predicate,则将 [Popup] 值传递给 predicate 函数,并等待 predicate(page) 返回真值。如果在触发弹出窗口事件之前关闭页面,则会抛出错误。
page.expect_request(url_or_predicate, **kwargs)
Added in: v1.8url_or_predicate<str|Pattern|Callable[Request]:bool> 请求 URL 字符串、正则表达式或接收 Request 对象的断言。当提供上下文选项中的base_url且传递的 URL 是路径时,它将通过new URL()构造函数进行合并。#timeout<float> 最大等待时间(以毫秒为单位),默认为 30 秒,传递0以禁用超时。默认值可以使用 page.set_default_timeout(timeout) 方法更改。#- 返回值: <EventContextManager[Request]>#
等待匹配的请求并作为返回值。有关事件的更多详细信息,请参阅等待事件。
- Sync
- Async
with page.expect_request("http://example.com/resource") as first:
page.click('button')
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.click('img')
second_request = second.value
async with page.expect_request("http://example.com/resource") as first:
await page.click('button')
first_request = await first.value
# or with a lambda
async with page.expect_request(lambda request: request.url == "http://example.com" and request.method == "get") as second:
await page.click('img')
second_request = await second.value
page.expect_request_finished(**kwargs)
Added in: v1.12predicate<Callable[Request]:bool> 接收 Request 对象并在等待应解析时解析为真值。#timeout<float> 等待的最大时间(以毫秒为单位)。默认为30000(30 秒)。传递0以禁用超时。默认值可以使用 browser_context.set_default_timeout(timeout) 更改。#- 返回值: <EventContextManager[Request]>#
执行操作并等待 Request 完成加载。如果提供了 predicate,则将 Request 值传递给 predicate 函数,并等待 predicate(request) 返回真值。如果在触发 page.on("requestfinished") 事件之前关闭页面,则会抛出错误。
page.expect_response(url_or_predicate, **kwargs)
Added in: v1.8url_or_predicate<str|Pattern|Callable[Response]:bool> 请求 URL 字符串、正则表达式或接收 Response 对象的断言。当提供上下文选项中的base_url且传递的 URL 是路径时,它将通过new URL()构造函数进行合并。#timeout<float> 最大等待时间(以毫秒为单位),默认为 30 秒,传递0以禁用超时。默认值可以使用 browser_context.set_default_timeout(timeout) or page.set_default_timeout(timeout) 方法更改。#- 返回值: <EventContextManager[Response]>#
返回匹配的响应。有关事件的更多详细信息,请参阅等待事件。
- Sync
- Async
with page.expect_response("https://example.com/resource") as response_info:
page.click("input")
response = response_info.value
return response.ok
# or with a lambda
with page.expect_response(lambda response: response.url == "https://example.com" and response.status == 200) as response_info:
page.click("input")
response = response_info.value
return response.ok
async with page.expect_response("https://example.com/resource") as response_info:
await page.click("input")
response = await response_info.value
return response.ok
# or with a lambda
async with page.expect_response(lambda response: response.url == "https://example.com" and response.status == 200) as response_info:
await page.click("input")
response = await response_info.value
return response.ok
page.expect_websocket(**kwargs)
Added in: v1.9predicate<Callable[WebSocket]:bool> 接收 WebSocket 对象并在等待应解析时解析为真值。#timeout<float> 等待的最大时间(以毫秒为单位)。默认为30000(30 秒)。传递0以禁用超时。默认值可以使用 browser_context.set_default_timeout(timeout) 更改。#- 返回值: <EventContextManager[WebSocket]>#
执行操作并等待新的 WebSocket。如果提供了 predicate,则将 WebSocket 值传递给 predicate 函数,并等待 predicate(webSocket) 返回真值。如果在触发 WebSocket 事件之前关闭页面,则会抛出错误。
page.expect_worker(**kwargs)
Added in: v1.9predicate<Callable[Worker]:bool> 接收 Worker 对象并在等待应解析时解析为真值。#timeout<float> 等待的最大时间(以毫秒为单位)。默认为30000(30 秒)。传递0以禁用超时。默认值可以使用 browser_context.set_default_timeout(timeout) 更改。#- 返回值: <EventContextManager[Worker]>#
执行操作并等待新的 Worker。如果提供了 predicate,则将 Worker 值传递给 predicate 函数,并等待 predicate(worker) 返回真值。如果在触发 worker 事件之前关闭页面,则会抛出错误。
page.expose_binding(name, callback, **kwargs)
Added in: v1.8name<str> window 对象上的函数名称。#callback<Callable> 将在 Playwright 上下文中调用的回调函数。#handle<bool> 是否将参数作为句柄传递,而不是按值传递。传递句柄时,仅支持一个参数。按值传递时,支持多个参数。#- 返回值: <NoneType>#
该方法在页面的每个帧的 window 对象上添加一个名为 name 的函数。当调用时,该函数执行 callback 并返回一个 Promise,该 Promise 解析为 callback 的返回值。如果 callback 返回一个 Promise,它将被等待。
callback 函数的第一个参数包含有关调用者的信息:{ browserContext: BrowserContext, page: Page, frame: Frame }。
有关上下文范围的版本,请参阅 browser_context.expose_binding(name, callback, **kwargs)。
通过 page.expose_binding(name, callback, **kwargs) 安装的函数在导航后仍然存在。
将页面 URL 暴露给页面中所有 frame 的示例:
- Sync
- Async
from playwright.sync_api import sync_playwright
def run(playwright):
webkit = playwright.webkit
browser = webkit.launch(headless=false)
context = browser.new_context()
page = context.new_page()
page.expose_binding("pageURL", lambda source: source["page"].url)
page.set_content("""
<script>
async function onClick() {
document.querySelector('div').textContent = await window.pageURL();
}
</script>
<button onclick="onClick()">Click me</button>
<div></div>
""")
page.click("button")
with sync_playwright() as playwright:
run(playwright)
import asyncio
from playwright.async_api import async_playwright
async def run(playwright):
webkit = playwright.webkit
browser = await webkit.launch(headless=false)
context = await browser.new_context()
page = await context.new_page()
await page.expose_binding("pageURL", lambda source: source["page"].url)
await page.set_content("""
<script>
async function onClick() {
document.querySelector('div').textContent = await window.pageURL();
}
</script>
<button onclick="onClick()">Click me</button>
<div></div>
""")
await page.click("button")
async def main():
async with async_playwright() as playwright:
await run(playwright)
asyncio.run(main())
传递元素句柄的示例:
- Sync
- Async
def print(source, element):
print(element.text_content())
page.expose_binding("clicked", print, handle=true)
page.set_content("""
<script>
document.addEventListener('click', event => window.clicked(event.target));
</script>
<div>Click me</div>
<div>Or click me</div>
""")
async def print(source, element):
print(await element.text_content())
await page.expose_binding("clicked", print, handle=true)
await page.set_content("""
<script>
document.addEventListener('click', event => window.clicked(event.target));
</script>
<div>Click me</div>
<div>Or click me</div>
""")
page.expose_function(name, callback)
Added in: v1.8该方法在页面的每个帧的 window 对象上添加一个名为 name 的函数。当调用时,该函数执行 callback 并返回一个 Promise,该 Promise 解析为 callback 的返回值。
如果 callback 返回一个 Promise,它将被等待。
有关上下文范围的暴露函数,请参阅 browser_context.expose_function(name, callback)。
通过 page.expose_function(name, callback) 安装的函数在导航后仍然存在。
向页面添加 sha256 函数的示例:
- Sync
- Async
import hashlib
from playwright.sync_api import sync_playwright
def sha256(text):
m = hashlib.sha256()
m.update(bytes(text, "utf8"))
return m.hexdigest()
def run(playwright):
webkit = playwright.webkit
browser = webkit.launch(headless=False)
page = browser.new_page()
page.expose_function("sha256", sha256)
page.set_content("""
<script>
async function onClick() {
document.querySelector('div').textContent = await window.sha256('PLAYWRIGHT');
}
</script>
<button onclick="onClick()">Click me</button>
<div></div>
""")
page.click("button")
with sync_playwright() as playwright:
run(playwright)
import asyncio
import hashlib
from playwright.async_api import async_playwright
def sha256(text):
m = hashlib.sha256()
m.update(bytes(text, "utf8"))
return m.hexdigest()
async def run(playwright):
webkit = playwright.webkit
browser = await webkit.launch(headless=False)
page = await browser.new_page()
await page.expose_function("sha256", sha256)
await page.set_content("""
<script>
async function onClick() {
document.querySelector('div').textContent = await window.sha256('PLAYWRIGHT');
}
</script>
<button onclick="onClick()">Click me</button>
<div></div>
""")
await page.click("button")
async def main():
async with async_playwright() as playwright:
await run(playwright)
asyncio.run(main())
page.fill(selector, value, **kwargs)
Added in: v1.8selector<str> 要查找元素的选着器。如果有多个元素满足选择器,则使用第一个。有关详细信息,请参阅使用选择器。#value<str> 要为<input>,<textarea>or[contenteditable]元素填充的值。#force<bool> 是否绕过 actionability 检查。默认为false。Added in: v1.13#no_wait_after<bool> 启动导航的操作将等待这些导航发生并等待页面开始加载。你可以通过设置此标志来选择不等待。你仅在特殊情况下(例如导航到无法访问的页面)才需要此选项。默认为false。#strict<bool> 如果为 true,则调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用抛出异常。Added in: v1.14#timeout<float> 最大时间(以毫秒为单位),默认为 30 秒,传递0以禁用超时。默认值可以使用 browser_context.set_default_timeout(timeout) or page.set_default_timeout(timeout) 方法更改。#- 返回值: <NoneType>#
此方法等待匹配 selector 的元素,等待 actionability 检查,聚焦元素,填充它并在填充后触发 input 事件。请注意,您可以传递空字符串以清除输入字段。
如果目标元素不是 <input>、<textarea> 或 [contenteditable] 元素,此方法将引发错误。但是,如果元素位于具有关联 control 的 <label> 元素内,则将改为填写该控件。
要发送细粒度的键盘事件,请使用 page.type(selector, text, **kwargs)。
主框架的 frame.fill(selector, value, **kwargs) 的快捷方式。
page.focus(selector, **kwargs)
Added in: v1.8selector<str> 要查找元素的选着器。如果有多个元素满足选择器,则使用第一个。有关详细信息,请参阅使用选择器。#strict<bool> 如果为 true,则调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用抛出异常。Added in: v1.14#timeout<float> 最大时间(以毫秒为单位),默认为 30 秒,传递0以禁用超时。默认值可以使用 browser_context.set_default_timeout(timeout) or page.set_default_timeout(timeout) 方法更改。#- 返回值: <NoneType>#
此方法获取具有 selector 的元素并聚焦它。如果没有匹配 selector 的元素,该方法将等待直到 DOM 中出现匹配的元素。
主框架的 frame.focus(selector, **kwargs) 的快捷方式。
page.frame(**kwargs)
Added in: v1.8name<str>iframe的name属性中指定的框架名称。可选。#url<str|Pattern|Callable[URL]:bool> 接收框架url作为 URL 对象的 glob 模式、正则表达式模式或断言。可选。#- 返回值: <NoneType|Frame>#
返回匹配指定条件的框架。必须指定 name 或 url。
frame = page.frame(name="frame-name")
frame = page.frame(url=r".*domain.*")
page.frame_locator(selector)
Added in: v1.17selector<str> 解析 DOM 元素时使用的选择器。有关详细信息,请参阅使用选择器。#- 返回值: <FrameLocator>#
在使用 iframe 时,我们可以创建一个 frame locator,它将进入 iframe 并允许在该 iframe 中选择元素。以下代码片段在 id 为 my-frame 的 iframe 中定位文本为 "Submit" 的元素,如 <iframe id="my-frame">:
- Sync
- Async
locator = page.frame_locator("#my-iframe").get_by_text("Submit")
locator.click()
locator = page.frame_locator("#my-iframe").get_by_text("Submit")
await locator.click()
page.frames
Added in: v1.8附加到页面的所有框架的数组。
page.get_attribute(selector, name, **kwargs)
Added in: v1.8selector<str> 要查找元素的选着器。如果有多个元素满足选择器,则使用第一个。有关详细信息,请参阅使用选择器。#name<str> 要获取值的属性名称。#strict<bool> 如果为 true,则调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用抛出异常。Added in: v1.14#timeout<float> 最大时间(以毫秒为单位),默认为 30 秒,传递0以禁用超时。默认值可以使用 browser_context.set_default_timeout(timeout) or page.set_default_timeout(timeout) 方法更改。#- 返回值: <NoneType|str>#
返回元素属性值。
page.get_by_alt_text(text, **kwargs)
Added in: v1.27text<str|Pattern> 要定位元素的文本。#exact<bool> 是否查找完全匹配:区分大小写和全字符串。默认为 false。当按正则表达式定位时忽略。请注意,完全匹配仍会修剪空格。#- 返回值: <Locator>#
允许通过其 alt 文本定位元素。例如,此方法将通过 alt 文本 "Castle" 找到图像:
<img alt='Castle'>
page.get_by_label(text, **kwargs)
Added in: v1.27text<str|Pattern> 要定位元素的文本。#exact<bool> 是否查找完全匹配:区分大小写和全字符串。默认为 false。当按正则表达式定位时忽略。请注意,完全匹配仍会修剪空格。#- 返回值: <Locator>#
允许通过关联标签的文本定位输入元素。例如,此方法将在以下 DOM 中通过标签文本 Password 找到输入:
<label for="password-input">Password:</label>
<input id="password-input">
page.get_by_placeholder(text, **kwargs)
Added in: v1.27text<str|Pattern> 要定位元素的文本。#exact<bool> 是否查找完全匹配:区分大小写和全字符串。默认为 false。当按正则表达式定位时忽略。请注意,完全匹配仍会修剪空格。#- 返回值: <Locator>#
允许通过占位符文本定位输入元素。例如,此方法将通过占位符 "Country" 找到输入:
<input placeholder="Country">
page.get_by_role(role, **kwargs)
Added in: v1.27role<"alert"|"alertdialog"|"application"|"article"|"banner"|"blockquote"|"button"|"caption"|"cell"|"checkbox"|"code"|"columnheader"|"combobox"|"complementary"|"contentinfo"|"definition"|"deletion"|"dialog"|"directory"|"document"|"emphasis"|"feed"|"figure"|"form"|"generic"|"grid"|"gridcell"|"group"|"heading"|"img"|"insertion"|"link"|"list"|"listbox"|"listitem"|"log"|"main"|"marquee"|"math"|"meter"|"menu"|"menubar"|"menuitem"|"menuitemcheckbox"|"menuitemradio"|"navigation"|"none"|"note"|"option"|"paragraph"|"presentation"|"progressbar"|"radio"|"radiogroup"|"region"|"row"|"rowgroup"|"rowheader"|"scrollbar"|"search"|"searchbox"|"separator"|"slider"|"spinbutton"|"status"|"strong"|"subscript"|"superscript"|"switch"|"tab"|"table"|"tablist"|"tabpanel"|"term"|"textbox"|"time"|"timer"|"toolbar"|"tooltip"|"tree"|"treegrid"|"treeitem"> 必须的 aria 角色。#checked<bool> 通常由aria-checked或原生<input type=checkbox>控件设置的属性。checked 的可用值为true、false和"mixed"。#了解有关
aria-checked的更多信息。disabled<bool> 通常由aria-disabled或disabled设置的布尔属性。#note与大多数其他属性不同,
disabled是通过 DOM 层次结构继承的。了解有关aria-disabled的更多信息。expanded<bool> 通常由aria-expanded设置的布尔属性。#了解有关
aria-expanded的更多信息。include_hidden<bool> 一个布尔属性,控制是否匹配隐藏元素。默认情况下,角色选择器仅匹配非隐藏元素(如 ARIA 定义)。#了解有关
aria-hidden的更多信息。level<int> 通常出现在角色heading,listitem,row,treeitem中的数字属性,具有<h1>-<h6>元素的默认值。#了解有关
aria-level的更多信息。name<str|Pattern> 匹配 accessible name 的字符串属性。#了解有关 accessible name 的更多信息。
pressed<bool> 通常由aria-pressed设置的属性。pressed 的可用值为true、false和"mixed"。#了解有关
aria-pressed的更多信息。selected<bool> 通常由aria-selected设置的布尔属性。#了解有关
aria-selected的更多信息。
允许通过其 ARIA 角色、ARIA 属性 和 accessible name 定位元素。请注意,角色选择器不能替代可访问性审核和一致性测试,而是提供有关 ARIA 指南的早期反馈。
请注意,许多 html 元素具有由角色选择器识别的隐式定义角色。您可以在此处找到所有支持的角色。ARIA 指南不建议通过将 role 和/或 aria-* 属性设置为默认值来复制隐式角色和属性。
page.get_by_test_id(test_id)
Added in: v1.27通过 test id 定位元素。默认情况下,使用 data-testid 属性作为 test id。如有必要,请使用 selectors.set_test_id_attribute(attribute_name) 配置不同的 test id 属性。
page.get_by_text(text, **kwargs)
Added in: v1.27text<str|Pattern> 要定位元素的文本。#exact<bool> 是否查找完全匹配:区分大小写和全字符串。默认为 false。当按正则表达式定位时忽略。请注意,完全匹配仍会修剪空格。#- 返回值: <Locator>#
允许定位包含给定文本的元素。考虑以下 DOM 结构:
<div>Hello <span>world</span></div>
<div>Hello</div>
您可以通过文本子字符串、精确字符串或正则表达式进行定位:
- Sync
- Async
# Matches <span>
page.get_by_text("world")
# Matches first <div>
page.get_by_text("Hello world")
# Matches second <div>
page.get_by_text("Hello", exact=True)
# Matches both <div>s
page.get_by_text(re.compile("Hello"))
# Matches second <div>
page.get_by_text(re.compile("^hello$", re.IGNORECASE))
# Matches <span>
page.get_by_text("world")
# Matches first <div>
page.get_by_text("Hello world")
# Matches second <div>
page.get_by_text("Hello", exact=True)
# Matches both <div>s
page.get_by_text(re.compile("Hello"))
# Matches second <div>
page.get_by_text(re.compile("^hello$", re.IGNORECASE))
另请参阅 locator.filter(**kwargs),它允许按其他条件(如可访问角色)进行匹配,然后按文本内容进行过滤。
即使是完全匹配,按文本匹配也总是规范化空格。例如,它将多个空格转换为一个空格,将换行符转换为空格,并忽略前导和尾随空格。
类型为 button and submit 的输入元素由其 value 而不是文本内容匹配。例如,按文本 "Log in" 定位匹配 <input type=button value="Log in">。
page.get_by_title(text, **kwargs)
Added in: v1.27text<str|Pattern> 要定位元素的文本。#exact<bool> 是否查找完全匹配:区分大小写和全字符串。默认为 false。当按正则表达式定位时忽略。请注意,完全匹配仍会修剪空格。#- 返回值: <Locator>#
允许通过其标题定位元素。例如,此方法将通过其标题 "Submit" 找到按钮:
<button title='Place the order'>Order Now</button>
page.go_back(**kwargs)
Added in: v1.8timeout<float> 最大操作时间(以毫秒为单位),默认为 30 秒,传递0以禁用超时。默认值可以使用 browser_context.set_default_navigation_timeout(timeout), browser_context.set_default_timeout(timeout), page.set_default_navigation_timeout(timeout) or page.set_default_timeout(timeout) 方法更改。#wait_until<"load"|"domcontentloaded"|"networkidle"|"commit"> 何时认为操作成功,默认为load。事件可以是:#'domcontentloaded'- 认为操作在DOMContentLoaded事件触发时完成。'load'- 认为操作在load事件触发时完成。'networkidle'- 认为操作在至少500毫秒内没有网络连接时完成。'commit'- 认为操作在接收到网络响应并开始加载文档时完成。
- 返回值: <NoneType|Response>#
返回主资源响应。在多次重定向的情况下,导航将使用最后一次重定向的响应进行解析。如果无法回退,则返回 null。
导航到历史记录中的上一页。
page.go_forward(**kwargs)
Added in: v1.8timeout<float> 最大操作时间(以毫秒为单位),默认为 30 秒,传递0以禁用超时。默认值可以使用 browser_context.set_default_navigation_timeout(timeout), browser_context.set_default_timeout(timeout), page.set_default_navigation_timeout(timeout) or page.set_default_timeout(timeout) 方法更改。#wait_until<"load"|"domcontentloaded"|"networkidle"|"commit"> 何时认为操作成功,默认为load。事件可以是:#'domcontentloaded'- 认为操作在DOMContentLoaded事件触发时完成。'load'- 认为操作在load事件触发时完成。'networkidle'- 认为操作在至少500毫秒内没有网络连接时完成。'commit'- 认为操作在接收到网络响应并开始加载文档时完成。
- 返回值: <NoneType|Response>#
返回主资源响应。在多次重定向的情况下,导航将使用最后一次重定向的响应进行解析。如果无法前进,则返回 null。
导航到历史记录中的下一页。
page.goto(url, **kwargs)
Added in: v1.8url<str> 页面导航到的 URL。url 应包含协议,例如https://。当通过上下文选项提供了base_url并且传递的 URL 是路径时,它将通过new URL()构造函数合并。#referer<str> Referer 标头值。如果提供,它将优先于 page.set_extra_http_headers(headers) 设置的 referer 标头值。#timeout<float> 最大操作时间(以毫秒为单位),默认为 30 秒,传递0以禁用超时。默认值可以使用 browser_context.set_default_navigation_timeout(timeout), browser_context.set_default_timeout(timeout), page.set_default_navigation_timeout(timeout) or page.set_default_timeout(timeout) 方法更改。#wait_until<"load"|"domcontentloaded"|"networkidle"|"commit"> 何时认为操作成功,默认为load。事件可以是:#'domcontentloaded'- 认为操作在DOMContentLoaded事件触发时完成。'load'- 认为操作在load事件触发时完成。'networkidle'- 认为操作在至少500毫秒内没有网络连接时完成。'commit'- 认为操作在接收到网络响应并开始加载文档时完成。
- 返回值: <NoneType|Response>#
返回主资源响应。在多次重定向的情况下,导航将使用第一个非重定向响应进行解析。
如果发生以下情况,该方法将引发错误:
- 出现 SSL 错误(例如,在自签名证书的情况下)。
- 目标 URL 无效。
- 导航期间超出
timeout。 - 远程服务器不响应或无法访问。
- 主资源加载失败。
当远程服务器返回任何有效的 HTTP 状态代码(包括 404 "Not Found" 和 500 "Internal Server Error")时,此方法不会引发错误。此类响应的状态代码可以通过调用 response.status 检索。
该方法要么引发错误,要么返回主资源响应。唯一的例外是导航到 about:blank 或导航到具有不同哈希的同一 URL,这将成功并返回 null。
无头模式不支持导航到 PDF 文档。请参阅上游问题。
主 frame 的 frame.goto(url, **kwargs) 的快捷方式
page.hover(selector, **kwargs)
Added in: v1.8selector<str> 要查找元素的选着器。如果有多个元素满足选择器,则使用第一个。有关详细信息,请参阅使用选择器。#force<bool> 是否绕过 actionability 检查。默认为false。#modifiers<List["Alt"|"Control"|"Meta"|"Shift"]> 要按下的修饰键。确保操作期间仅按下这些修饰符,然后将当前修饰符恢复。如果未指定,则使用当前按下的修饰符。#position<Dict> 相对于元素内边距框左上角使用的点。如果未指定,则使用元素的某个可见点。#strict<bool> 如果为 true,则调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用抛出异常。Added in: v1.14#timeout<float> 最大时间(以毫秒为单位),默认为 30 秒,传递0以禁用超时。默认值可以使用 browser_context.set_default_timeout(timeout) or page.set_default_timeout(timeout) 方法更改。#trial<bool> 设置后,此方法仅执行 actionability 检查并跳过该操作。默认为false。用于在不执行操作的情况下等待元素准备好。 Added in: v1.11#- 返回值: <NoneType>#
此方法通过执行以下步骤悬停在匹配 selector 的元素上:
- 查找匹配
selector的元素。如果没有,请等待直到匹配的元素附加到 DOM。 - 等待对匹配元素进行 actionability 检查,除非设置了
force选项。如果元素在检查期间分离,则重试整个操作。 - 如果需要,将元素滚动到视图中。
- 使用 page.mouse 悬停在元素的中心或指定的
position上。 - 等待启动的导航成功或失败,除非设置了
noWaitAfter选项。
当所有步骤组合在一起未在指定的 timeout 期间完成时,此方法将引发 TimeoutError。传递零超时将禁用此功能。
主框架的 frame.hover(selector, **kwargs) 的快捷方式。
page.inner_html(selector, **kwargs)
Added in: v1.8selector<str> 要查找元素的选着器。如果有多个元素满足选择器,则使用第一个。有关详细信息,请参阅使用选择器。#strict<bool> 如果为 true,则调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用抛出异常。Added in: v1.14#timeout<float> 最大时间(以毫秒为单位),默认为 30 秒,传递0以禁用超时。默认值可以使用 browser_context.set_default_timeout(timeout) or page.set_default_timeout(timeout) 方法更改。#- 返回值: <str>#
返回 element.innerHTML。
page.inner_text(selector, **kwargs)
Added in: v1.8selector<str> 要查找元素的选着器。如果有多个元素满足选择器,则使用第一个。有关详细信息,请参阅使用选择器。#strict<bool> 如果为 true,则调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用抛出异常。Added in: v1.14#timeout<float> 最大时间(以毫秒为单位),默认为 30 秒,传递0以禁用超时。默认值可以使用 browser_context.set_default_timeout(timeout) or page.set_default_timeout(timeout) 方法更改。#- 返回值: <str>#
返回 element.innerText。
page.input_value(selector, **kwargs)
Added in: v1.13selector<str> 要查找元素的选着器。如果有多个元素满足选择器,则使用第一个。有关详细信息,请参阅使用选择器。#strict<bool> 如果为 true,则调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用抛出异常。Added in: v1.14#timeout<float> 最大时间(以毫秒为单位),默认为 30 秒,传递0以禁用超时。默认值可以使用 browser_context.set_default_timeout(timeout) or page.set_default_timeout(timeout) 方法更改。#- 返回值: <str>#
返回所选 <input> 或 <textarea> 或 <select> 元素的 input.value。
如果是非输入元素,则抛出异常。但是,如果元素位于具有关联 control 的 <label> 元素内,则返回控件的值。
page.is_checked(selector, **kwargs)
Added in: v1.8selector<str> A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used. See working with selectors for more details.#strict<bool> 如果为 true,则调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用抛出异常。Added in: v1.14#timeout<float> 最大时间(以毫秒为单位),默认为 30 秒,传递0以禁用超时。默认值可以使用 browser_context.set_default_timeout(timeout) or page.set_default_timeout(timeout) 方法更改。#- 返回值: <bool>#
返回元素是否被选中。如果元素不是复选框或单选输入,则抛出异常。
page.is_closed()
Added in: v1.8指示页面是否已关闭。
page.is_disabled(selector, **kwargs)
Added in: v1.8selector<str> 要查找元素的选着器。如果有多个元素满足选择器,则使用第一个。有关详细信息,请参阅使用选择器。#strict<bool> 如果为 true,则调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用抛出异常。Added in: v1.14#timeout<float> 最大时间(以毫秒为单位),默认为 30 秒,传递0以禁用超时。默认值可以使用 browser_context.set_default_timeout(timeout) or page.set_default_timeout(timeout) 方法更改。#- 返回值: <bool>#
返回元素是否被禁用,与 enabled 相反。
page.is_editable(selector, **kwargs)
Added in: v1.8selector<str> 要查找元素的选着器。如果有多个元素满足选择器,则使用第一个。有关详细信息,请参阅使用选择器。#strict<bool> 如果为 true,则调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用抛出异常。Added in: v1.14#timeout<float> 最大时间(以毫秒为单位),默认为 30 秒,传递0以禁用超时。默认值可以使用 browser_context.set_default_timeout(timeout) or page.set_default_timeout(timeout) 方法更改。#- 返回值: <bool>#
返回元素是否可编辑。
page.is_enabled(selector, **kwargs)
Added in: v1.8selector<str> 要查找元素的选着器。如果有多个元素满足选择器,则使用第一个。有关详细信息,请参阅使用选择器。#strict<bool> 如果为 true,则调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用抛出异常。Added in: v1.14#timeout<float> 最大时间(以毫秒为单位),默认为 30 秒,传递0以禁用超时。默认值可以使用 browser_context.set_default_timeout(timeout) or page.set_default_timeout(timeout) 方法更改。#- 返回值: <bool>#
返回元素是否已启用。
page.is_hidden(selector, **kwargs)
Added in: v1.8selector<str> 要查找元素的选着器。如果有多个元素满足选择器,则使用第一个。有关详细信息,请参阅使用选择器。#strict<bool> 如果为 true,则调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用抛出异常。Added in: v1.14#timeout<float> 已弃用 此选项被忽略。page.is_hidden(selector, **kwargs) 具有不会等待元素隐藏并立即返回。#- 返回值: <bool>#
返回元素是否隐藏,与 visible 相反。不匹配任何元素的 selector 被认为是隐藏的。
page.is_visible(selector, **kwargs)
Added in: v1.8selector<str> 要查找元素的选着器。如果有多个元素满足选择器,则使用第一个。有关详细信息,请参阅使用选择器。#strict<bool> 如果为 true,则调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用抛出异常。Added in: v1.14#timeout<float> 已弃用 此选项被忽略。page.is_visible(selector, **kwargs) 不会等待元素可见并立即返回。#- 返回值: <bool>#
返回元素是否 visible。不匹配任何元素的 selector 被认为不可见。
page.locator(selector, **kwargs)
Added in: v1.14has<Locator> 匹配包含匹配内部定位器的元素的元素。内部定位器针对外部定位器进行查询。例如,具有text=Playwright的article匹配<article><div>Playwright</div></article>。#请注意,外部和内部定位器必须属于同一框架。内部定位器不得包含 FrameLocators。
has_text<str|Pattern> 匹配在内部某个位置(可能是在子元素或后代元素中)包含指定文本的元素。当传递 [string] 时,匹配不区分大小写并搜索子字符串。例如,"Playwright"匹配<article><div>Playwright</div></article>。#
该方法返回一个元素定位器,可用于在此页面/框架上执行操作。定位器在执行操作之前立即解析为元素,因此对同一定位器的一系列操作实际上可以在不同的 DOM 元素上执行。如果这些操作之间的 DOM 结构发生了变化,就会发生这种情况。
page.main_frame
Added in: v1.8页面的主框架。页面保证具有在导航期间持续存在的主框架。
page.opener()
Added in: v1.8返回弹出页面的 opener,对于其他页面返回 null。如果 opener 已关闭,则返回 null。
page.pause()
Added in: v1.9暂停脚本执行。Playwright 将停止执行脚本,并等待用户按下页面覆盖层中的 "Resume" 按钮或在 DevTools 控制台中调用 playwright.resume()。
用户可以在暂停时检查选择器或执行手动步骤。恢复将从暂停的地方继续运行原始脚本。
此方法要求 Playwright 以有头模式启动,即在 browser_type.launch(**kwargs) 中设置 headless 值为假值。
page.pdf(**kwargs)
Added in: v1.8display_header_footer<bool> 显示页眉和页脚。默认为false。#footer_template<str> 打印页脚的 HTML 模板。应使用与header_template相同的格式。#format<str> 纸张格式。如果设置,优先于width或height选项。默认为 'Letter'。#header_template<str> 打印页眉的 HTML 模板。应为有效的 HTML 标记,并使用以下类将打印值注入其中:#'date'格式化的打印日期'title'文档标题'url'文档位置'pageNumber'当前页码'totalPages'文档总页数
height<str|float> 纸张高度,接受带单位的值。#landscape<bool> 纸张方向。默认为false。#margin<Dict> 纸张边距,默认为无。#page_ranges<str> 要打印的页面范围,例如 '1-5, 8, 11-13'。默认为空字符串,表示打印所有页面。#path<Union[str, pathlib.Path]> 将 PDF 保存到的文件路径。如果path是相对路径,则相对于当前工作目录进行解析。如果未提供路径,则 PDF 不会保存到磁盘。#prefer_css_page_size<bool> 使页面中声明的任何 CSS@page大小的优先级高于width和height或format选项中声明的大小。默认为false,这将缩放内容以适应纸张大小。#print_background<bool> 打印背景图形。默认为false。#scale<float> 网页渲染的比例。默认为1。比例值必须在 0.1 到 2 之间。#width<str|float> 纸张宽度,接受带单位的值。#- 返回值: <bytes>#
返回 PDF 缓冲区。
生成 pdf 目前仅在 Chromium 浏览器无头模式下受支持。
page.pdf() 使用 print css media 生成页面的 pdf。要生成带有 screen media 的 pdf,请在调用 page.pdf() 之前调用 page.emulate_media(**kwargs):
默认情况下,page.pdf() 生成带有修改颜色的 pdf 以进行打印。使用 -webkit-print-color-adjust 属性强制渲染准确的颜色。
- Sync
- Async
# generates a pdf with "screen" media type.
page.emulate_media(media="screen")
page.pdf(path="page.pdf")
# generates a pdf with "screen" media type.
await page.emulate_media(media="screen")
await page.pdf(path="page.pdf")
width、height 和 margin 选项接受带单位的值。未标记单位的值被视为像素。
一些例子:
page.pdf({width: 100})- 打印宽度设置为 100 像素page.pdf({width: '100px'})- 打印宽度设置为 100 像素page.pdf({width: '10cm'})- 打印宽度设置为 10 厘米。
所有可能的单位是:
px- 像素in- 英寸cm- 厘米mm- 毫米
format 选项是:
Letter: 8.5in x 11inLegal: 8.5in x 14inTabloid: 11in x 17inLedger: 17in x 11inA0: 33.1in x 46.8inA1: 23.4in x 33.1inA2: 16.54in x 23.4inA3: 11.7in x 16.54inA4: 8.27in x 11.7inA5: 5.83in x 8.27inA6: 4.13in x 5.83in
header_template 和 footer_template 标记有以下限制: > 1. 模板内的脚本标签不会被评估。 > 2. 页面样式在模板内不可见。
page.press(selector, key, **kwargs)
Added in: v1.8selector<str> 要查找元素的选着器。如果有多个元素满足选择器,则使用第一个。有关详细信息,请参阅使用选择器。#key<str> 要按下的键的名称或要生成的字符,例如ArrowLeft或a。#delay<float>keydown和keyup之间等待的时间(以毫秒为单位)。默认为 0。#no_wait_after<bool> 启动导航的操作正在等待这些导航发生并开始加载页面。您可以通过设置此标志选择不等待。您仅在特殊情况下需要此选项,例如导航到无法访问的页面。默认为false。#strict<bool> 如果为 true,则调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用抛出异常。Added in: v1.14#timeout<float> 最大时间(以毫秒为单位),默认为 30 秒,传递0以禁用超时。默认值可以使用 browser_context.set_default_timeout(timeout) or page.set_default_timeout(timeout) 方法更改。#- 返回值: <NoneType>#
聚焦元素,然后使用 keyboard.down(key) 和 keyboard.up(key)。
key 可以指定预期的 keyboardEvent.key 值或要为其生成文本的单个字符。可以在此处找到 key 值的超集。键的示例包括:
F1 - F12, Digit0- Digit9, KeyA- KeyZ, Backquote, Minus, Equal, Backslash, Backspace, Tab, Delete, Escape, ArrowDown, End, Enter, Home, Insert, PageDown, PageUp, ArrowRight, ArrowUp, 等等。
还支持以下修改快捷键:Shift, Control, Alt, Meta, ShiftLeft。
按住 Shift 将键入与大写 key 对应的文本。
如果 key 是单个字符,则区分大小写,因此值 a 和 A 将生成不同的相应文本。
还支持诸如 key: "Control+o" 或 key: "Control+Shift+T" 之类的快捷键。当指定修饰符时,按下修饰符并在按下后续键时保持按住。
- Sync
- Async
page = browser.new_page()
page.goto("https://keycode.info")
page.press("body", "A")
page.screenshot(path="a.png")
page.press("body", "ArrowLeft")
page.screenshot(path="arrow_left.png")
page.press("body", "Shift+O")
page.screenshot(path="o.png")
browser.close()
page = await browser.new_page()
await page.goto("https://keycode.info")
await page.press("body", "A")
await page.screenshot(path="a.png")
await page.press("body", "ArrowLeft")
await page.screenshot(path="arrow_left.png")
await page.press("body", "Shift+O")
await page.screenshot(path="o.png")
await browser.close()
page.query_selector(selector, **kwargs)
Added in: v1.9selector<str> 要查询的选择器。有关详细信息,请参阅使用选择器。#strict<bool> 如果为 true,则调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用抛出异常。Added in: v1.14#- 返回值: <NoneType|ElementHandle>#
不鼓励使用 ElementHandle,请改用 Locator 对象和 web-first 断言。
该方法在页面中查找匹配指定选择器的元素。如果没有元素匹配选择器,则返回值解析为 null。要等待页面上的元素,请使用 locator.wait_for(**kwargs)。
主框架的 frame.query_selector(selector, **kwargs) 的快捷方式。
page.query_selector_all(selector)
Added in: v1.9不鼓励使用 ElementHandle,请改用 Locator 对象和 web-first 断言。
该方法在页面中查找所有匹配指定选择器的元素。如果没有元素匹配选择器,则返回值解析为 []。
主框架的 frame.query_selector_all(selector) 的快捷方式。
page.reload(**kwargs)
Added in: v1.8timeout<float> 最大操作时间(以毫秒为单位),默认为 30 秒,传递0以禁用超时。默认值可以使用 browser_context.set_default_navigation_timeout(timeout), browser_context.set_default_timeout(timeout), page.set_default_navigation_timeout(timeout) or page.set_default_timeout(timeout) 方法更改。#wait_until<"load"|"domcontentloaded"|"networkidle"|"commit"> 何时认为操作成功,默认为load。事件可以是:#'domcontentloaded'- 认为操作在DOMContentLoaded事件触发时完成。'load'- 认为操作在load事件触发时完成。'networkidle'- 认为操作在至少500毫秒内没有网络连接时完成。'commit'- 认为操作在接收到网络响应并开始加载文档时完成。
- 返回值: <NoneType|Response>#
此方法重新加载当前页面,就像用户触发了浏览器刷新一样。返回主资源响应。在多次重定向的情况下,导航将使用最后一次重定向的响应进行解析。
page.route(url, handler, **kwargs)
Added in: v1.8url<str|Pattern|Callable[URL]:bool> 用于在路由时匹配的接收 URL 的 glob 模式、正则表达式模式或谓词。当通过上下文选项提供了base_url并且传递的 URL 是路径时,它是通过new URL()构造函数合并的。#handler<Callable[Route, Request]> 路由请求的处理程序函数。#times<int> 路由应该被使用的频率。默认情况下,它将每次都使用。Added in: v1.15#- 返回值: <NoneType>#
路由提供了修改页面发出的网络请求的能力。
一旦启用路由,每个匹配 url 模式的请求都将停止,除非它被继续、满足或中止。
如果响应是重定向,则处理程序将仅针对第一个 url 调用。
page.route(url, handler, **kwargs) 不会拦截被 Service Worker 拦截的请求。请参阅此问题。我们建议在使用请求拦截时通过将 browser.new_context.service_workers 设置为 'block' 来禁用 Service Workers。
中止所有图片请求的天真处理程序的示例:
- Sync
- Async
page = browser.new_page()
page.route("**/*.{png,jpg,jpeg}", lambda route: route.abort())
page.goto("https://example.com")
browser.close()
page = await browser.new_page()
await page.route("**/*.{png,jpg,jpeg}", lambda route: route.abort())
await page.goto("https://example.com")
await browser.close()
或者使用正则表达式模式的相同片段:
- Sync
- Async
page = browser.new_page()
page.route(re.compile(r"(\.png$)|(\.jpg$)"), lambda route: route.abort())
page.goto("https://example.com")
browser.close()
page = await browser.new_page()
await page.route(re.compile(r"(\.png$)|(\.jpg$)"), lambda route: route.abort())
await page.goto("https://example.com")
await browser.close()
可以检查请求以决定路由操作。例如,模拟所有包含某些发布数据的请求,并保持所有其他请求不变:
- Sync
- Async
def handle_route(route):
if ("my-string" in route.request.post_data)
route.fulfill(body="mocked-data")
else
route.continue_()
page.route("/api/**", handle_route)
def handle_route(route):
if ("my-string" in route.request.post_data)
route.fulfill(body="mocked-data")
else
route.continue_()
await page.route("/api/**", handle_route)
当请求匹配两个处理程序时,页面路由优先于浏览器上下文路由(通过 browser_context.route(url, handler, **kwargs) 设置)。
要删除带有处理程序的路由,可以使用 page.unroute(url, **kwargs)。
启用路由会禁用 http 缓存。
page.route_from_har(har, **kwargs)
Added in: v1.23har<Union[str, pathlib.Path]> 带有预录制网络数据的 HAR 文件路径。如果path是相对路径,则相对于当前工作目录进行解析。#not_found<"abort"|"fallback"> 如果设置为 'abort',任何在 HAR 文件中未找到的请求都将被中止。#- 如果设置为 'fallback',丢失的请求将发送到网络。
默认为 abort。
url<str|Pattern> 用于匹配请求 URL 的 glob 模式、正则表达式或谓词。只有 URL 匹配模式的请求才会从 HAR 文件提供服务。如果未指定,所有请求都从 HAR 文件提供服务。#
如果指定,页面中的网络请求将从 HAR 文件中提供。阅读更多关于从 HAR 重放。
Playwright 不会从 HAR 文件中提供被 Service Worker 拦截的请求。请参阅此问题。我们建议在使用请求拦截时通过将 browser.new_context.service_workers 设置为 'block' 来禁用 Service Workers。
page.screenshot(**kwargs)
Added in: v1.8animations<"disabled"|"allow"> 当设置为"disabled"时,停止 CSS 动画、CSS 过渡和 Web 动画。根据持续时间,动画会得到不同的处理:#- 有限的动画会快进到完成,因此它们会触发
transitionend事件。 - 无限的动画会取消到初始状态,然后在截图后重新播放。
默认为
"allow",保持动画不变。- 有限的动画会快进到完成,因此它们会触发
caret<"hide"|"initial"> 当设置为"hide"时,截图将隐藏文本插入符号。当设置为"initial"时,文本插入符号的行为将不会改变。默认为"hide"。#full_page<bool> 当为 true 时,截取完整的可滚动页面的屏幕截图,而不是当前可见的视口。默认为false。#mask<List[Locator]> 指定在截屏时应被遮罩的定位器。被遮罩的元素将被一个粉红色的框#FF00FF覆盖,该框完全覆盖其边界框。#omit_background<bool> 隐藏默认的白色背景并允许捕获具有透明度的屏幕截图。不适用于jpeg图像。默认为false。#path<Union[str, pathlib.Path]> 将图像保存到的文件路径。屏幕截图类型将从文件扩展名推断出来。如果path是相对路径,则相对于当前工作目录进行解析。如果未提供路径,则图像不会保存到磁盘。#scale<"css"|"device"> 当设置为"css"时,屏幕截图将在页面上的每个 css 像素对应一个像素。对于高 dpi 设备,这将保持屏幕截图较小。使用"device"选项将为每个设备像素生成一个像素,因此高 dpi 设备的屏幕截图将大两倍甚至更大。#默认为
"device"。timeout<float> 最大时间(以毫秒为单位),默认为 30 秒,传递0以禁用超时。默认值可以使用 browser_context.set_default_timeout(timeout) or page.set_default_timeout(timeout) 方法更改。#type<"png"|"jpeg"> 指定屏幕截图类型,默认为png。#
返回捕获的屏幕截图缓冲区。
page.select_option(selector, **kwargs)
Added in: v1.8selector<str> 要查找元素的选着器。如果有多个元素满足选择器,则使用第一个。有关详细信息,请参阅使用选择器。#force<bool> 是否绕过 actionability 检查。默认为false。Added in: v1.13#no_wait_after<bool> 启动导航的操作正在等待这些导航发生并开始加载页面。您可以通过设置此标志选择不等待。您仅在特殊情况下需要此选项,例如导航到无法访问的页面。默认为false。#strict<bool> 如果为 true,则调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用抛出异常。Added in: v1.14#timeout<float> 最大时间(以毫秒为单位),默认为 30 秒,传递0以禁用超时。默认值可以使用 browser_context.set_default_timeout(timeout) or page.set_default_timeout(timeout) 方法更改。#element<ElementHandle|List[ElementHandle]> 要选择的选项元素。可选。#index<int|List[int]> 要通过索引选择的选项。可选。#value<str|List[str]> 要通过值选择的选项。如果<select>具有multiple属性,则选择所有给定的选项,否则仅选择匹配传递选项之一的第一个选项。可选。#label<str|List[str]> 要通过标签选择的选项。如果<select>具有multiple属性,则选择所有给定的选项,否则仅选择匹配传递选项之一的第一个选项。可选。#- 返回值: <List[str]>#
此方法等待匹配 selector 的元素,等待 actionability 检查,等待直到所有指定的选项都存在于 <select> 元素中并选择这些选项。
如果目标元素不是 <select> 元素,此方法将引发错误。但是,如果元素位于具有关联 control 的 <label> 元素内,则将改为使用该控件。
返回已成功选择的选项值数组。
一旦所有提供的选项都被选中,就会触发 change 和 input 事件。
- Sync
- Async
# 匹配值的单选
page.select_option("select#colors", "blue")
# 匹配标签的单选
page.select_option("select#colors", label="blue")
# 多选
page.select_option("select#colors", value=["red", "green", "blue"])
# 匹配值的单选
await page.select_option("select#colors", "blue")
# 匹配标签的单选
await page.select_option("select#colors", label="blue")
# 多选
await page.select_option("select#colors", value=["red", "green", "blue"])
主 frame 的 frame.select_option(selector, **kwargs) 的快捷方式。
page.set_checked(selector, checked, **kwargs)
Added in: v1.15selector<str> 要查找元素的选着器。如果有多个元素满足选择器,则使用第一个。有关详细信息,请参阅使用选择器。#checked<bool> 选中还是取消选中复选框。#force<bool> 是否绕过 actionability 检查。默认为false。#no_wait_after<bool> 启动导航的操作正在等待这些导航发生并开始加载页面。您可以通过设置此标志选择不等待。您仅在特殊情况下需要此选项,例如导航到无法访问的页面。默认为false。#position<Dict> 相对于元素填充框左上角的点。如果未指定,则使用元素的某个可见点。#strict<bool> 如果为 true,则调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用抛出异常。#timeout<float> 最大时间(以毫秒为单位),默认为 30 秒,传递0以禁用超时。默认值可以使用 browser_context.set_default_timeout(timeout) or page.set_default_timeout(timeout) 方法更改。#trial<bool> 当设置时,此方法仅执行 actionability 检查并跳过操作。默认为false。用于在不执行操作的情况下等待元素准备好。#- 返回值: <NoneType>#
此方法通过执行以下步骤选中或取消选中与 selector 匹配的元素:
- 查找匹配
selector的元素。如果没有,等待直到匹配的元素附加到 DOM。 - 确保匹配的元素是复选框或单选输入。如果不是,此方法抛出异常。
- 如果元素已经具有正确的选中状态,则此方法立即返回。
- 等待匹配元素的 actionability 检查,除非设置了
force选项。如果元素在检查期间分离,则重试整个操作。 - 如果需要,将元素滚动到视图中。
- 使用 page.mouse 单击元素的中心。
- 等待启动的导航成功或失败,除非设置了
no_wait_after选项。 - 确保元素现在已选中或取消选中。如果不是,此方法抛出异常。
如果所有步骤合并在指定的 timeout 期间未完成,则此方法抛出 TimeoutError。传递零超时将禁用此功能。
主框架的 frame.set_checked(selector, checked, **kwargs) 的快捷方式。
page.set_content(html, **kwargs)
Added in: v1.8html<str> 要分配给页面的 HTML 标记。#timeout<float> 最大操作时间(以毫秒为单位),默认为 30 秒,传递0以禁用超时。默认值可以使用 browser_context.set_default_navigation_timeout(timeout), browser_context.set_default_timeout(timeout), page.set_default_navigation_timeout(timeout) or page.set_default_timeout(timeout) 方法更改。#wait_until<"load"|"domcontentloaded"|"networkidle"|"commit"> 何时认为操作成功,默认为load。事件可以是:#'domcontentloaded'- 认为操作在DOMContentLoaded事件触发时完成。'load'- 认为操作在load事件触发时完成。'networkidle'- 认为操作在至少500毫秒内没有网络连接时完成。'commit'- 认为操作在接收到网络响应并开始加载文档时完成。
- 返回值: <NoneType>#
page.set_default_navigation_timeout(timeout)
Added in: v1.8此设置将更改以下方法和相关快捷方式的默认最大导航时间:
- page.go_back(**kwargs)
- page.go_forward(**kwargs)
- page.goto(url, **kwargs)
- page.reload(**kwargs)
- page.set_content(html, **kwargs)
- page.expect_navigation(**kwargs)
- page.wait_for_url(url, **kwargs)
page.set_default_timeout(timeout)
Added in: v1.8此设置将更改所有接受 timeout 选项的方法的默认最大时间。
page.set_extra_http_headers(headers)
Added in: v1.8额外的 HTTP 标头将随页面发起的每个请求一起发送。
page.set_extra_http_headers(headers) 不保证传出请求中标头的顺序。
page.set_input_files(selector, files, **kwargs)
Added in: v1.8selector<str> 要查找元素的选着器。如果有多个元素满足选择器,则使用第一个。有关详细信息,请参阅使用选择器。#files<Union[str, pathlib.Path]|List[Union[str, pathlib.Path]]|Dict|List[Dict]>#no_wait_after<bool> 启动导航的操作正在等待这些导航发生并开始加载页面。您可以通过设置此标志选择不等待。您仅在特殊情况下需要此选项,例如导航到无法访问的页面。默认为false。#strict<bool> 如果为 true,则调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用抛出异常。Added in: v1.14#timeout<float> 最大时间(以毫秒为单位),默认为 30 秒,传递0以禁用超时。默认值可以使用 browser_context.set_default_timeout(timeout) or page.set_default_timeout(timeout) 方法更改。#- 返回值: <NoneType>#
将文件输入的值设置为这些文件路径或文件。如果某些 filePaths 是相对路径,则相对于当前工作目录进行解析。对于空数组,清除选定的文件。
此方法期望 selector 指向 input element。但是,如果元素位于具有关联 control 的 <label> 元素内,则以此控件为目标。
page.set_viewport_size(viewport_size)
Added in: v1.8在单个浏览器中有多个页面的情况下,每个页面都可以有自己的视口大小。但是,browser.new_context(**kwargs) 允许一次为上下文中的所有页面设置视口大小(及更多)。
page.set_viewport_size(viewport_size) 将调整页面大小。很多网站不期望手机改变大小,所以你应该在导航到页面之前设置视口大小。page.set_viewport_size(viewport_size) 也会重置 screen 大小,如果需要更好地控制这些属性,请使用带有 screen 和 viewport 参数的 browser.new_context(**kwargs)。
- Sync
- Async
page = browser.new_page()
page.set_viewport_size({"width": 640, "height": 480})
page.goto("https://example.com")
page = await browser.new_page()
await page.set_viewport_size({"width": 640, "height": 480})
await page.goto("https://example.com")
page.tap(selector, **kwargs)
Added in: v1.8selector<str> 要查找元素的选着器。如果有多个元素满足选择器,则使用第一个。有关详细信息,请参阅使用选择器。#force<bool> 是否绕过 actionability 检查。默认为false。#modifiers<List["Alt"|"Control"|"Meta"|"Shift"]> 要按下的修饰键。确保在操作期间只按下这些修饰符,然后恢复当前的修饰符。如果未指定,则使用当前按下的修饰符。#no_wait_after<bool> 启动导航的操作正在等待这些导航发生并开始加载页面。您可以通过设置此标志选择不等待。您仅在特殊情况下需要此选项,例如导航到无法访问的页面。默认为false。#position<Dict> 相对于元素填充框左上角的点。如果未指定,则使用元素的某个可见点。#strict<bool> 如果为 true,则调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用抛出异常。Added in: v1.14#timeout<float> 最大时间(以毫秒为单位),默认为 30 秒,传递0以禁用超时。默认值可以使用 browser_context.set_default_timeout(timeout) or page.set_default_timeout(timeout) 方法更改。#trial<bool> 当设置时,此方法仅执行 actionability 检查并跳过操作。默认为false。用于在不执行操作的情况下等待元素准备好。Added in: v1.11#- 返回值: <NoneType>#
此方法通过执行以下步骤点击匹配 selector 的元素:
- 查找匹配
selector的元素。如果没有,等待直到匹配的元素附加到 DOM。 - 等待匹配元素的 actionability 检查,除非设置了
force选项。如果元素在检查期间分离,则重试整个操作。 - 如果需要,将元素滚动到视图中。
- 使用 page.touchscreen 点击元素的中心或指定的
position。 - 等待启动的导航成功或失败,除非设置了
no_wait_after选项。
如果所有步骤合并在指定的 timeout 期间未完成,则此方法抛出 TimeoutError。传递零超时将禁用此功能。
page.tap(selector, **kwargs) 要求浏览器上下文的 has_touch 选项设置为 true。
主框架的 frame.tap(selector, **kwargs) 的快捷方式。
page.text_content(selector, **kwargs)
Added in: v1.8selector<str> 要查找元素的选着器。如果有多个元素满足选择器,则使用第一个。有关详细信息,请参阅使用选择器。#strict<bool> 如果为 true,则调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用抛出异常。Added in: v1.14#timeout<float> 最大时间(以毫秒为单位),默认为 30 秒,传递0以禁用超时。默认值可以使用 browser_context.set_default_timeout(timeout) or page.set_default_timeout(timeout) 方法更改。#- 返回值: <NoneType|str>#
返回 element.textContent。
page.title()
Added in: v1.8返回页面的标题。主框架的 frame.title() 的快捷方式。
page.type(selector, text, **kwargs)
Added in: v1.8selector<str> 要查找元素的选着器。如果有多个元素满足选择器,则使用第一个。有关详细信息,请参阅使用选择器。#text<str> 要输入到聚焦元素的文本。#delay<float> 按键之间等待的时间(以毫秒为单位)。默认为 0。#no_wait_after<bool> 启动导航的操作正在等待这些导航发生并开始加载页面。您可以通过设置此标志选择不等待。您仅在特殊情况下需要此选项,例如导航到无法访问的页面。默认为false。#strict<bool> 如果为 true,则调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用抛出异常。Added in: v1.14#timeout<float> 最大时间(以毫秒为单位),默认为 30 秒,传递0以禁用超时。默认值可以使用 browser_context.set_default_timeout(timeout) or page.set_default_timeout(timeout) 方法更改。#- 返回值: <NoneType>#
为文本中的每个字符发送 keydown、keypress/input 和 keyup 事件。page.type 可用于发送细粒度的键盘事件。要填充表单字段中的值,请使用 page.fill(selector, value, **kwargs)。
要按特殊键,如 Control 或 ArrowDown,请使用 keyboard.press(key, **kwargs)。
- Sync
- Async
page.type("#mytextarea", "hello") # 立即输入
page.type("#mytextarea", "world", delay=100) # 输入较慢,像用户一样
await page.type("#mytextarea", "hello") # 立即输入
await page.type("#mytextarea", "world", delay=100) # 输入较慢,像用户一样
主框架的 frame.type(selector, text, **kwargs) 的快捷方式。
page.uncheck(selector, **kwargs)
Added in: v1.8selector<str> 要查找元素的选着器。如果有多个元素满足选择器,则使用第一个。有关详细信息,请参阅使用选择器。#force<bool> 是否绕过 actionability 检查。默认为false。#no_wait_after<bool> 启动导航的操作正在等待这些导航发生并开始加载页面。您可以通过设置此标志选择不等待。您仅在特殊情况下需要此选项,例如导航到无法访问的页面。默认为false。#position<Dict> 相对于元素填充框左上角的点。如果未指定,则使用元素的某个可见点。Added in: v1.11#strict<bool> 如果为 true,则调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用抛出异常。Added in: v1.14#timeout<float> 最大时间(以毫秒为单位),默认为 30 秒,传递0以禁用超时。默认值可以使用 browser_context.set_default_timeout(timeout) or page.set_default_timeout(timeout) 方法更改。#trial<bool> 当设置时,此方法仅执行 actionability 检查并跳过操作。默认为false。用于在不执行操作的情况下等待元素准备好。Added in: v1.11#- 返回值: <NoneType>#
此方法通过执行以下步骤取消选中匹配 selector 的元素:
- 查找匹配
selector的元素。如果没有,等待直到匹配的元素附加到 DOM。 - 确保匹配的元素是复选框或单选输入。如果不是,此方法抛出异常。如果元素已经未选中,则此方法立即返回。
- 等待匹配元素的 actionability 检查,除非设置了
force选项。如果元素在检查期间分离,则重试整个操作。 - 如果需要,将元素滚动到视图中。
- 使用 page.mouse 单击元素的中心。
- 等待启动的导航成功或失败,除非设置了
no_wait_after选项。 - 确保元素现在已取消选中。如果不是,此方法抛出异常。
如果所有步骤合并在指定的 timeout 期间未完成,则此方法抛出 TimeoutError。传递零超时将禁用此功能。
主框架的 frame.uncheck(selector, **kwargs) 的快捷方式。
page.unroute(url, **kwargs)
Added in: v1.8url<str|Pattern|Callable[URL]:bool> 在路由时匹配接收 URL 的 glob 模式、正则表达式模式或谓词。#handler<Callable[Route, Request]> 可选的路由请求处理程序函数。#- 返回值: <NoneType>#
删除使用 page.route(url, handler, **kwargs) 创建的路由。未指定 handler 时,删除 url 的所有路由。
page.url
Added in: v1.8主框架的 frame.url 的快捷方式。
page.video
Added in: v1.8与此页面关联的视频对象。
page.viewport_size
Added in: v1.8page.wait_for_event(event, **kwargs)
Added in: v1.8event<str> 事件名称,通常传递给*.on(event)的相同名称。#predicate<Callable> 接收事件数据并在等待应解决时解析为真值。#timeout<float> 最大等待时间(以毫秒为单位)。默认为30000(30 秒)。传递0以禁用超时。默认值可以使用 browser_context.set_default_timeout(timeout) 更改。#- 返回值: <Any>#
在大多数情况下,您应该使用 page.expect_event(event, **kwargs)。
等待给定的 event 触发。如果提供了谓词,它将事件的值传递给 predicate 函数,并等待 predicate(event) 返回真值。如果在触发 event 之前页面关闭,则会引发错误。
page.wait_for_function(expression, **kwargs)
Added in: v1.8expression<str> 要在浏览器上下文中评估的 JavaScript 表达式。如果表达式评估为函数,则自动调用该函数。#arg<EvaluationArgument> 传递给expression的可选参数。#polling<float|"raf"> 如果polling为'raf',而在requestAnimationFrame回调中不断执行expression。如果polling是数字,则将其视为执行函数的时间间隔(以毫秒为单位)。默认为raf。#timeout<float> 最大等待时间(以毫秒为单位)。默认为30000(30 秒)。传递0以禁用超时。默认值可以使用 browser_context.set_default_timeout(timeout) 更改。#- 返回值: <JSHandle>#
当 expression 返回真值时返回。它解析为真值的 JSHandle。
page.wait_for_function(expression, **kwargs) 可用于观察视口大小变化:
- Sync
- Async
from playwright.sync_api import sync_playwright
def run(playwright):
webkit = playwright.webkit
browser = webkit.launch()
page = browser.new_page()
page.evaluate("window.x = 0; setTimeout(() => { window.x = 100 }, 1000);")
page.wait_for_function("() => window.x > 0")
browser.close()
with sync_playwright() as playwright:
run(playwright)
import asyncio
from playwright.async_api import async_playwright
async def run(playwright):
webkit = playwright.webkit
browser = await webkit.launch()
page = await browser.new_page()
await page.evaluate("window.x = 0; setTimeout(() => { window.x = 100 }, 1000);")
await page.wait_for_function("() => window.x > 0")
await browser.close()
async def main():
async with async_playwright() as playwright:
await run(playwright)
asyncio.run(main())
要向 page.wait_for_function(expression, **kwargs) 函数的谓词传递参数:
- Sync
- Async
selector = ".foo"
page.wait_for_function("selector => !!document.querySelector(selector)", selector)
selector = ".foo"
await page.wait_for_function("selector => !!document.querySelector(selector)", selector)
主框架的 frame.wait_for_function(expression, **kwargs) 的快捷方式。
page.wait_for_load_state(**kwargs)
Added in: v1.8state<"load"|"domcontentloaded"|"networkidle"> 要等待的可选加载状态,默认为load。如果在加载当前文档时已达到状态,则该方法立即解决。可以是以下之一:#'load'- 等待load事件触发。'domcontentloaded'- 等待DOMContentLoaded事件触发。'networkidle'- 等待直到至少500毫秒内没有网络连接。
timeout<float> 最大操作时间(以毫秒为单位),默认为 30 秒,传递0以禁用超时。默认值可以使用 browser_context.set_default_navigation_timeout(timeout), browser_context.set_default_timeout(timeout), page.set_default_navigation_timeout(timeout) or page.set_default_timeout(timeout) 方法更改。#- 返回值: <NoneType>#
当达到所需的加载状态时返回。
当页面达到所需的加载状态(默认为 load)时解决。调用此方法时必须已提交导航。如果当前文档已达到所需状态,则立即解决。
- Sync
- Async
page.get_by_role("button").click() # click triggers navigation.
page.wait_for_load_state() # the promise resolves after "load" event.
await page.get_by_role("button").click() # click triggers navigation.
await page.wait_for_load_state() # the promise resolves after "load" event.
- Sync
- Async
with page.expect_popup() as page_info:
page.get_by_role("button").click() # click triggers a popup.
popup = page_info.value
# Following resolves after "domcontentloaded" event.
popup.wait_for_load_state("domcontentloaded")
print(popup.title()) # popup is ready to use.
async with page.expect_popup() as page_info:
await page.get_by_role("button").click() # click triggers a popup.
popup = await page_info.value
# Following resolves after "domcontentloaded" event.
await popup.wait_for_load_state("domcontentloaded")
print(await popup.title()) # popup is ready to use.
主框架的 frame.wait_for_load_state(**kwargs) 的快捷方式。
page.wait_for_selector(selector, **kwargs)
Added in: v1.8selector<str> 要查询的选择器。有关详细信息,请参阅使用选择器。#state<"attached"|"detached"|"visible"|"hidden"> 默认为'visible'。可以是以下之一:#'attached'- 等待元素出现在 DOM 中。'detached'- 等待元素不出现在 DOM 中。'visible'- 等待元素具有非空边界框且没有visibility:hidden。请注意,没有任何内容或具有display:none的元素具有空边界框,并且不被视为可见。'hidden'- 等待元素均从 DOM 中分离,或者具有空边界框或visibility:hidden。这与'visible'选项相反。
strict<bool> 如果为 true,则调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用抛出异常。Added in: v1.14#timeout<float> 最大时间(以毫秒为单位),默认为 30 秒,传递0以禁用超时。默认值可以使用 browser_context.set_default_timeout(timeout) or page.set_default_timeout(timeout) 方法更改。#- 返回值: <NoneType|ElementHandle>#
当指定选择器的元素满足 state 选项时返回。如果等待 hidden 或 detached,则返回 null。
Playwright 会在执行操作之前自动等待元素就绪。使用 Locator 对象和 Web-First 断言使代码无需 wait_for_selector。
等待 selector 满足 state 选项(出现/从 dom 消失,或变为可见/隐藏)。如果调用该方法时 selector 已经满足条件,则该方法将立即返回。如果选择器在 timeout 毫秒内不满足条件,则函数将抛出异常。
此方法在导航期间有效:
- Sync
- Async
from playwright.sync_api import sync_playwright
def run(playwright):
chromium = playwright.chromium
browser = chromium.launch()
page = browser.new_page()
for current_url in ["https://google.com", "https://bbc.com"]:
page.goto(current_url, wait_until="domcontentloaded")
element = page.wait_for_selector("img")
print("Loaded image: " + str(element.get_attribute("src")))
browser.close()
with sync_playwright() as playwright:
run(playwright)
import asyncio
from playwright.async_api import async_playwright
async def run(playwright):
chromium = playwright.chromium
browser = await chromium.launch()
page = await browser.new_page()
for current_url in ["https://google.com", "https://bbc.com"]:
await page.goto(current_url, wait_until="domcontentloaded")
element = await page.wait_for_selector("img")
print("Loaded image: " + str(await element.get_attribute("src")))
await browser.close()
async def main():
async with async_playwright() as playwright:
await run(playwright)
asyncio.run(main())
page.wait_for_timeout(timeout)
Added in: v1.8等待给定的 timeout(以毫秒为单位)。
请注意,page.wait_for_timeout() 仅应用于调试。在生产中使用计时器的测试将变得不稳定。请改用网络事件、选择器变得可见等信号。
- Sync
- Async
# wait for 1 second
page.wait_for_timeout(1000)
# wait for 1 second
await page.wait_for_timeout(1000)
主框架的 frame.wait_for_timeout(timeout) 的快捷方式。
page.wait_for_url(url, **kwargs)
Added in: v1.11url<str|Pattern|Callable[URL]:bool> 等待导航时匹配的接收 URL 的 glob 模式、正则表达式模式或谓词。请注意,如果参数是不带通配符的字符串,则该方法将等待导航到与该字符串完全相等的 URL。#timeout<float> 最大操作时间(以毫秒为单位),默认为 30 秒,传递0以禁用超时。默认值可以使用 browser_context.set_default_navigation_timeout(timeout), browser_context.set_default_timeout(timeout), page.set_default_navigation_timeout(timeout) or page.set_default_timeout(timeout) 方法更改。#wait_until<"load"|"domcontentloaded"|"networkidle"|"commit"> 何时认为操作成功,默认为load。事件可以是:#'domcontentloaded'- 认为操作在DOMContentLoaded事件触发时完成。'load'- 认为操作在load事件触发时完成。'networkidle'- 认为操作在至少500毫秒内没有网络连接时完成。'commit'- 认为操作在接收到网络响应并开始加载文档时完成。
- 返回值: <NoneType>#
等待主框架导航到给定的 URL。
- Sync
- Async
page.click("a.delayed-navigation") # clicking the link will indirectly cause a navigation
page.wait_for_url("**/target.html")
await page.click("a.delayed-navigation") # clicking the link will indirectly cause a navigation
await page.wait_for_url("**/target.html")
主框架的 frame.wait_for_url(url, **kwargs) 的快捷方式。
page.workers
Added in: v1.8此方法返回与页面关联的所有专用 WebWorkers。
这不包含 ServiceWorkers
page.accessibility
Added in: v1.8- type: <Accessibility>
已弃用 此属性已弃用。如果您需要测试页面可访问性,请使用其他库,如 Axe。有关与 Axe 集成的信息,请参阅我们的 Node.js 指南。
page.keyboard
Added in: v1.8- type: <Keyboard>
page.mouse
Added in: v1.8- type: <Mouse>
page.request
Added in: v1.16- type: <APIRequestContext>
与此页面关联的 API 测试助手。此方法返回页面上下文中与 browser_context.request 相同的实例。有关详细信息,请参阅 browser_context.request。
page.touchscreen
Added in: v1.8- type: <Touchscreen>