Skip to main content

Page

Page 提供与 Browser 中的单个选项卡或 Chromium 中的 extension background page 交互的方法。一个 Browser 实例可能有多个 Page 实例。

下面的示例创建一个 page,导航到一个 URL,然后保存截图:

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)

Page 类发出各种事件(如下所述),可以使用任何 Node 的原生 EventEmitter 方法处理,例如 ononceremoveListener

此示例记录单个页面 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")

Added in: v1.8

当页面关闭时触发。

page.on("console")

Added in: v1.8

当页面内的 JavaScript 调用控制台 API 方法之一时触发,例如 console.logconsole.dir。如果页面抛出错误或警告,也会触发。

传递给 console.log 的参数显示为事件处理程序的参数。

处理 console 事件的示例:

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'})")

page.on("crash")

Added in: v1.8

当页面崩溃时触发。如果浏览器页面尝试分配太多内存,它们可能会崩溃。当页面崩溃时,正在进行和后续的操作将抛出异常。

处理崩溃最常见的方法是捕获异常:

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".

page.on("dialog")

Added in: v1.8

当 JavaScript 对话框出现时触发,例如 alertpromptconfirmbeforeunload。监听器必须执行 dialog.accept(**kwargs)dialog.dismiss() 之一来处理对话框 - 否则页面将冻结等待对话框,并且点击等操作将永远不会完成。

page.on("dialog", lambda dialog: dialog.accept())
note

当不存在 page.on("dialog") 监听器时,所有对话框都会自动关闭。

page.on("domcontentloaded")

Added in: v1.9

当 JavaScript DOMContentLoaded 事件被分派时触发。

page.on("download")

Added in: v1.8

当附件下载开始时触发。用户可以通过传递的 Download 实例访问下载内容的基本文件操作。

page.on("filechooser")

Added in: v1.9

当文件选择器应该出现时触发,例如在点击 <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

当 frame 附加时触发。

page.on("framedetached")

Added in: v1.9

当 frame 分离时触发。

page.on("framenavigated")

Added in: v1.9

当 frame 导航到新的 url 时触发。

page.on("load")

Added in: v1.8

当 JavaScript load 事件被分派时触发。

page.on("pageerror")

Added in: v1.9

当页面内发生未捕获的异常时触发。

# 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>")

page.on("popup")

Added in: v1.8

当页面打开新标签页或窗口时触发。也就是 browser_context.on("page") 事件,但仅针对与此页面相关的弹出窗口发出。

最早可用的页面时刻是指它已导航到初始 url。例如,当使用 window.open('http://example.com') 打开弹出窗口时,该事件将在对 "http://example.com" 的网络请求完成且其响应已开始在弹出窗口中加载时触发。

with page.expect_event("popup") as page_info:
page.evaluate("window.open('https://example.com')")
popup = page_info.value
print(popup.evaluate("location.href"))
note

使用 page.wait_for_load_state(**kwargs) 等待页面达到特定状态(大多数情况下你不需要它)。

page.on("request")

Added in: v1.8

当页面发出请求时触发。request 对象是只读的。为了拦截和修改请求,请参阅 page.route(url, handler, **kwargs)browser_context.route(url, handler, **kwargs)

page.on("requestfailed")

Added in: v1.9

当请求失败时触发,例如超时。

page.on("requestfailed", lambda request: print(request.url + " " + request.failure.error_text))
note

HTTP 错误响应(如 404 或 503)从 HTTP 立场来看仍然是成功的响应,因此请求将以 page.on("requestfinished") 事件完成,而不是 page.on("requestfailed")。仅当客户端无法从服务器获取 HTTP 响应(例如由于网络错误 net::ERR_FAILED)时,请求才被视为失败。

page.on("requestfinished")

Added in: v1.9

当请求在下载响应体后成功完成时触发。对于成功的响应,事件序列为 requestresponserequestfinished

page.on("response")

Added in: v1.8

当接收到请求的 response 状态和标头时触发。对于成功的响应,事件序列为 requestresponserequestfinished

page.on("websocket")

Added in: v1.9

当发送 WebSocket 请求时触发。

page.on("worker")

Added in: v1.8

当页面生成专用 WebWorker 时触发。

page.add_init_script(**kwargs)

Added in: v1.8
  • path <Union[str, pathlib.Path]> JavaScript 文件的路径。如果 path 是相对路径,则相对于当前工作目录进行解析。可选。#
  • script <str> 要在浏览器上下文的所有页面中求值的脚本。可选。#
  • 返回值: <NoneType>#

添加一个在以下场景中求值的脚本:

  • 每当页面导航时。
  • 每当子 frame 附加或导航时。在这种情况下,脚本在附加的 frame 的上下文中求值。

脚本在文档创建后但在运行任何脚本之前求值。这对于修改 JavaScript 环境(例如为 Math.random 设定种子)很有用。

在页面加载前重写 Math.random 的示例:

// preload.js
Math.random = () => 42;
# in your playwright script, assuming the preload.js file is in same directory
page.add_init_script(path="./preload.js")
note

通过 browser_context.add_init_script(**kwargs)page.add_init_script(**kwargs) 安装的多个脚本的求值顺序未定义。

page.add_script_tag(**kwargs)

Added in: v1.8
  • content <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.8
  • content <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.8
  • selector <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 匹配的元素:

  1. 查找匹配 selector 的元素。如果没有,请等待直到匹配的元素附加到 DOM。
  2. 确保匹配的元素是复选框或单选输入。如果不是,此方法抛出异常。如果元素已选中,此方法立即返回。
  3. 等待匹配元素上的 actionability 检查,除非设置了 force 选项。如果元素在检查期间分离,则重试整个操作。
  4. 如果需要,将元素滚动到视图中。
  5. 使用 page.mouse 单击元素的中心。
  6. 等待启动的导航成功或失败,除非设置了 no_wait_after 选项。
  7. 确保元素现在已选中。如果不是,此方法抛出异常。

