跳至主要内容

BrowserContext

BrowserContexts 提供了一种操作多个独立浏览器会话的方式。

如果一个页面打开了另一个页面,例如通过window.open调用,弹出窗口将属于父页面的浏览器上下文。

Playwright允许通过browser.new_context()方法创建隔离的非持久性浏览器上下文。非持久性浏览器上下文不会向磁盘写入任何浏览数据。

# create a new incognito browser context
context = browser.new_context()
# create a new page inside context.
page = context.new_page()
page.goto("https://example.com")
# dispose context once it is no longer needed.
context.close()

方法

add_cookies

Added before v1.9 browserContext.add_cookies

将cookies添加到此浏览器上下文中。该上下文内的所有页面都将安装这些cookies。可以通过browser_context.cookies()获取cookies。

用法

browser_context.add_cookies([cookie_object1, cookie_object2])

参数

  • cookies 列表[字典]#
    • 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

Added before v1.9 browserContext.add_init_script

添加一个脚本,该脚本将在以下任一场景中被执行:

  • 每当在浏览器上下文中创建页面或进行导航时。
  • 每当浏览器上下文中任何页面的子框架被附加或导航时。在这种情况下,脚本会在新附加框架的上下文中进行评估。

脚本会在文档创建后但在其任何脚本运行前被评估。这对于修改JavaScript环境非常有用,例如用于初始化Math.random

用法

在页面加载前覆盖Math.random的示例:

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

通过browser_context.add_init_script()page.add_init_script()安装的多个脚本的执行顺序是未定义的。

参数

  • path Union[str, pathlib.Path] (可选参数)#

    JavaScript文件的路径。如果path是相对路径,则会相对于当前工作目录进行解析。此参数为可选。

  • script str (可选)#

    要在浏览器上下文中所有页面评估的脚本。可选。

返回


清除cookies

Added before v1.9 browserContext.clear_cookies

从上下文中移除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")

参数

  • domain str | Pattern (可选) 添加于: v1.43#

    仅移除具有指定域的cookies。

  • name str | Pattern (可选) 添加于: v1.43#

    仅移除具有指定名称的cookies。

  • path str | Pattern (可选参数) 添加于: v1.43#

    仅移除具有指定路径的cookies。

返回


clear_permissions

Added before v1.9 browserContext.clear_permissions

清除浏览器上下文的所有权限覆盖设置。

用法

context = browser.new_context()
context.grant_permissions(["clipboard-read"])
# do stuff ..
context.clear_permissions()

返回


关闭

Added before v1.9 browserContext.close

关闭浏览器上下文。属于该浏览器上下文的所有页面都将被关闭。

note

默认浏览器上下文无法关闭。

用法

browser_context.close()
browser_context.close(**kwargs)

参数

  • reason str (可选) 添加于: v1.40#

    要报告给被上下文关闭中断的操作的原因。

返回


cookies

Added before v1.9 browserContext.cookies

如果未指定URL,此方法将返回所有cookie。如果指定了URL,则仅返回影响这些URL的cookie。

用法

browser_context.cookies()
browser_context.cookies(**kwargs)

参数

返回


expect_console_message

Added in: v1.34 browserContext.expect_console_message

执行操作并等待上下文中的页面记录一个ConsoleMessage。如果提供了predicate,它会将ConsoleMessage值传递给predicate函数,并等待predicate(message)返回一个真值。如果在browser_context.on("console")事件触发前页面被关闭,将会抛出错误。

用法

browser_context.expect_console_message()
browser_context.expect_console_message(**kwargs)

参数

返回


expect_event

Added before v1.9 browserContext.expect_event

等待事件触发并将其值传递给谓词函数。当谓词返回真值时返回。如果在事件触发前上下文关闭,将抛出错误。返回事件数据值。

用法

with context.expect_event("page") as event_info:
page.get_by_role("button").click()
page = event_info.value

参数

  • event str#

    事件名称,与传入browserContext.on(event)的参数相同。

  • predicate Callable (可选)#

    接收事件数据,当等待应解决时解析为真值。

  • timeout float (可选参数)#

    最大等待时间,单位为毫秒。默认为30000(30秒)。传入0表示禁用超时。默认值可以通过browser_context.set_default_timeout()来修改。

返回


expect_page

Added in: v1.9 browserContext.expect_page

执行操作并等待上下文中创建一个新的Page。如果提供了predicate,它会将Page值传递给predicate函数,并等待predicate(event)返回真值。如果在创建新的Page之前上下文关闭,将会抛出错误。

用法

browser_context.expect_page()
browser_context.expect_page(**kwargs)

参数

返回


expose_binding

