BrowserContext
BrowserContext 提供了一种方式来操作多个相互独立的浏览器会话。
如果一个页面打开了另一个页面,例如通过 window.open
调用,那么弹窗会归属于父页面的浏览器上下文(BrowserContext)。
Playwright 允许通过 browser.new_context() 方法创建隔离的非持久化浏览器上下文。非持久化的浏览器上下文不会将任何浏览数据写入磁盘。
- 同步
- 异步
# 创建一个新的无痕浏览器上下文
context = browser.new_context()
# 在该上下文中创建一个新页面
page = context.new_page()
page.goto("https://example.com")
# 不再需要时销毁上下文
context.close()
# 创建一个新的无痕浏览器上下文
context = await browser.new_context()
# 在该上下文中创建一个新页面
page = await context.new_page()
await page.goto("https://example.com")
# 不再需要时销毁上下文
await context.close()
方法
add_cookies
v1.9 之前添加向此浏览器上下文添加 cookies。该上下文中的所有页面都将安装这些 cookies。可以通过 browser_context.cookies() 获取 cookies。
用法
- 同步
- 异步
browser_context.add_cookies([cookie_object1, cookie_object2])
await browser_context.add_cookies([cookie_object1, cookie_object2])
参数
cookies
List[Dict]#-
name
str -
value
str -
url
str (可选)必须提供 url 或 domain / path。可选。
-
domain
str (可选)若要让 cookie 适用于所有子域名,请在域名前加点,例如:".example.com"。必须提供 url 或 domain / path。可选。
-
path
str (可选)必须提供 url 或 domain / path。可选。
-
expires
float (可选)Unix 时间戳(秒)。可选。
-
httpOnly
bool (可选)可选。
-
secure
bool (可选)可选。
-
sameSite
"Strict" | "Lax" | "None" (可选)可选。
-
返回值
add_init_script
v1.9 之前添加添加一个脚本,在以下场景之一中会被执行:
- 每当在浏览器上下文中创建页面或页面发生导航时。
- 每当在该上下文的任意页面中附加或导航子 frame 时。在这种情况下,脚本会在新附加的 frame 的上下文中执行。
该脚本会在文档创建后、页面任何脚本运行前被执行。这对于修改 JavaScript 环境很有用,例如为 Math.random
设定种子。
用法
以下是在页面加载前重写 Math.random
的示例:
// preload.js
Math.random = () => 42;
- 同步
- 异步
# 在你的 playwright 脚本中,假设 preload.js 文件与脚本在同一目录下
browser_context.add_init_script(path="preload.js")
# 在你的 playwright 脚本中,假设 preload.js 文件与脚本在同一目录下
await browser_context.add_init_script(path="preload.js")
通过 browser_context.add_init_script() 和 page.add_init_script() 安装的多个脚本的执行顺序是不确定的。
参数
-
path
Union[str, pathlib.Path] (可选)#JavaScript 文件路径。如果
path
是相对路径,则相对于当前工作目录解析。可选。 -
要在浏览器上下文所有页面中执行的脚本。可选。
返回值
clear_cookies
v1.9 之前添加从上下文中移除 cookies。可接受可选的过滤条件。
用法
- 同步
- 异步
context.clear_cookies()
context.clear_cookies(name="session-id")
context.clear_cookies(domain="my-origin.com")
context.clear_cookies(path="/api/v1")
context.clear_cookies(name="session-id", domain="my-origin.com")
await context.clear_cookies()
await context.clear_cookies(name="session-id")
await context.clear_cookies(domain="my-origin.com")
await context.clear_cookies(path="/api/v1")
await context.clear_cookies(name="session-id", domain="my-origin.com")
参数
-
domain
str | Pattern (可选) v1.43 新增#仅移除指定 domain 的 cookies。
-
name
str | Pattern (可选) v1.43 新增#仅移除指定 name 的 cookies。
-
path
str | Pattern (可选) v1.43 新增#仅移除指定 path 的 cookies。
返回值
clear_permissions
v1.9 之前添加清除该浏览器上下文的所有权限覆盖。
用法
- 同步
- 异步
context = browser.new_context()
context.grant_permissions(["clipboard-read"])
# 执行相关操作 ..
context.clear_permissions()
context = await browser.new_context()
await context.grant_permissions(["clipboard-read"])
# 执行相关操作 ..
context.clear_permissions()
返回值
close
v1.9 之前添加关闭浏览器上下文。属于该上下文的所有页面都会被关闭。
默认的浏览器上下文无法被关闭。
用法
browser_context.close()
browser_context.close(**kwargs)
参数
返回值
cookies
v1.9 之前添加如果未指定 URL,则该方法返回所有 cookies。如果指定了 URL,则只返回影响这些 URL 的 cookies。
用法
browser_context.cookies()
browser_context.cookies(**kwargs)
参数
返回值
expect_console_message
v1.34 新增执行操作并等待该上下文中的页面记录 ConsoleMessage。如果提供了 predicate,则会将 ConsoleMessage 对象传递给 predicate
函数,并等待 predicate(message)
返回真值。如果页面在 browser_context.on("console") 事件触发前关闭,则会抛出错误。
用法
browser_context.expect_console_message()
browser_context.expect_console_message(**kwargs)
参数
-
predicate
Callable[ConsoleMessage]:bool (可选)#接收 ConsoleMessage 对象,当返回真值时结束等待。
-
最长等待时间(毫秒)。默认为
30000
(30 秒)。传入0
可禁用超时。默认值可通过 browser_context.set_default_timeout() 修改。
返回值
expect_event
v1.9 之前添加等待指定事件触发,并将事件值传递给 predicate 函数。当 predicate 返回真值时结束等待。如果在事件触发前上下文被关闭,则会抛出错误。返回事件数据的值。
用法
- 同步
- 异步
with context.expect_event("page") as event_info:
page.get_by_role("button").click()
page = event_info.value
async with context.expect_event("page") as event_info:
await page.get_by_role("button").click()
page = await event_info.value
参数
-
事件名称,与传递给
browserContext.on(event)
的名称一致。 -
接收事件数据,当返回真值时结束等待。
-
最长等待时间(毫秒)。默认为
30000
(30 秒)。传入0
可禁用超时。默认值可通过 browser_context.set_default_timeout() 修改。
返回值
expect_page
v1.9 新增执行操作并等待该上下文中新建一个 Page。如果提供了 predicate,则会将 Page 对象传递给 predicate
函数,并等待 predicate(event)
返回真值。如果在新 Page 创建前上下文被关闭,则会抛出错误。
用法
browser_context.expect_page()
browser_context.expect_page(**kwargs)
参数
-
predicate
Callable[Page]:bool (可选)#接收 Page 对象,当返回真值时结束等待。
-
最长等待时间(毫秒)。默认为
30000
(30 秒)。传入0
可禁用超时。默认值可通过 browser_context.set_default_timeout() 修改。
返回值
expose_binding
v1.9 之前添加该方法会在该上下文中所有页面的每个 frame 的 window
对象上添加一个名为 name 的函数。当该函数被调用时,会执行 callback,并返回一个 Promise,其值为 callback 的返回值。如果 callback 返回一个 Promise,则会等待其完成。
callback 的第一个参数包含调用者的信息:{ browserContext: BrowserContext, page: Page, frame: Frame }
。
参见 page.expose_binding() 了解仅页面级别的用法。
用法
以下示例演示如何将页面 URL 暴露给该上下文中所有页面的所有 frame:
- 同步
- 异步
from playwright.sync_api import sync_playwright, Playwright
def run(playwright: Playwright):
webkit = playwright.webkit
browser = webkit.launch(headless=False)
context = browser.new_context()
context.expose_binding("pageURL", lambda source: source["page"].url)
page = context.new_page()
page.set_content("""
<script>
async function onClick() {
document.querySelector('div').textContent = await window.pageURL();
}
</script>
<button onclick="onClick()">Click me</button>
<div></div>
""")
page.get_by_role("button").click()
with sync_playwright() as playwright:
run(playwright)
import asyncio
from playwright.async_api import async_playwright, Playwright
async def run(playwright: Playwright):
webkit = playwright.webkit
browser = await webkit.launch(headless=False)
context = await browser.new_context()
await context.expose_binding("pageURL", lambda source: source["page"].url)
page = await context.new_page()
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.get_by_role("button").click()
async def main():
async with async_playwright() as playwright:
await run(playwright)
asyncio.run(main())
参数
-
在 window 对象上暴露的函数名。
-
在 Playwright 上下文中被调用的回调函数。
-
已废弃
此选项未来将被移除。
是否以句柄方式传递参数,而不是按值传递。以句柄方式传递时仅支持一个参数,按值传递时支持多个参数。
返回值
expose_function
v1.9 之前添加该方法会在该上下文中所有页面的每个 frame 的 window
对象上添加一个名为 name 的函数。当该函数被调用时,会执行 callback,并返回一个 Promise,其值为 callback 的返回值。
如果 callback 返回一个 Promise,则会等待其完成。
参见 page.expose_function() 了解仅页面级别的用法。
用法
以下示例演示如何为该上下文中所有页面添加一个 sha256
函数:
- 同步
- 异步
import hashlib
from playwright.sync_api import sync_playwright
def sha256(text: str) -> str:
m = hashlib.sha256()
m.update(bytes(text, "utf8"))
return m.hexdigest()
def run(playwright: Playwright):
webkit = playwright.webkit
browser = webkit.launch(headless=False)
context = browser.new_context()
context.expose_function("sha256", sha256)
page = context.new_page()
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.get_by_role("button").click()
with sync_playwright() as playwright:
run(playwright)
import asyncio
import hashlib
from playwright.async_api import async_playwright, Playwright
def sha256(text: str) -> str:
m = hashlib.sha256()
m.update(bytes(text, "utf8"))
return m.hexdigest()
async def run(playwright: Playwright):
webkit = playwright.webkit
browser = await webkit.launch(headless=False)
context = await browser.new_context()
await context.expose_function("sha256", sha256)
page = await context.new_page()
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.get_by_role("button").click()
async def main():
async with async_playwright() as playwright:
await run(playwright)
asyncio.run(main())
参数
返回值
grant_permissions
v1.9 之前添加为浏览器上下文授予指定的权限。如果指定了 origin,则只为该 origin 授权对应权限。
用法
browser_context.grant_permissions(permissions)
browser_context.grant_permissions(permissions, **kwargs)
参数
-
要授予的权限列表。
危险支持的权限在不同浏览器之间,甚至同一浏览器的不同版本之间都可能不同。任何权限在浏览器升级后都可能失效。
以下是部分浏览器可能支持的权限:
'accelerometer'
'ambient-light-sensor'
'background-sync'
'camera'
'clipboard-read'
'clipboard-write'
'geolocation'
'gyroscope'
'magnetometer'
'microphone'
'midi-sysex'
(系统专用 midi)'midi'
'notifications'
'payment-handler'
'storage-access'
-
要授予权限的 origin,如 "https://example.com"。
返回值
new_cdp_session
v1.11 新增CDP 会话仅支持 Chromium 内核的浏览器。
返回新创建的会话。
用法
browser_context.new_cdp_session(page)
参数
返回值
new_page
v1.9 之前添加在浏览器上下文中创建一个新页面。
用法
browser_context.new_page()
返回值
route
v1.9 之前添加路由功能允许你修改该浏览器上下文中任意页面发起的网络请求。一旦启用路由,所有匹配 url 模式的请求都会被拦截,除非被继续、满足或中止。
browser_context.route() 不会拦截被 Service Worker 拦截的请求。参见 此问题。建议在使用请求拦截时,通过设置 service_workers 为 'block'
来禁用 Service Worker。
用法
以下是一个简单的处理器示例,用于中止所有图片请求:
- 同步
- 异步
context = browser.new_context()
page = context.new_page()
context.route("**/*.{png,jpg,jpeg}", lambda route: route.abort())
page.goto("https://example.com")
browser.close()
context = await browser.new_context()
page = await context.new_page()
await context.route("**/*.{png,jpg,jpeg}", lambda route: route.abort())
await page.goto("https://example.com")
await browser.close()
或者使用正则表达式模式实现相同功能:
- 同步
- 异步
context = browser.new_context()
page = context.new_page()
context.route(re.compile(r"(\.png$)|(\.jpg$)"), lambda route: route.abort())
page = await context.new_page()
page = context.new_page()
page.goto("https://example.com")
browser.close()
context = await browser.new_context()
page = await context.new_page()
await context.route(re.compile(r"(\.png$)|(\.jpg$)"), lambda route: route.abort())
page = await context.new_page()
await page.goto("https://example.com")
await browser.close()
你可以根据请求内容决定如何处理。例如,拦截所有包含特定 post 数据的请求并进行 mock,其他请求则正常放行:
- 同步
- 异步
def handle_route(route: Route):
# 如果 post_data 包含 "my-string",则 mock 返回,否则正常继续请求
if ("my-string" in route.request.post_data):
route.fulfill(body="mocked-data")
else:
route.continue_()
context.route("/api/**", handle_route)
async def handle_route(route: Route):
# 如果 post_data 包含 "my-string",则 mock 返回,否则正常继续请求
if ("my-string" in route.request.post_data):
await route.fulfill(body="mocked-data")
else:
await route.continue_()
await context.route("/api/**", handle_route)
页面级别的路由(通过 page.route() 设置)优先于浏览器上下文级别的路由,当请求同时匹配两个处理器时。
要移除某个路由及其处理器,可以使用 browser_context.unroute()。
启用路由会禁用 http 缓存。
参数
-
url
str | Pattern | Callable[URL]:bool#用于匹配请求的 glob 模式、正则表达式或接收 URL 的谓词函数。如果在上下文选项中设置了 base_url,且传入的 URL 是字符串且不以
*
开头,则会使用new URL()
构造函数进行解析。 -
handler
Callable[Route, Request]:Promise[Any] | Any#路由请求的处理函数。
-
路由可被使用的次数。默认每次都会使用。
返回值
route_from_har
v1.23 新增如果指定了该方法,则该上下文中的网络请求将会从 HAR 文件中进行响应。详见从 HAR 回放。
Playwright 不会对被 Service Worker 拦截的请求使用 HAR 文件进行响应。参见此问题。建议在使用请求拦截时,通过设置 service_workers 为 'block'
来禁用 Service Worker。
用法
browser_context.route_from_har(har)
browser_context.route_from_har(har, **kwargs)
参数
-
har
Union[str, pathlib.Path]#指定包含预录制网络数据的 HAR 文件路径。如果
path
是相对路径,则相对于当前工作目录解析。 -
not_found
"abort" | "fallback" (可选)#- 如果设置为 'abort',则 HAR 文件中未找到的请求会被中止。
- 如果设置为 'fallback',则会继续传递到下一个路由处理器。
默认为 abort。
-
如果指定,则会用实际的网络信息更新指定的 HAR 文件,而不是从文件中读取。文件会在调用 browser_context.close() 时写入磁盘。
-
update_content
"embed" | "attach" (可选) v1.32 新增#可选设置,用于控制资源内容的管理方式。如果指定为
attach
,资源会作为单独的文件或 ZIP 存档中的条目进行保存。如果指定为embed
,内容会以内联方式存储在 HAR 文件中。 -
update_mode
"full" | "minimal" (可选) v1.32 新增#当设置为
minimal
时,仅记录从 HAR 路由所需的信息。这样会省略大小、时序、页面、cookie、安全性等在回放 HAR 时不需要的 HAR 信息。默认为minimal
。 -
用于匹配请求 URL 的 glob 模式、正则表达式或谓词函数。只有 URL 匹配该模式的请求才会从 HAR 文件中响应。如果未指定,则所有请求都从 HAR 文件中响应。
返回值
route_web_socket
v1.48 新增该方法允许你修改该浏览器上下文中任意页面发起的 websocket 连接。
注意,只有在调用该方法后创建的 WebSocket
才会被路由。建议在创建任何页面之前调用此方法。
用法
下面是一个简单的处理器示例,用于拦截并阻止部分 websocket 消息。更多详情和示例见 WebSocketRoute。
- 同步
- 异步
def message_handler(ws: WebSocketRoute, message: Union[str, bytes]):
# 如果消息内容为 "to-be-blocked",则阻止该消息
if message == "to-be-blocked":
return
ws.send(message)
def handler(ws: WebSocketRoute):
ws.route_send(lambda message: message_handler(ws, message))
ws.connect()
context.route_web_socket("/ws", handler)
def message_handler(ws: WebSocketRoute, message: Union[str, bytes]):
# 如果消息内容为 "to-be-blocked",则阻止该消息
if message == "to-be-blocked":
return
ws.send(message)
async def handler(ws: WebSocketRoute):
ws.route_send(lambda message: message_handler(ws, message))
await ws.connect()
await context.route_web_socket("/ws", handler)
参数
-
url
str | Pattern | Callable[URL]:bool#只有 URL 匹配该模式的 WebSocket 才会被路由。字符串模式可以相对于 base_url 上下文选项。
-
handler
Callable[WebSocketRoute]:Promise[Any] | Any#用于路由 WebSocket 的处理函数。
返回值
set_default_navigation_timeout
v1.9 之前添加该设置会更改以下方法及相关快捷方式的默认最大导航时间:
- page.go_back()
- page.go_forward()
- page.goto()
- page.reload()
- page.set_content()
- page.expect_navigation()
用法
browser_context.set_default_navigation_timeout(timeout)
参数
set_default_timeout
v1.9 之前添加该设置会更改所有接受 timeout 选项的方法的默认最大超时时间。
用法
browser_context.set_default_timeout(timeout)
参数
set_extra_http_headers
v1.9 之前添加额外的 HTTP 头会随着该上下文中任意页面发起的每个请求一起发送。这些头会与通过 page.set_extra_http_headers() 设置的页面级别额外 HTTP 头合并。如果页面覆盖了某个头,则会优先使用页面级别的头部值,而不是浏览器上下文级别的值。
browser_context.set_extra_http_headers() 不保证请求头在实际请求中的顺序。
用法
browser_context.set_extra_http_headers(headers)
参数
返回值
set_geolocation
v1.9 之前添加设置该上下文的地理位置。传入 null
或 undefined
可模拟位置不可用。
用法
- 同步
- 异步
browser_context.set_geolocation({"latitude": 59.95, "longitude": 30.31667})
await browser_context.set_geolocation({"latitude": 59.95, "longitude": 30.31667})
建议使用 browser_context.grant_permissions() 授权浏览器上下文页面读取地理位置权限。
参数
返回值
set_offline
v1.9 之前添加用法
browser_context.set_offline(offline)
参数
返回值
storage_state
v1.9 之前添加返回该浏览器上下文的存储状态,包括当前 cookies、本地存储快照和 IndexedDB 快照。
用法
browser_context.storage_state()
browser_context.storage_state(**kwargs)
参数
-
indexed_db
bool (可选) v1.51 新增#设为
true
时,将 IndexedDB 包含在存储状态快照中。如果你的应用使用 IndexedDB 存储认证令牌(如 Firebase Authentication),请启用此项。 -
path
Union[str, pathlib.Path] (可选)#存储状态保存到的文件路径。如果 path 是相对路径,则相对于当前工作目录解析。如果未提供路径,则仍会返回存储状态,但不会保存到磁盘。
返回值
unroute
v1.9 之前添加移除通过 browser_context.route() 创建的路由。当未指定 handler 时,会移除该 url 的所有路由。
用法
browser_context.unroute(url)
browser_context.unroute(url, **kwargs)
参数
-
url
str | Pattern | Callable[URL]:bool#用于注册路由的 glob 模式、正则表达式或接收 URL 的谓词函数,需与 browser_context.route() 保持一致。
-
handler
Callable[Route, Request]:Promise[Any] | Any (可选)#可选的处理函数,用于注册路由时与 browser_context.route() 保持一致。
返回值
unroute_all
v1.41 新增移除通过 browser_context.route() 和 browser_context.route_from_har() 创建的所有路由。
用法
browser_context.unroute_all()
browser_context.unroute_all(**kwargs)
参数
-
behavior
"wait" | "ignoreErrors" | "default" (可选)#指定是否等待已在运行的处理器完成,以及在处理器抛出错误时的处理方式:
'default'
- 不等待当前处理器调用(如有)完成,如果未路由的处理器抛出异常,可能导致未处理的错误'wait'
- 等待当前处理器调用(如有)完成'ignoreErrors'
- 不等待当前处理器调用(如有)完成,未路由后处理器抛出的所有错误都会被静默捕获
返回值
wait_for_event
v1.9 之前添加大多数情况下,建议使用 browser_context.expect_event()。
等待指定的 event
事件触发。如果提供了 predicate,则会将事件的值传递给 predicate
函数,并等待 predicate(event)
返回真值。如果在事件触发前浏览器上下文被关闭,则会抛出错误。
用法
browser_context.wait_for_event(event)
browser_context.wait_for_event(event, **kwargs)
参数
-
事件名称,通常与传递给
*.on(event)
的名称一致。 -
接收事件数据,当返回真值时结束等待。
-
最长等待时间(毫秒)。默认为
30000
(30 秒)。传入0
可禁用超时。默认值可通过 browser_context.set_default_timeout() 修改。
返回值
属性
background_pages
v1.11 新增后台页面仅支持 Chromium 内核的浏览器。
该上下文中所有已存在的后台页面。
用法
browser_context.background_pages
返回值
browser
v1.9 之前添加返回该上下文所属的浏览器实例。如果是以持久化上下文启动,则返回 null。
用法
browser_context.browser
返回值
clock
v1.45 新增Playwright 支持模拟时钟和时间流逝。
用法
browser_context.clock
类型
pages
v1.9 之前添加返回该上下文中所有已打开的页面。
用法
browser_context.pages
返回值
request
v1.16 新增与该上下文关联的 API 测试辅助对象。通过该 API 发起的请求会使用上下文的 cookies。
用法
browser_context.request
类型
service_workers
v1.11 新增Service Worker 仅支持 Chromium 内核的浏览器。
该上下文中所有已存在的 Service Worker。
用法
browser_context.service_workers
返回值
tracing
v1.12 新增用法
browser_context.tracing
类型
事件
on("backgroundpage")
v1.11 新增仅适用于 Chromium 浏览器的持久化上下文。
当上下文中新建后台页面时触发。
- 同步
- 异步
background_page = context.wait_for_event("backgroundpage")
background_page = await context.wait_for_event("backgroundpage")
用法
browser_context.on("backgroundpage", handler)
事件数据
on("close")
v1.9 之前添加当浏览器上下文被关闭时触发。可能由于以下原因之一导致:
- 浏览器上下文被关闭。
- 浏览器应用被关闭或崩溃。
- 调用了 browser.close() 方法。
用法
browser_context.on("close", handler)
事件数据
on("console")
v1.34 新增当页面中的 JavaScript 调用 console API 方法(如 console.log
或 console.dir
)时触发。
传递给 console.log
的参数以及页面内容可通过 ConsoleMessage 事件处理器参数获取。
用法
- 同步
- 异步
def print_args(msg):
for arg in msg.args:
print(arg.json_value())
context.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)
context.on("console", print_args)
await page.evaluate("console.log('hello', 5, { foo: 'bar' })")
事件数据
on("dialog")
v1.34 新增当出现 JavaScript 对话框(如 alert
、prompt
、confirm
或 beforeunload
)时触发。监听器必须调用 dialog.accept() 或 dialog.dismiss() 来处理对话框,否则页面会冻结等待对话框,像点击这样的操作将无法完成。
用法
context.on("dialog", lambda dialog: dialog.accept())
当没有 page.on("dialog") 或 browser_context.on("dialog") 监听器时,所有对话框会被自动关闭。
事件数据
on("page")
v1.9 之前添加当在该浏览器上下文中创建新页面时触发该事件。此时页面可能仍在加载中。该事件也会在弹窗页面(popup)创建时触发。参见 page.on("popup") 以获取与特定页面相关的弹窗事件。
页面可用的最早时机是其已导航到初始 URL。例如,当通过 window.open('http://example.com')
打开一个弹窗时,只有当对 "http://example.com" 的网络请求完成并且响应开始在弹窗中加载时,该事件才会触发。如果你希望拦截/监听该网络请求,请分别使用 browser_context.route() 和 browser_context.on("request"),而不是在 Page 上使用类似方法。
- 同步
- 异步
with context.expect_page() as page_info:
page.get_by_text("open new page").click(),
page = page_info.value
print(page.evaluate("location.href"))
async with context.expect_page() as page_info:
await page.get_by_text("open new page").click(),
page = await page_info.value
print(await page.evaluate("location.href"))
使用 page.wait_for_load_state() 等待页面达到特定状态(大多数情况下无需手动等待)。
用法
browser_context.on("page", handler)
事件数据
on("request")
v1.12 新增当通过该上下文创建的任意页面发起请求时触发。该 request 对象为只读。如果只想监听某个页面的请求,请使用 page.on("request")。
如需拦截和修改请求,请参见 browser_context.route() 或 page.route()。
用法
browser_context.on("request", handler)
事件数据
on("requestfailed")
v1.12 新增当请求失败(例如超时)时触发。如果只想监听某个页面的失败请求,请使用 page.on("requestfailed")。
HTTP 错误响应(如 404 或 503)从 HTTP 角度来看仍然是成功响应,因此请求会以 browser_context.on("requestfinished") 事件完成,而不会触发 browser_context.on("requestfailed")。
用法
browser_context.on("requestfailed", handler)
事件数据
on("requestfinished")
v1.12 新增当请求成功完成并下载响应体后触发。对于成功的响应,事件顺序为 request
、response
和 requestfinished
。如需监听某个页面的成功请求,请使用 page.on("requestfinished")。
用法
browser_context.on("requestfinished", handler)
事件数据
on("response")
v1.12 新增当收到请求的 response 状态和响应头时触发。对于成功的响应,事件顺序为 request
、response
和 requestfinished
。如需监听某个页面的响应事件,请使用 page.on("response")。
用法
browser_context.on("response", handler)
事件数据
on("serviceworker")
v1.11 新增Service Worker 仅支持 Chromium 内核的浏览器。
当上下文中新建 Service Worker 时触发。
用法
browser_context.on("serviceworker", handler)
事件数据
on("weberror")
v1.38 新增当该上下文中任意页面出现未处理异常时触发。如需监听某个页面的错误,请使用 page.on("pageerror")。
用法
browser_context.on("weberror", handler)
事件数据