当所有步骤结合在一起在指定的 timeout 期间未完成时,此方法抛出 TimeoutError。传递零超时将禁用此功能。

这是主 frame 的 frame.check(selector, **kwargs) 的快捷方式。

page.click(selector, **kwargs)

Added in: v1.8
  • selector <str> 要查找元素的选着器。如果有多个元素满足选择器,则使用第一个。有关详细信息,请参阅使用选择器#
  • button <"left"|"right"|"middle"> 默认为 left#
  • click_count <int> 默认为 1。参见 UIEvent.detail#
  • delay <float> mousedownmouseup 之间等待的时间(以毫秒为单位)。默认为 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 的元素:

  1. 查找匹配 selector 的元素。如果没有,请等待直到匹配的元素附加到 DOM。
  2. 等待匹配元素上的 actionability 检查,除非设置了 force 选项。如果元素在检查期间分离,则重试整个操作。
  3. 如果需要,将元素滚动到视图中。
  4. 使用 page.mouse 单击元素的中心或指定的 position
  5. 等待启动的导航成功或失败,除非设置了 no_wait_after 选项。

当所有步骤结合在一起在指定的 timeout 期间未完成时,此方法抛出 TimeoutError。传递零超时将禁用此功能。

这是主 frame 的 frame.click(selector, **kwargs) 的快捷方式。

page.close(**kwargs)

Added in: v1.8

如果 run_before_unloadfalse,则不运行任何 unload 处理程序并等待页面关闭。如果 run_before_unloadtrue,则该方法将运行 unload 处理程序,但不会等待页面关闭。

默认情况下,page.close() 运行 beforeunload 处理程序。

note

如果 run_before_unload 传递为 true,则可能会召唤 beforeunload 对话框,并应通过 page.on("dialog") 事件手动处理。

page.content()

Added in: v1.8

获取页面的完整 HTML 内容,包括 doctype。

page.context

Added in: v1.8

获取页面所属的 browser context。

page.dblclick(selector, **kwargs)

Added in: v1.8
  • selector <str> 要查找元素的选着器。如果有多个元素满足选择器,则使用第一个。有关详细信息,请参阅使用选择器#
  • button <"left"|"right"|"middle"> 默认为 left#
  • delay <float> mousedownmouseup 之间等待的时间(以毫秒为单位)。默认为 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 的元素:

  1. 查找匹配 selector 的元素。如果没有,请等待直到匹配的元素附加到 DOM。
  2. 等待匹配元素上的 actionability 检查,除非设置了 force 选项。如果元素在检查期间分离,则重试整个操作。
  3. 如果需要,将元素滚动到视图中。
  4. 使用 page.mouse 双击元素的中心或指定的 position
  5. 等待启动的导航成功或失败,除非设置了 no_wait_after 选项。注意,如果 dblclick() 的第一次单击触发导航事件,此方法将抛出异常。

当所有步骤结合在一起在指定的 timeout 期间未完成时,此方法抛出 TimeoutError。传递零超时将禁用此功能。

note

page.dblclick() 分派两个 click 事件和一个 dblclick 事件。

这是主 frame 的 frame.dblclick(selector, **kwargs) 的快捷方式。

page.dispatch_event(selector, type, **kwargs)

Added in: v1.8
  • selector <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()

page.dispatch_event("button#submit", "click")

在底层,它根据给定的 type 创建事件的实例,使用 event_init 属性对其进行初始化,并在元素上分派它。默认情况下,事件是 composedcancelable 和冒泡的。

由于 event_init 是特定于事件的,请参阅事件文档以获取初始属性列表:

如果是要将实时对象传递到事件中,还可以将 JSHandle 指定为属性值:

# 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 })

page.drag_and_drop(source, target, **kwargs)

Added in: v1.13
  • source <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

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}
)

page.emulate_media(**kwargs)

Added in: v1.8
  • color_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' 媒体功能。

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
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")

page.eval_on_selector(selector, expression, **kwargs)

Added in: v1.9
  • selector <str> 要查询的选择器。有关更多详细信息,请参阅使用选择器#
  • expression <str> 要在浏览器上下文中求值的 JavaScript 表达式。如果表达式求值为函数,则会自动调用该函数。#
  • arg <EvaluationArgument> 传递给 expression 的可选参数。#
  • strict <bool> 如果为 true,则调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用抛出异常。Added in: v1.14#
  • 返回值: <Serializable>#
caution

此方法不会等待元素通过 actionability 检查,因此可能会导致测试不稳定。建议使用 locator.evaluate(expression, **kwargs)、其他 Locator 辅助方法或 web-first 断言。

该方法在页面内查找与指定选择器匹配的元素,并将其作为第一个参数传递给 expression。如果没有匹配选择器的元素,则该方法抛出异常。返回 expression 的值。

如果 expression 返回一个 Promise,则 page.eval_on_selector(selector, expression, **kwargs) 将等待 promise 解析并返回其值。

示例:

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")

主 frame 的 frame.eval_on_selector(selector, expression, **kwargs) 的快捷方式。

page.eval_on_selector_all(selector, expression, **kwargs)

Added in: v1.9
  • selector <str> 要查询的选择器。有关更多详细信息,请参阅使用选择器#
  • expression <str> 要在浏览器上下文中求值的 JavaScript 表达式。如果表达式求值为函数,则会自动调用该函数。#
  • arg <EvaluationArgument> 传递给 expression 的可选参数。#
  • 返回值: <Serializable>#
note

在大多数情况下,locator.evaluate_all(expression, **kwargs)、其他 Locator 辅助方法和 web-first 断言效果更好。