Added before v1.9 browserContext.expose_binding

该方法在上下文中每个页面的每个框架的window对象上添加一个名为name的函数。当被调用时,该函数执行callback并返回一个Promise,该Promise会解析为callback的返回值。如果callback返回一个Promise,它将被等待。

callback函数的第一个参数包含调用者的信息:{ browserContext: BrowserContext, page: Page, frame: Frame }

请参阅page.expose_binding()获取仅限页面的版本。

用法

一个示例,展示如何在上下文中向所有页面中的所有框架公开页面URL:

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)

参数

  • name str#

    窗口对象上的函数名称。

  • callback Callable#

    将在Playwright上下文中调用的回调函数。

  • handle bool (可选)#

    已弃用

    此选项将在未来版本中移除。

    是否将参数作为句柄传递,而不是按值传递。当传递句柄时,仅支持一个参数。当按值传递时,支持多个参数。

返回


expose_function

Added before v1.9 browserContext.expose_function

该方法在上下文环境中每个页面的每个框架的window对象上添加一个名为name的函数。当调用时,该函数执行callback并返回一个Promise,该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)

参数

  • name str#

    窗口对象上的函数名称。

  • callback Callable#

    将在Playwright上下文中调用的回调函数。

返回


grant_permissions

Added before v1.9 browserContext.grant_permissions

授予浏览器上下文指定的权限。如果指定了来源,则仅授予该来源相应的权限。

用法

browser_context.grant_permissions(permissions)
browser_context.grant_permissions(permissions, **kwargs)

参数

  • permissions List[str]#

    授予的权限列表。

    danger

    不同浏览器之间支持的权限有所不同,即使是同一浏览器的不同版本之间也可能存在差异。任何权限在更新后都可能停止工作。

    以下是一些可能被某些浏览器支持的权限:

    • '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 str (可选)#

    要授予权限的origin,例如"https://example.com"。

返回


new_cdp_session

Added in: v1.11 browserContext.new_cdp_session
note

CDP会话仅在基于Chromium的浏览器中受支持。

返回新创建的会话。

用法

browser_context.new_cdp_session(page)

参数

  • page Page | Frame#

    创建新会话的目标对象。为了向后兼容,这个参数被命名为page,但它可以是PageFrame类型。

返回


new_page

Added before v1.9 browserContext.new_page

在浏览器上下文中创建一个新页面。

用法

browser_context.new_page()

返回


路由

Added before v1.9 browserContext.route

路由功能提供了修改浏览器上下文中任何页面发出的网络请求的能力。一旦启用路由,每个匹配URL模式的请求都将被暂停,除非它被继续、完成或中止。

note

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

用法

一个简单的处理程序示例,它会中止所有图片请求:

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

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

def handle_route(route: Route):
if ("my-string" in route.request.post_data):
route.fulfill(body="mocked-data")
else:
route.continue_()
context.route("/api/**", handle_route)

当请求同时匹配多个处理器时,页面路由(通过page.route()设置)的优先级高于浏览器上下文路由。

要移除带有处理程序的路由,您可以使用 browser_context.unroute()

note

启用路由会禁用http缓存。

参数

  • url str | Pattern | Callable[URL]:bool#

    用于路由匹配时接收URL的全局模式、正则表达式模式或谓词。当通过上下文选项提供了base_url且传入的URL是路径时,会通过new URL()构造函数进行合并。

  • handler Callable[Route, Request]:Promise[Any] | Any#

    用于路由请求的处理函数。

  • times int (可选) 添加于: v1.15#

    路由应被使用的频率。默认情况下每次都会使用。

返回


route_from_har

Added in: v1.23 browserContext.route_from_har

如果指定了该选项,上下文中的网络请求将从HAR文件提供。了解更多关于从HAR回放的信息。

Playwright 不会处理由 Service Worker 从 HAR 文件拦截的请求。请参阅问题。我们建议在使用请求拦截时,通过将service_workers设置为'block'来禁用 Service Workers。

用法

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',将回退到处理程序链中的下一个路由处理程序。

    默认为中止。

  • update bool (可选)#

    如果指定,将使用实际的网络信息更新给定的HAR文件,而不是从文件提供。文件会在调用browser_context.close()时写入磁盘。

  • update_content "embed" | "attach" (可选) 添加于: v1.32#

    控制资源内容管理的可选设置。如果指定了attach,资源将作为单独的文件或ZIP存档中的条目持久保存。如果指定了embed,内容将内联存储在HAR文件中。

  • update_mode "full" | "minimal" (可选) 添加于: v1.32#

    当设置为minimal时,仅记录HAR路由所需的信息。这将省略大小、时间、页面、cookies、安全和其他类型的HAR信息,这些信息在从HAR回放时不会被使用。默认为minimal

  • url str | Pattern (可选)#

    用于匹配请求URL的通配符模式、正则表达式或谓词。只有URL匹配该模式的请求才会从HAR文件中获取响应。如果未指定,则所有请求都将从HAR文件中获取响应。

返回


route_web_socket

Added in: v1.48 browserContext.route_web_socket

该方法允许修改浏览器上下文中任何页面建立的websocket连接。

请注意,只有在此方法调用后创建的WebSocket才会被路由。建议在创建任何页面之前调用此方法。

用法

以下是一个简单处理程序的示例,它可以阻止某些WebSocket消息。更多详情和示例请参阅WebSocketRoute

def message_handler(ws: WebSocketRoute, message: Union[str, bytes]):
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)

参数

返回


设置默认导航超时

Added before v1.9 browserContext.set_default_navigation_timeout

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

用法

browser_context.set_default_navigation_timeout(timeout)

参数

  • timeout float#

    最大导航时间(毫秒)


set_default_timeout

Added before v1.9 browserContext.set_default_timeout

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

用法

browser_context.set_default_timeout(timeout)

参数

  • timeout float#

    最大时间(毫秒)。传入0表示禁用超时。


set_extra_http_headers

Added before v1.9 browserContext.set_extra_http_headers

额外的HTTP头信息将与上下文中任何页面发起的每个请求一起发送。这些头信息与通过page.set_extra_http_headers()设置的页面特定额外HTTP头信息合并。如果页面覆盖了特定头信息,将使用页面特定的头信息值而非浏览器上下文的头信息值。

note

browser_context.set_extra_http_headers() 不能保证传出请求中头信息的顺序。

用法

browser_context.set_extra_http_headers(headers)

参数

  • headers Dict[str, str]#

    一个包含要随每个请求发送的额外HTTP头信息的对象。所有头值必须是字符串。

返回


set_geolocation

Added before v1.9 browserContext.set_geolocation

设置上下文的定位地理位置。传入nullundefined将模拟位置不可用状态。

用法

browser_context.set_geolocation({"latitude": 59.95, "longitude": 30.31667})
note

考虑使用browser_context.grant_permissions()来授予浏览器上下文页面读取其地理位置的权限。

参数

  • geolocation NoneType | 字典#
    • latitude float

      介于-90到90之间的纬度值。

    • longitude float

      介于-180到180之间的经度值。

    • accuracy float (可选)

      非负精度值。默认为 0

返回


set_offline

Added before v1.9 browserContext.set_offline

用法

browser_context.set_offline(offline)

参数

  • offline bool#

    是否模拟浏览器上下文的网络离线状态。

返回


storage_state

Added before v1.9 browserContext.storage_state

返回此浏览器上下文的存储状态,包含当前cookies、本地存储快照和IndexedDB快照。

用法

browser_context.storage_state()
browser_context.storage_state(**kwargs)

参数

  • indexed_db bool (可选) 添加于: v1.51#

    设置为 true 以在存储状态快照中包含 IndexedDB。如果您的应用程序使用IndexedDB存储身份验证令牌(如Firebase身份验证),请启用此选项。

    注意

    目前不支持包含类型化数组的IndexedDB。

  • path Union[str, pathlib.Path] (可选参数)#

    存储状态要保存到的文件路径。如果path是相对路径,则会相对于当前工作目录进行解析。如果没有提供路径,存储状态仍会返回,但不会被保存到磁盘。

返回


取消路由

Added before v1.9 browserContext.unroute

移除通过browser_context.route()创建的路由。当未指定handler时,将移除该url的所有路由。

用法

browser_context.unroute(url)
browser_context.unroute(url, **kwargs)

参数

返回


unroute_all

Added in: v1.41 browserContext.unroute_all

移除所有通过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

Added before v1.9 browserContext.wait_for_event
note

在大多数情况下,您应该使用browser_context.expect_event()

等待给定的event触发。如果提供了predicate函数,会将事件值传入predicate函数并等待predicate(event)返回真值。如果在event触发前浏览器上下文被关闭,将会抛出错误。

用法

browser_context.wait_for_event(event)
browser_context.wait_for_event(event, **kwargs)

参数

  • event str#

    事件名称,通常与传入*.on(event)中的相同。

  • predicate Callable (可选)#

    接收事件数据,当等待应解决时解析为真值。

  • timeout float (可选参数)#

    最大等待时间,单位为毫秒。默认为30000(30秒)。传入0表示禁用超时。默认值可以通过browser_context.set_default_timeout()进行修改。

返回