该方法在页面内查找与指定选择器匹配的所有元素,并将匹配的元素数组作为第一个参数传递给 expression。返回 expression 调用的结果。

如果 expression 返回一个 Promise,则 page.eval_on_selector_all(selector, expression, **kwargs) 将等待 promise 解析并返回其值。

Examples:

div_counts = page.eval_on_selector_all("div", "(divs, min) => divs.length >= min", 10)

page.evaluate(expression, **kwargs)

Added in: v1.8
  • expression <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 无法序列化的附加值:-0NaNInfinity-Infinity

将参数传递给 expression

result = page.evaluate("([x, y]) => Promise.resolve(x * y)", [7, 8])
print(result) # prints "56"

也可以传递字符串而不是函数:

print(page.evaluate("1 + 2")) # prints "3"
x = 10
print(page.evaluate(f"1 + {x}")) # prints "11"

ElementHandle 实例可以作为参数传递给 page.evaluate(expression, **kwargs)

body_handle = page.evaluate("document.body")
html = page.evaluate("([body, suffix]) => body.innerHTML + suffix", [body_handle, "hello"])
body_handle.dispose()

主 frame 的 frame.evaluate(expression, **kwargs) 的快捷方式。

page.evaluate_handle(expression, **kwargs)

Added in: v1.8
  • expression <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 解析并返回其值。

a_window_handle = page.evaluate_handle("Promise.resolve(window)")
a_window_handle # handle for the window object.

也可以传递字符串而不是函数:

a_handle = page.evaluate_handle("document") # handle for the "document"

JSHandle 实例可以作为参数传递给 page.evaluate_handle(expression, **kwargs)

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()

page.expect_console_message(**kwargs)

Added in: v1.9

执行操作并等待页面记录 ConsoleMessage。如果提供了 predicate,则将 ConsoleMessage 值传递给 predicate 函数,并等待 predicate(message) 返回真值。如果在触发 page.on("console") 事件之前关闭页面,则会抛出错误。

page.expect_download(**kwargs)

Added in: v1.9

执行操作并等待新的 Download。如果提供了 predicate,则将 Download 值传递给 predicate 函数,并等待 predicate(download) 返回真值。如果在触发下载事件之前关闭页面,则会抛出错误。

page.expect_event(event, **kwargs)

Added in: v1.8

等待事件触发并将其值传递给 predicate 函数。当 predicate 返回真值时返回。如果在触发事件之前关闭页面,则会抛出错误。返回事件数据值。

with page.expect_event("framenavigated") as event_info:
page.get_by_role("button")
frame = event_info.value

page.expect_file_chooser(**kwargs)

Added in: v1.9

执行操作并等待新的 FileChooser 创建。如果提供了 predicate,则将 FileChooser 值传递给 predicate 函数,并等待 predicate(fileChooser) 返回真值。如果在打开文件选择器之前关闭页面,则会抛出错误。

page.expect_navigation(**kwargs)

Added in: v1.8

等待主机架导航并返回主资源响应。如果发生多次重定向,导航将使用最后一次重定向的响应进行解析。如果导航到不同的锚点或由于使用了 History API 而进行导航,则导航将解析为 null

当页面导航到新 URL 或重新加载时,这将解析。这对于运行将间接导致页面导航的代码非常有用。例如,单击目标的 onclick 处理程序会触发来自 setTimeout 的导航。考虑这个例子:

with page.expect_navigation():
page.click("a.delayed-navigation") # clicking the link will indirectly cause a navigation
# Resolves after navigation has finished
note

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.9

执行操作并等待弹出窗口 Page。如果提供了 predicate,则将 [Popup] 值传递给 predicate 函数,并等待 predicate(page) 返回真值。如果在触发弹出窗口事件之前关闭页面,则会抛出错误。

page.expect_request(url_or_predicate, **kwargs)

Added in: v1.8

等待匹配的请求并作为返回值。有关事件的更多详细信息,请参阅等待事件

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

page.expect_request_finished(**kwargs)

Added in: v1.12

执行操作并等待 Request 完成加载。如果提供了 predicate,则将 Request 值传递给 predicate 函数,并等待 predicate(request) 返回真值。如果在触发 page.on("requestfinished") 事件之前关闭页面,则会抛出错误。

page.expect_response(url_or_predicate, **kwargs)

Added in: v1.8

返回匹配的响应。有关事件的更多详细信息,请参阅等待事件

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

page.expect_websocket(**kwargs)

Added in: v1.9

执行操作并等待新的 WebSocket。如果提供了 predicate,则将 WebSocket 值传递给 predicate 函数,并等待 predicate(webSocket) 返回真值。如果在触发 WebSocket 事件之前关闭页面,则会抛出错误。

page.expect_worker(**kwargs)

Added in: v1.9

执行操作并等待新的 Worker。如果提供了 predicate,则将 Worker 值传递给 predicate 函数,并等待 predicate(worker) 返回真值。如果在触发 worker 事件之前关闭页面,则会抛出错误。

page.expose_binding(name, callback, **kwargs)

Added in: v1.8
  • name <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)

note

通过 page.expose_binding(name, callback, **kwargs) 安装的函数在导航后仍然存在。

将页面 URL 暴露给页面中所有 frame 的示例:

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)