属性

后台页面

Added in: v1.11 browserContext.background_pages
note

后台页面仅在基于Chromium的浏览器中受支持。

上下文中的所有现有后台页面。

用法

browser_context.background_pages

返回


浏览器

Added before v1.9 browserContext.browser

返回上下文的浏览器实例。如果是作为持久化上下文启动的,则返回null。

用法

browser_context.browser

返回


时钟

Added in: v1.45 browserContext.clock

Playwright 具备模拟时钟和时间流逝的功能。

用法

browser_context.clock

类型


页面

Added before v1.9 browserContext.pages

返回上下文中所有打开的页面。

用法

browser_context.pages

返回


请求

Added in: v1.16 browserContext.request

与此上下文关联的API测试助手。使用此API发出的请求将使用上下文中的cookies。

用法

browser_context.request

类型


service_workers

Added in: v1.11 browserContext.service_workers
note

Service workers 仅在基于 Chromium 的浏览器中受支持。

上下文中的所有现有服务工作者。

用法

browser_context.service_workers

返回


追踪

Added in: v1.12 browserContext.tracing

用法

browser_context.tracing

类型


事件

on("backgroundpage")

Added in: v1.11 browserContext.on("backgroundpage")
note

仅适用于Chromium浏览器的持久化上下文。

当上下文中创建新的后台页面时触发。

background_page = context.wait_for_event("backgroundpage")

用法

browser_context.on("backgroundpage", handler)

事件数据


on("close")

Added before v1.9 browserContext.on("close")

当浏览器上下文关闭时触发。这可能由以下原因之一导致:

  • 浏览器上下文已关闭。
  • 浏览器应用程序已关闭或崩溃。
  • 调用了browser.close()方法。

用法

browser_context.on("close", handler)

事件数据


on("console")

Added in: v1.34 browserContext.on("console")

当页面中的JavaScript调用控制台API方法时触发,例如 console.logconsole.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' })")

事件数据


on("dialog")

Added in: v1.34 browserContext.on("dialog")

当出现JavaScript对话框时触发,例如alertpromptconfirmbeforeunload。监听器必须选择dialog.accept()dialog.dismiss()来处理对话框 - 否则页面会冻结等待对话框响应,点击等操作将无法完成。

用法

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

当没有设置page.on("dialog")browser_context.on("dialog")监听器时,所有对话框将自动被关闭。

事件数据


on("page")

Added before v1.9 browserContext.on("page")

当在BrowserContext中创建新Page时,会触发此事件。该页面可能仍在加载中。该事件也会针对弹出页面触发。另请参阅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"))
note

使用 page.wait_for_load_state() 等待页面进入特定状态(在大多数情况下您不需要使用它)。

用法

browser_context.on("page", handler)

事件数据


on("request")

Added in: v1.12 browserContext.on("request")

当通过此上下文创建的任何页面发出请求时触发。request对象是只读的。若要仅监听特定页面的请求,请使用page.on("request")

为了拦截和修改请求,请参阅browser_context.route()page.route()

用法

browser_context.on("request", handler)

事件数据


on("requestfailed")

Added in: v1.12 browserContext.on("requestfailed")

当请求失败时触发,例如因超时而失败。若只想监听特定页面的失败请求,请使用page.on("requestfailed")

note

HTTP错误响应,例如404或503,从HTTP角度来看仍然是成功的响应,因此请求将以browser_context.on("requestfinished")事件完成,而不是以browser_context.on("requestfailed")事件完成。

用法

browser_context.on("requestfailed", handler)

事件数据


on("requestfinished")

Added in: v1.12 browserContext.on("requestfinished")

当请求在下载响应体后成功完成时触发。对于一个成功的响应,事件顺序是requestresponserequestfinished。要监听特定页面的成功请求,请使用page.on("requestfinished")

用法

browser_context.on("requestfinished", handler)

事件数据


on("response")

Added in: v1.12 browserContext.on("response")

当请求接收到response状态和头部时触发。对于一个成功的响应,事件顺序是requestresponserequestfinished。要监听特定页面的响应事件,请使用page.on("response")

用法

browser_context.on("response", handler)

事件数据


on("serviceworker")

Added in: v1.11 browserContext.on("serviceworker")
note

Service workers 仅在基于 Chromium 的浏览器中受支持。

当上下文中创建新的service worker时触发。

用法

browser_context.on("serviceworker", handler)

事件数据


on("weberror")

Added in: v1.38 browserContext.on("weberror")

当此上下文中任何页面出现未捕获的异常时触发。要监听特定页面的错误,请改用page.on("pageerror")

用法

browser_context.on("weberror", handler)

事件数据