传递元素句柄的示例:

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>
""")

page.expose_function(name, callback)

Added in: v1.8
  • name <str> window 对象上的函数名称。#
  • callback <Callable> 将在 Playwright 上下文中调用的回调函数。#
  • 返回值: <NoneType>#

该方法在页面的每个帧的 window 对象上添加一个名为 name 的函数。当调用时,该函数执行 callback 并返回一个 Promise,该 Promise 解析为 callback 的返回值。

如果 callback 返回一个 Promise,它将被等待。

有关上下文范围的暴露函数,请参阅 browser_context.expose_function(name, callback)

note

通过 page.expose_function(name, callback) 安装的函数在导航后仍然存在。

向页面添加 sha256 函数的示例:

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)

page.fill(selector, value, **kwargs)

Added in: v1.8
  • selector <str> 要查找元素的选着器。如果有多个元素满足选择器,则使用第一个。有关详细信息,请参阅使用选择器#
  • value <str> 要为 <input>, <textarea> or [contenteditable] 元素填充的值。#
  • force <bool> 是否绕过 actionability 检查。默认为 falseAdded 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.8

此方法获取具有 selector 的元素并聚焦它。如果没有匹配 selector 的元素,该方法将等待直到 DOM 中出现匹配的元素。

主框架的 frame.focus(selector, **kwargs) 的快捷方式。

page.frame(**kwargs)

Added in: v1.8

返回匹配指定条件的框架。必须指定 nameurl

frame = page.frame(name="frame-name")
frame = page.frame(url=r".*domain.*")

page.frame_locator(selector)

Added in: v1.17

在使用 iframe 时,我们可以创建一个 frame locator,它将进入 iframe 并允许在该 iframe 中选择元素。以下代码片段在 id 为 my-frame 的 iframe 中定位文本为 "Submit" 的元素,如 <iframe id="my-frame">

locator = page.frame_locator("#my-iframe").get_by_text("Submit")
locator.click()

page.frames

Added in: v1.8

附加到页面的所有框架的数组。

page.get_attribute(selector, name, **kwargs)

Added in: v1.8

返回元素属性值。

page.get_by_alt_text(text, **kwargs)

Added in: v1.27
  • text <str|Pattern> 要定位元素的文本。#
  • exact <bool> 是否查找完全匹配:区分大小写和全字符串。默认为 false。当按正则表达式定位时忽略。请注意,完全匹配仍会修剪空格。#
  • 返回值: <Locator>#

允许通过其 alt 文本定位元素。例如,此方法将通过 alt 文本 "Castle" 找到图像:

<img alt='Castle'>

page.get_by_label(text, **kwargs)

Added in: v1.27
  • text <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.27
  • text <str|Pattern> 要定位元素的文本。#
  • exact <bool> 是否查找完全匹配:区分大小写和全字符串。默认为 false。当按正则表达式定位时忽略。请注意,完全匹配仍会修剪空格。#
  • 返回值: <Locator>#

允许通过占位符文本定位输入元素。例如,此方法将通过占位符 "Country" 找到输入:

<input placeholder="Country">

page.get_by_role(role, **kwargs)

Added in: v1.27
  • role <"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 的可用值为 truefalse"mixed"#

    了解有关 aria-checked 的更多信息。

  • disabled <bool> 通常由 aria-disableddisabled 设置的布尔属性。#

    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 的可用值为 truefalse"mixed"#

    了解有关 aria-pressed 的更多信息。

  • selected <bool> 通常由 aria-selected 设置的布尔属性。#

    了解有关 aria-selected 的更多信息。

  • 返回值: <Locator>#

允许通过其 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.27
  • text <str|Pattern> 要定位元素的文本。#
  • exact <bool> 是否查找完全匹配:区分大小写和全字符串。默认为 false。当按正则表达式定位时忽略。请注意,完全匹配仍会修剪空格。#
  • 返回值: <Locator>#

允许定位包含给定文本的元素。考虑以下 DOM 结构:

<div>Hello <span>world</span></div>
<div>Hello</div>

您可以通过文本子字符串、精确字符串或正则表达式进行定位:

# 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),它允许按其他条件(如可访问角色)进行匹配,然后按文本内容进行过滤。

note

即使是完全匹配,按文本匹配也总是规范化空格。例如,它将多个空格转换为一个空格,将换行符转换为空格,并忽略前导和尾随空格。

note

类型为 button and submit 的输入元素由其 value 而不是文本内容匹配。例如,按文本 "Log in" 定位匹配 <input type=button value="Log in">

page.get_by_title(text, **kwargs)

Added in: v1.27
  • text <str|Pattern> 要定位元素的文本。#
  • exact <bool> 是否查找完全匹配:区分大小写和全字符串。默认为 false。当按正则表达式定位时忽略。请注意,完全匹配仍会修剪空格。#
  • 返回值: <Locator>#

允许通过其标题定位元素。例如,此方法将通过其标题 "Submit" 找到按钮:

<button title='Place the order'>Order Now</button>

page.go_back(**kwargs)

Added in: v1.8

返回主资源响应。在多次重定向的情况下,导航将使用最后一次重定向的响应进行解析。如果无法回退,则返回 null

导航到历史记录中的上一页。

page.go_forward(**kwargs)

Added in: v1.8

返回主资源响应。在多次重定向的情况下,导航将使用最后一次重定向的响应进行解析。如果无法前进,则返回 null

导航到历史记录中的下一页。

page.goto(url, **kwargs)

Added in: v1.8

返回主资源响应。在多次重定向的情况下,导航将使用第一个非重定向响应进行解析。

如果发生以下情况,该方法将引发错误:

  • 出现 SSL 错误(例如,在自签名证书的情况下)。
  • 目标 URL 无效。
  • 导航期间超出 timeout
  • 远程服务器不响应或无法访问。
  • 主资源加载失败。

当远程服务器返回任何有效的 HTTP 状态代码(包括 404 "Not Found" 和 500 "Internal Server Error")时,此方法不会引发错误。此类响应的状态代码可以通过调用 response.status 检索。

note

该方法要么引发错误,要么返回主资源响应。唯一的例外是导航到 about:blank 或导航到具有不同哈希的同一 URL,这将成功并返回 null

note

无头模式不支持导航到 PDF 文档。请参阅上游问题

主 frame 的 frame.goto(url, **kwargs) 的快捷方式

page.hover(selector, **kwargs)

Added in: v1.8
  • selector <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 的元素上:

  1. 查找匹配 selector 的元素。如果没有,请等待直到匹配的元素附加到 DOM。
  2. 等待对匹配元素进行 actionability 检查,除非设置了 force 选项。如果元素在检查期间分离,则重试整个操作。
  3. 如果需要,将元素滚动到视图中。
  4. 使用 page.mouse 悬停在元素的中心或指定的 position 上。
  5. 等待启动的导航成功或失败,除非设置了 noWaitAfter 选项。

当所有步骤组合在一起未在指定的 timeout 期间完成时,此方法将引发 TimeoutError。传递零超时将禁用此功能。

主框架的 frame.hover(selector, **kwargs) 的快捷方式。

page.inner_html(selector, **kwargs)

Added in: v1.8
  • selector <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.8
  • selector <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.13
  • selector <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.8

返回元素是否被选中。如果元素不是复选框或单选输入,则抛出异常。

page.is_closed()

Added in: v1.8

指示页面是否已关闭。

page.is_disabled(selector, **kwargs)

Added in: v1.8
  • selector <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.8
  • selector <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.8
  • selector <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.8
  • selector <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.8
  • selector <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.14
  • selector <str> 用于解析 DOM 元素的选择器。有关详细信息,请参阅使用选择器#

  • has <Locator> 匹配包含匹配内部定位器的元素的元素。内部定位器针对外部定位器进行查询。例如,具有 text=Playwrightarticle 匹配 <article><div>Playwright</div></article>#

    请注意,外部和内部定位器必须属于同一框架。内部定位器不得包含 FrameLocators。

  • has_text <str|Pattern> 匹配在内部某个位置(可能是在子元素或后代元素中)包含指定文本的元素。当传递 [string] 时,匹配不区分大小写并搜索子字符串。例如,"Playwright" 匹配 <article><div>Playwright</div></article>#

  • 返回值: <Locator>#

该方法返回一个元素定位器,可用于在此页面/框架上执行操作。定位器在执行操作之前立即解析为元素,因此对同一定位器的一系列操作实际上可以在不同的 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()

用户可以在暂停时检查选择器或执行手动步骤。恢复将从暂停的地方继续运行原始脚本。

note

此方法要求 Playwright 以有头模式启动,即在 browser_type.launch(**kwargs) 中设置 headless 值为假值。

page.pdf(**kwargs)

Added in: v1.8
  • display_header_footer <bool> 显示页眉和页脚。默认为 false#
  • footer_template <str> 打印页脚的 HTML 模板。应使用与 header_template 相同的格式。#
  • format <str> 纸张格式。如果设置,优先于 widthheight 选项。默认为 'Letter'。#
  • header_template <str> 打印页眉的 HTML 模板。应为有效的 HTML 标记,并使用以下类将打印值注入其中:#
    • 'date' 格式化的打印日期
    • 'title' 文档标题
    • 'url' 文档位置
    • 'pageNumber' 当前页码
    • 'totalPages' 文档总页数
  • height <str|float> 纸张高度,接受带单位的值。#
  • landscape <bool> 纸张方向。默认为 false#
  • margin <Dict> 纸张边距,默认为无。#
    • top <str|float> 上边距,接受带单位的值。默认为 0
    • right <str|float> 右边距,接受带单位的值。默认为 0
    • bottom <str|float> 下边距,接受带单位的值。默认为 0
    • left <str|float> 左边距,接受带单位的值。默认为 0
  • page_ranges <str> 要打印的页面范围,例如 '1-5, 8, 11-13'。默认为空字符串,表示打印所有页面。#
  • path <Union[str, pathlib.Path]> 将 PDF 保存到的文件路径。如果 path 是相对路径,则相对于当前工作目录进行解析。如果未提供路径,则 PDF 不会保存到磁盘。#
  • prefer_css_page_size <bool> 使页面中声明的任何 CSS @page 大小的优先级高于 widthheightformat 选项中声明的大小。默认为 false,这将缩放内容以适应纸张大小。#
  • print_background <bool> 打印背景图形。默认为 false#
  • scale <float> 网页渲染的比例。默认为 1。比例值必须在 0.1 到 2 之间。#
  • width <str|float> 纸张宽度,接受带单位的值。#
  • 返回值: <bytes>#

返回 PDF 缓冲区。

note

生成 pdf 目前仅在 Chromium 浏览器无头模式下受支持。

page.pdf() 使用 print css media 生成页面的 pdf。要生成带有 screen media 的 pdf,请在调用 page.pdf() 之前调用 page.emulate_media(**kwargs)

note

默认情况下,page.pdf() 生成带有修改颜色的 pdf 以进行打印。使用 -webkit-print-color-adjust 属性强制渲染准确的颜色。

# generates a pdf with "screen" media type.
page.emulate_media(media="screen")
page.pdf(path="page.pdf")

widthheightmargin 选项接受带单位的值。未标记单位的值被视为像素。

一些例子:

  • page.pdf({width: 100}) - 打印宽度设置为 100 像素
  • page.pdf({width: '100px'}) - 打印宽度设置为 100 像素
  • page.pdf({width: '10cm'}) - 打印宽度设置为 10 厘米。

所有可能的单位是:

  • px - 像素
  • in - 英寸
  • cm - 厘米
  • mm - 毫米

format 选项是:

  • Letter: 8.5in x 11in
  • Legal: 8.5in x 14in
  • Tabloid: 11in x 17in
  • Ledger: 17in x 11in
  • A0: 33.1in x 46.8in
  • A1: 23.4in x 33.1in
  • A2: 16.54in x 23.4in
  • A3: 11.7in x 16.54in
  • A4: 8.27in x 11.7in
  • A5: 5.83in x 8.27in
  • A6: 4.13in x 5.83in
note

header_templatefooter_template 标记有以下限制: > 1. 模板内的脚本标签不会被评估。 > 2. 页面样式在模板内不可见。

page.press(selector, key, **kwargs)

Added in: v1.8
  • selector <str> 要查找元素的选着器。如果有多个元素满足选择器,则使用第一个。有关详细信息,请参阅使用选择器#
  • key <str> 要按下的键的名称或要生成的字符,例如 ArrowLefta#
  • delay <float> keydownkeyup 之间等待的时间(以毫秒为单位)。默认为 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 是单个字符,则区分大小写,因此值 aA 将生成不同的相应文本。

还支持诸如 key: "Control+o"key: "Control+Shift+T" 之类的快捷键。当指定修饰符时,按下修饰符并在按下后续键时保持按住。

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.query_selector(selector, **kwargs)

Added in: v1.9
  • selector <str> 要查询的选择器。有关详细信息,请参阅使用选择器#
  • strict <bool> 如果为 true,则调用要求选择器解析为单个元素。如果给定的选择器解析为多个元素,则调用抛出异常。Added in: v1.14#
  • 返回值: <NoneType|ElementHandle>#
caution

不鼓励使用 ElementHandle,请改用 Locator 对象和 web-first 断言。

该方法在页面中查找匹配指定选择器的元素。如果没有元素匹配选择器,则返回值解析为 null。要等待页面上的元素,请使用 locator.wait_for(**kwargs)

主框架的 frame.query_selector(selector, **kwargs) 的快捷方式。

page.query_selector_all(selector)

Added in: v1.9
caution

不鼓励使用 ElementHandle,请改用 Locator 对象和 web-first 断言。

该方法在页面中查找所有匹配指定选择器的元素。如果没有元素匹配选择器,则返回值解析为 []

主框架的 frame.query_selector_all(selector) 的快捷方式。

page.reload(**kwargs)

Added in: v1.8

此方法重新加载当前页面,就像用户触发了浏览器刷新一样。返回主资源响应。在多次重定向的情况下,导航将使用最后一次重定向的响应进行解析。

page.route(url, handler, **kwargs)

Added in: v1.8
  • url <str|Pattern|Callable[URL]:bool> 用于在路由时匹配的接收 URL 的 glob 模式、正则表达式模式或谓词。当通过上下文选项提供了 base_url 并且传递的 URL 是路径时,它是通过 new URL() 构造函数合并的。#
  • handler <Callable[Route, Request]> 路由请求的处理程序函数。#
  • times <int> 路由应该被使用的频率。默认情况下,它将每次都使用。Added in: v1.15#
  • 返回值: <NoneType>#

路由提供了修改页面发出的网络请求的能力。

一旦启用路由,每个匹配 url 模式的请求都将停止,除非它被继续、满足或中止。

note

如果响应是重定向,则处理程序将仅针对第一个 url 调用。

note

page.route(url, handler, **kwargs) 不会拦截被 Service Worker 拦截的请求。请参阅问题。我们建议在使用请求拦截时通过将 browser.new_context.service_workers 设置为 'block' 来禁用 Service Workers。

中止所有图片请求的天真处理程序的示例:

page = browser.new_page()
page.route("**/*.{png,jpg,jpeg}", lambda route: route.abort())
page.goto("https://example.com")
browser.close()

或者使用正则表达式模式的相同片段:

page = browser.new_page()
page.route(re.compile(r"(\.png$)|(\.jpg$)"), lambda route: route.abort())
page.goto("https://example.com")
browser.close()

可以检查请求以决定路由操作。例如,模拟所有包含某些发布数据的请求,并保持所有其他请求不变:

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)

当请求匹配两个处理程序时,页面路由优先于浏览器上下文路由(通过 browser_context.route(url, handler, **kwargs) 设置)。

要删除带有处理程序的路由,可以使用 page.unroute(url, **kwargs)

note

启用路由会禁用 http 缓存。

page.route_from_har(har, **kwargs)

Added in: v1.23
  • har <Union[str, pathlib.Path]> 带有预录制网络数据的 HAR 文件路径。如果 path 是相对路径,则相对于当前工作目录进行解析。#

  • not_found <"abort"|"fallback"> 如果设置为 'abort',任何在 HAR 文件中未找到的请求都将被中止。#

    • 如果设置为 'fallback',丢失的请求将发送到网络。

    默认为 abort。

  • update <bool> 如果指定,则使用实际网络信息更新给定的 HAR,而不是从文件提供服务。#

  • url <str|Pattern> 用于匹配请求 URL 的 glob 模式、正则表达式或谓词。只有 URL 匹配模式的请求才会从 HAR 文件提供服务。如果未指定,所有请求都从 HAR 文件提供服务。#

  • 返回值: <NoneType>#

如果指定,页面中的网络请求将从 HAR 文件中提供。阅读更多关于从 HAR 重放

Playwright 不会从 HAR 文件中提供被 Service Worker 拦截的请求。请参阅问题。我们建议在使用请求拦截时通过将 browser.new_context.service_workers 设置为 'block' 来禁用 Service Workers。

page.screenshot(**kwargs)

Added in: v1.8
  • animations <"disabled"|"allow"> 当设置为 "disabled" 时,停止 CSS 动画、CSS 过渡和 Web 动画。根据持续时间,动画会得到不同的处理:#

    • 有限的动画会快进到完成,因此它们会触发 transitionend 事件。
    • 无限的动画会取消到初始状态,然后在截图后重新播放。

    默认为 "allow",保持动画不变。

  • caret <"hide"|"initial"> 当设置为 "hide" 时,截图将隐藏文本插入符号。当设置为 "initial" 时,文本插入符号的行为将不会改变。默认为 "hide"#

  • clip <Dict> 指定结果图像剪切的对象。应具有以下字段:#

    • x <float> 剪切区域左上角的 x 坐标
    • y <float> 剪切区域左上角的 y 坐标
    • width <float> 剪切区域的宽度
    • height <float> 剪切区域的高度
  • full_page <bool> 当为 true 时,截取完整的可滚动页面的屏幕截图,而不是当前可见的视口。默认为 false#

  • mask <List[Locator]> 指定在截屏时应被遮罩的定位器。被遮罩的元素将被一个粉红色的框 #FF00FF 覆盖,该框完全覆盖其边界框。#

  • omit_background <bool> 隐藏默认的白色背景并允许捕获具有透明度的屏幕截图。不适用于 jpeg 图像。默认为 false#

  • path <Union[str, pathlib.Path]> 将图像保存到的文件路径。屏幕截图类型将从文件扩展名推断出来。如果 path 是相对路径,则相对于当前工作目录进行解析。如果未提供路径,则图像不会保存到磁盘。#

  • quality <int> 图像的质量,在 0-100 之间。不适用于 png 图像。#

  • 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#

  • 返回值: <bytes>#

返回捕获的屏幕截图缓冲区。

page.select_option(selector, **kwargs)

Added in: v1.8
  • selector <str> 要查找元素的选着器。如果有多个元素满足选择器,则使用第一个。有关详细信息,请参阅使用选择器#
  • force <bool> 是否绕过 actionability 检查。默认为 falseAdded 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> 元素内,则将改为使用该控件。

返回已成功选择的选项值数组。

一旦所有提供的选项都被选中,就会触发 changeinput 事件。

# 匹配值的单选
page.select_option("select#colors", "blue")
# 匹配标签的单选
page.select_option("select#colors", label="blue")
# 多选
page.select_option("select#colors", value=["red", "green", "blue"])

主 frame 的 frame.select_option(selector, **kwargs) 的快捷方式。

page.set_checked(selector, checked, **kwargs)

Added in: v1.15
  • selector <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 匹配的元素:

  1. 查找匹配 selector 的元素。如果没有,等待直到匹配的元素附加到 DOM。
  2. 确保匹配的元素是复选框或单选输入。如果不是,此方法抛出异常。
  3. 如果元素已经具有正确的选中状态,则此方法立即返回。
  4. 等待匹配元素的 actionability 检查,除非设置了 force 选项。如果元素在检查期间分离,则重试整个操作。
  5. 如果需要,将元素滚动到视图中。
  6. 使用 page.mouse 单击元素的中心。
  7. 等待启动的导航成功或失败,除非设置了 no_wait_after 选项。
  8. 确保元素现在已选中或取消选中。如果不是,此方法抛出异常。

如果所有步骤合并在指定的 timeout 期间未完成,则此方法抛出 TimeoutError。传递零超时将禁用此功能。

主框架的 frame.set_checked(selector, checked, **kwargs) 的快捷方式。

page.set_content(html, **kwargs)

Added in: v1.8

page.set_default_navigation_timeout(timeout)

Added in: v1.8
  • timeout <float> 最大导航时间(以毫秒为单位)#
  • 返回值: <NoneType>#

此设置将更改以下方法和相关快捷方式的默认最大导航时间:

page.set_default_timeout(timeout)

Added in: v1.8
  • timeout <float> 最大时间(以毫秒为单位)#
  • 返回值: <NoneType>#

此设置将更改所有接受 timeout 选项的方法的默认最大时间。

page.set_extra_http_headers(headers)

Added in: v1.8
  • headers <Dict[str, str]> 包含要随每个请求发送的附加 HTTP 标头的对象。所有标头值必须是字符串。#
  • 返回值: <NoneType>#

额外的 HTTP 标头将随页面发起的每个请求一起发送。

note

page.set_extra_http_headers(headers) 不保证传出请求中标头的顺序。

page.set_input_files(selector, files, **kwargs)

Added in: v1.8
  • selector <str> 要查找元素的选着器。如果有多个元素满足选择器,则使用第一个。有关详细信息,请参阅使用选择器#
  • files <Union[str, pathlib.Path]|List[Union[str, pathlib.Path]]|Dict|List[Dict]>#
    • name <str> 文件名
    • mimeType <str> 文件类型
    • buffer <bytes> 文件内容
  • 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
  • viewport_size <Dict>#
    • width <int> 页面宽度(以像素为单位)。
    • height <int> 页面高度(以像素为单位)。
  • 返回值: <NoneType>#

在单个浏览器中有多个页面的情况下,每个页面都可以有自己的视口大小。但是,browser.new_context(**kwargs) 允许一次为上下文中的所有页面设置视口大小(及更多)。

page.set_viewport_size(viewport_size) 将调整页面大小。很多网站不期望手机改变大小,所以你应该在导航到页面之前设置视口大小。page.set_viewport_size(viewport_size) 也会重置 screen 大小,如果需要更好地控制这些属性,请使用带有 screenviewport 参数的 browser.new_context(**kwargs)

page = browser.new_page()
page.set_viewport_size({"width": 640, "height": 480})
page.goto("https://example.com")

page.tap(selector, **kwargs)

Added in: v1.8
  • selector <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 的元素:

  1. 查找匹配 selector 的元素。如果没有,等待直到匹配的元素附加到 DOM。
  2. 等待匹配元素的 actionability 检查,除非设置了 force 选项。如果元素在检查期间分离,则重试整个操作。
  3. 如果需要,将元素滚动到视图中。
  4. 使用 page.touchscreen 点击元素的中心或指定的 position
  5. 等待启动的导航成功或失败,除非设置了 no_wait_after 选项。

如果所有步骤合并在指定的 timeout 期间未完成,则此方法抛出 TimeoutError。传递零超时将禁用此功能。

note

page.tap(selector, **kwargs) 要求浏览器上下文的 has_touch 选项设置为 true。

主框架的 frame.tap(selector, **kwargs) 的快捷方式。

page.text_content(selector, **kwargs)

Added in: v1.8

返回 element.textContent

page.title()

Added in: v1.8

返回页面的标题。主框架的 frame.title() 的快捷方式。

page.type(selector, text, **kwargs)

Added in: v1.8
  • selector <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>#

为文本中的每个字符发送 keydownkeypress/inputkeyup 事件。page.type 可用于发送细粒度的键盘事件。要填充表单字段中的值,请使用 page.fill(selector, value, **kwargs)

要按特殊键,如 ControlArrowDown,请使用 keyboard.press(key, **kwargs)

page.type("#mytextarea", "hello") # 立即输入
page.type("#mytextarea", "world", delay=100) # 输入较慢,像用户一样

主框架的 frame.type(selector, text, **kwargs) 的快捷方式。

page.uncheck(selector, **kwargs)

Added in: v1.8
  • selector <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 的元素:

  1. 查找匹配 selector 的元素。如果没有,等待直到匹配的元素附加到 DOM。
  2. 确保匹配的元素是复选框或单选输入。如果不是,此方法抛出异常。如果元素已经未选中,则此方法立即返回。
  3. 等待匹配元素的 actionability 检查,除非设置了 force 选项。如果元素在检查期间分离,则重试整个操作。
  4. 如果需要,将元素滚动到视图中。
  5. 使用 page.mouse 单击元素的中心。
  6. 等待启动的导航成功或失败,除非设置了 no_wait_after 选项。
  7. 确保元素现在已取消选中。如果不是,此方法抛出异常。

如果所有步骤合并在指定的 timeout 期间未完成,则此方法抛出 TimeoutError。传递零超时将禁用此功能。

主框架的 frame.uncheck(selector, **kwargs) 的快捷方式。

page.unroute(url, **kwargs)

Added in: v1.8

删除使用 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.8
  • 返回值: <NoneType|Dict>#
    • width <int> 页面宽度(以像素为单位)。
    • height <int> 页面高度(以像素为单位)。

page.wait_for_event(event, **kwargs)

Added in: v1.8
  • event <str> 事件名称,通常传递给 *.on(event) 的相同名称。#
  • predicate <Callable> 接收事件数据并在等待应解决时解析为真值。#
  • timeout <float> 最大等待时间(以毫秒为单位)。默认为 30000(30 秒)。传递 0 以禁用超时。默认值可以使用 browser_context.set_default_timeout(timeout) 更改。#
  • 返回值: <Any>#
note

在大多数情况下,您应该使用 page.expect_event(event, **kwargs)

等待给定的 event 触发。如果提供了谓词,它将事件的值传递给 predicate 函数,并等待 predicate(event) 返回真值。如果在触发 event 之前页面关闭,则会引发错误。

page.wait_for_function(expression, **kwargs)

Added in: v1.8
  • expression <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) 可用于观察视口大小变化:

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)

要向 page.wait_for_function(expression, **kwargs) 函数的谓词传递参数:

selector = ".foo"
page.wait_for_function("selector => !!document.querySelector(selector)", selector)

主框架的 frame.wait_for_function(expression, **kwargs) 的快捷方式。

page.wait_for_load_state(**kwargs)

Added in: v1.8

当达到所需的加载状态时返回。

当页面达到所需的加载状态(默认为 load)时解决。调用此方法时必须已提交导航。如果当前文档已达到所需状态,则立即解决。

page.get_by_role("button").click() # click triggers navigation.
page.wait_for_load_state() # the promise resolves after "load" event.
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.

主框架的 frame.wait_for_load_state(**kwargs) 的快捷方式。

page.wait_for_selector(selector, **kwargs)

Added in: v1.8
  • selector <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 选项时返回。如果等待 hiddendetached,则返回 null

note

Playwright 会在执行操作之前自动等待元素就绪。使用 Locator 对象和 Web-First 断言使代码无需 wait_for_selector

等待 selector 满足 state 选项(出现/从 dom 消失,或变为可见/隐藏)。如果调用该方法时 selector 已经满足条件,则该方法将立即返回。如果选择器在 timeout 毫秒内不满足条件,则函数将抛出异常。

此方法在导航期间有效:

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)

page.wait_for_timeout(timeout)

Added in: v1.8

等待给定的 timeout(以毫秒为单位)。

请注意,page.wait_for_timeout() 仅应用于调试。在生产中使用计时器的测试将变得不稳定。请改用网络事件、选择器变得可见等信号。

# wait for 1 second
page.wait_for_timeout(1000)

主框架的 frame.wait_for_timeout(timeout) 的快捷方式。

page.wait_for_url(url, **kwargs)

Added in: v1.11

等待主框架导航到给定的 URL。

page.click("a.delayed-navigation") # clicking the link will indirectly cause a navigation
page.wait_for_url("**/target.html")

主框架的 frame.wait_for_url(url, **kwargs) 的快捷方式。

page.workers

Added in: v1.8

此方法返回与页面关联的所有专用 WebWorkers

note

这不包含 ServiceWorkers

page.accessibility

Added in: v1.8

已弃用 此属性已弃用。如果您需要测试页面可访问性,请使用其他库,如 Axe。有关与 Axe 集成的信息,请参阅我们的 Node.js 指南

page.keyboard

Added in: v1.8

page.mouse

Added in: v1.8

page.request

Added in: v1.16

与此页面关联的 API 测试助手。此方法返回页面上下文中与 browser_context.request 相同的实例。有关详细信息,请参阅 browser_context.request

page.touchscreen

Added in: v1.8