跳至主要内容

浏览器上下文

浏览器上下文提供了一种操作多个独立浏览器会话的方法。

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

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

// Create a new incognito browser context
const context = await browser.newContext();
// Create a new page inside context.
const page = await context.newPage();
await page.goto('https://example.com');
// Dispose context once it's no longer needed.
await context.close();

方法

addCookies

在 v1.9 之前添加 browserContext.addCookies

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

用法

await browserContext.addCookies([cookieObject1, cookieObject2]);

参数

  • cookies Array<Object>#
    • name string

    • value string

    • url string (可选)

      需要 url 或 domain / path。可选。

    • domain string (可选)

      为了使 cookie 也适用于所有子域,请在域名前添加点,例如:".example.com"。需要 url 或 domain / path。可选。

    • path string (可选)

      需要 url 或 domain / path 可选。

    • expires number (可选)

      以秒为单位的 Unix 时间。可选。

    • httpOnly boolean (可选)

      可选。

    • secure boolean (可选)

      可选。

    • sameSite "Strict" | "Lax" | "None" (可选)

      可选。

返回


addInitScript

在 v1.9 之前添加 browserContext.addInitScript

添加一个脚本,该脚本将在以下几种情况下执行

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

在创建文档但运行其任何脚本之前执行该脚本。这对于修改 JavaScript 环境很有用,例如为 `Math.random` 播种。

用法

页面加载之前覆盖 `Math.random` 的示例

// preload.js
Math.random = () => 42;
// In your playwright script, assuming the preload.js file is in same directory.
await browserContext.addInitScript({
path: 'preload.js'
});
注意

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

参数

  • script function | string | Object#

    • path string (可选)

      JavaScript 文件的路径。如果 `path` 是相对路径,则它相对于当前工作目录解析。可选。

    • content string (可选)

      原始脚本内容。可选。

    要在浏览器上下文中的所有页面中执行的脚本。

  • arg 可序列化 (可选)#

    传递给 script 的可选参数(仅在传递函数时支持)。

返回


backgroundPages

在以下版本中添加:v1.11 browserContext.backgroundPages
注意

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

上下文中的所有现有背景页面。

用法

browserContext.backgroundPages();

返回


browser

在 v1.9 之前添加 browserContext.browser

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

用法

browserContext.browser();

返回


clearCookies

在 v1.9 之前添加 browserContext.clearCookies

从上下文中删除 cookie。接受可选过滤器。

用法

await context.clearCookies();
await context.clearCookies({ name: 'session-id' });
await context.clearCookies({ domain: 'my-origin.com' });
await context.clearCookies({ domain: /.*my-origin\.com/ });
await context.clearCookies({ path: '/api/v1' });
await context.clearCookies({ name: 'session-id', domain: 'my-origin.com' });

参数

  • options Object (可选)
    • domain string | RegExp (可选)在以下版本中添加:v1.43#

      仅删除具有给定域的 cookie。

    • name string | RegExp (可选)在以下版本中添加:v1.43#

      仅删除具有给定名称的 cookie。

    • path string | RegExp (可选)在以下版本中添加:v1.43#

      仅删除具有给定路径的 cookie。

返回


clearPermissions

在 v1.9 之前添加 browserContext.clearPermissions

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

用法

const context = await browser.newContext();
await context.grantPermissions(['clipboard-read']);
// do stuff ..
context.clearPermissions();

返回


close

在 v1.9 之前添加 browserContext.close

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

注意

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

用法

await browserContext.close();
await browserContext.close(options);

参数

  • options Object (可选)
    • reason string (可选)在以下版本中添加:v1.40#

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

返回


cookies

在 v1.9 之前添加 browserContext.cookies

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

用法

await browserContext.cookies();
await browserContext.cookies(urls);

参数

返回


exposeBinding

在 v1.9 之前添加 browserContext.exposeBinding

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

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

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

用法

将页面 URL 公开到上下文中所有页面中的所有框架的示例

const { webkit } = require('playwright');  // Or 'chromium' or 'firefox'.

(async () => {
const browser = await webkit.launch({ headless: false });
const context = await browser.newContext();
await context.exposeBinding('pageURL', ({ page }) => page.url());
const page = await context.newPage();
await page.setContent(`
<script>
async function onClick() {
document.querySelector('div').textContent = await window.pageURL();
}
</script>
<button onclick="onClick()">Click me</button>
<div></div>
`);
await page.getByRole('button').click();
})();

参数

  • name 字符串#

    window 对象上函数的名称。

  • callback 函数#

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

  • options Object (可选)

    • handle 布尔值 (可选)#

      已弃用

      此选项将在将来删除。

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

返回


exposeFunction

在 v1.9 之前添加 browserContext.exposeFunction

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

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

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

用法

sha256 函数添加到上下文中的所有页面的示例

const { webkit } = require('playwright');  // Or 'chromium' or 'firefox'.
const crypto = require('crypto');

(async () => {
const browser = await webkit.launch({ headless: false });
const context = await browser.newContext();
await context.exposeFunction('sha256', text =>
crypto.createHash('sha256').update(text).digest('hex'),
);
const page = await context.newPage();
await page.setContent(`
<script>
async function onClick() {
document.querySelector('div').textContent = await window.sha256('PLAYWRIGHT');
}
</script>
<button onclick="onClick()">Click me</button>
<div></div>
`);
await page.getByRole('button').click();
})();

参数

  • name 字符串#

    window 对象上函数的名称。

  • callback 函数#

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

返回


grantPermissions

在 v1.9 之前添加 browserContext.grantPermissions

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

用法

await browserContext.grantPermissions(permissions);
await browserContext.grantPermissions(permissions, options);

参数

  • permissions 数组<字符串>#

    要授予的权限或权限数组。权限可以是以下值之一

    • '加速度计'
    • '无障碍事件'
    • '环境光传感器'
    • '后台同步'
    • '相机'
    • '剪贴板读取'
    • '剪贴板写入'
    • '地理位置'
    • '陀螺仪'
    • '磁力计'
    • '麦克风'
    • 'midi-sysex'(系统独占 MIDI)
    • 'MIDI'
    • '通知'
    • '支付处理程序'
    • '存储访问'
  • options Object (可选)

返回


newCDPSession

在以下版本中添加:v1.11 browserContext.newCDPSession
注意

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

返回新创建的会话。

用法

await browserContext.newCDPSession(page);

参数

  • page Page | Frame#

    要为其创建新会话的目标。为了向后兼容,此参数名为 page,但它可以是 PageFrame 类型。

返回


newPage

在 v1.9 之前添加 browserContext.newPage

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

用法

await browserContext.newPage();

返回


pages

在 v1.9 之前添加 browserContext.pages

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

用法

browserContext.pages();

返回


removeAllListeners

添加于:v1.47 browserContext.removeAllListeners

删除给定类型的所有侦听器(如果未给出类型,则删除所有注册的侦听器)。允许等待异步侦听器完成或忽略这些侦听器随后的错误。

用法

await browserContext.removeAllListeners();
await browserContext.removeAllListeners(type, options);

参数

  • type 字符串 (可选)#
  • options Object (可选)
    • behavior "等待" | "忽略错误" | "默认" (可选)#

      指定是否等待正在运行的侦听器以及如果它们引发错误该怎么办

      • 'default' - 不要等待当前侦听器调用(如果有)完成,如果侦听器引发错误,则可能导致未处理的错误
      • 'wait' - 等待当前侦听器调用(如果有)完成
      • 'ignoreErrors' - 不要等待当前侦听器调用(如果有)完成,删除后侦听器引发的所有错误都会被静默捕获

返回


route

在 v1.9 之前添加 browserContext.route

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

注意

browserContext.route() 不会拦截由 Service Worker 拦截的请求。请查看 问题。我们建议在使用请求拦截时禁用 Service Worker,方法是将 serviceWorkers 设置为 'block'

用法

一个简单的示例,它中止所有图片请求

const context = await browser.newContext();
await context.route('**/*.{png,jpg,jpeg}', route => route.abort());
const page = await context.newPage();
await page.goto('https://example.com');
await browser.close();

或者使用正则表达式模式的相同代码段

const context = await browser.newContext();
await context.route(/(\.png$)|(\.jpg$)/, route => route.abort());
const page = await context.newPage();
await page.goto('https://example.com');
await browser.close();

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

await context.route('/api/**', async route => {
if (route.request().postData().includes('my-string'))
await route.fulfill({ body: 'mocked-data' });
else
await route.continue();
});

当请求匹配两个处理程序时,页面路由(使用 page.route() 设置)优先于浏览器上下文路由。

要使用处理程序删除路由,可以使用 browserContext.unroute()

注意

启用路由会禁用 HTTP 缓存。

参数

返回


routeFromHAR

添加于:v1.23 browserContext.routeFromHAR

如果指定,上下文中的网络请求将从 HAR 文件中提供服务。详细了解 从 HAR 重放

Playwright 不会从 HAR 文件中提供由 Service Worker 拦截的请求。请查看 问题。我们建议在使用请求拦截时禁用 Service Worker,方法是将 serviceWorkers 设置为 'block'

用法

await browserContext.routeFromHAR(har);
await browserContext.routeFromHAR(har, options);

参数

  • har 字符串#

    具有预先录制网络数据的 HAR 文件的路径。如果 path 是相对路径,则它相对于当前工作目录解析。

  • options Object (可选)

    • notFound "abort" | "fallback" (可选)#

      • 如果设置为“abort”,则 HAR 文件中找不到的任何请求都将被中止。
      • 如果设置为“fallback”,则将通过处理程序链中的下一个路由处理程序。

      默认为中止。

    • update 布尔值 (可选)#

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

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

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

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

      当设置为 minimal 时,只记录从 HAR 路由所需的必要信息。这将省略从 HAR 重放时未使用的尺寸、计时、页面、cookie、安全性和其他类型的 HAR 信息。默认为 minimal

    • url 字符串 | 正则表达式 (可选)#

      全局模式、正则表达式或谓词,用于匹配请求 URL。只有 URL 匹配模式的请求才会从 HAR 文件中提供服务。如果未指定,则所有请求均从 HAR 文件中提供服务。

返回


routeWebSocket

添加于:v1.48 browserContext.routeWebSocket

此方法允许修改浏览器上下文中任何页面发起的 websocket 连接。

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

用法

下面是一个简单示例,该示例阻止某些 websocket 消息。有关更多详细信息和示例,请参阅 WebSocketRoute

await context.routeWebSocket('/ws', async ws => {
ws.routeSend(message => {
if (message === 'to-be-blocked')
return;
ws.send(message);
});
await ws.connect();
});

参数

返回


serviceWorkers

在以下版本中添加:v1.11 browserContext.serviceWorkers
注意

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

上下文中所有现有的 Service Worker。

用法

browserContext.serviceWorkers();

返回


setDefaultNavigationTimeout

在 v1.9 之前添加 browserContext.setDefaultNavigationTimeout

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

用法

browserContext.setDefaultNavigationTimeout(timeout);

参数

  • timeout 数字#

    以毫秒为单位的最大导航时间


setDefaultTimeout

在 v1.9 之前添加 browserContext.setDefaultTimeout

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

用法

browserContext.setDefaultTimeout(timeout);

参数

  • timeout 数字#

    以毫秒为单位的最大时间


setExtraHTTPHeaders

在 v1.9 之前添加 browserContext.setExtraHTTPHeaders

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

注意

browserContext.setExtraHTTPHeaders() 不保证传出请求中头部的顺序。

用法

await browserContext.setExtraHTTPHeaders(headers);

参数

  • headers Object<string, string>#

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

返回


setGeolocation

在 v1.9 之前添加 browserContext.setGeolocation

设置上下文的地理位置。传入 nullundefined 表示位置不可用。

用法

await browserContext.setGeolocation({ latitude: 59.95, longitude: 30.31667 });
注意

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

参数

  • geolocation null | Object#
    • latitude number

      纬度介于 -90 到 90 之间。

    • longitude number

      经度介于 -180 到 180 之间。

    • accuracy number (可选)

      非负精度值。默认为 0

返回


setOffline

在 v1.9 之前添加 browserContext.setOffline

用法

await browserContext.setOffline(offline);

参数

  • offline boolean#

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

返回


storageState

在 v1.9 之前添加 browserContext.storageState

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

用法

await browserContext.storageState();
await browserContext.storageState(options);

参数

  • options Object (可选)
    • path string (可选)#

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

返回


unroute

在 v1.9 之前添加 browserContext.unroute

删除使用 browserContext.route() 创建的路由。当 handler 未指定时,将删除 url 的所有路由。

用法

await browserContext.unroute(url);
await browserContext.unroute(url, handler);

参数

返回


unrouteAll

添加于: v1.41 browserContext.unrouteAll

删除使用 browserContext.route()browserContext.routeFromHAR() 创建的所有路由。

用法

await browserContext.unrouteAll();
await browserContext.unrouteAll(options);

参数

  • options Object (可选)
    • behavior "wait" | "ignoreErrors" | "default" (可选)#

      指定是否等待已运行的处理程序以及如果它们抛出错误该怎么办

      • 'default' - 不要等待当前处理程序调用(如果有)完成,如果取消路由的处理程序抛出错误,可能会导致未处理的错误
      • 'wait' - 等待当前处理程序调用(如果有)完成
      • 'ignoreErrors' - 不要等待当前处理程序调用(如果有)完成,取消路由后处理程序抛出的所有错误将被静默捕获

返回


waitForEvent

在 v1.9 之前添加 browserContext.waitForEvent

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

用法

const pagePromise = context.waitForEvent('page');
await page.getByRole('button').click();
const page = await pagePromise;

参数

  • event string#

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

  • optionsOrPredicate function | Object (可选)#

    • predicate function

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

    • timeout number (可选)

      以毫秒为单位的最大等待时间。默认为 0 - 无超时。默认值可以通过配置中的 actionTimeout 选项更改,或者使用 browserContext.setDefaultTimeout() 方法更改。

    谓词(接收事件)或选项对象。可选。

  • options Object (可选)

    • predicate function (可选)#

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

返回


属性

clock

添加于: v1.45 browserContext.clock

Playwright 能够模拟时钟和时间流逝。

用法

browserContext.clock

类型


request

添加于: v1.16 browserContext.request

与该上下文关联的 API 测试助手。使用此 API 进行的请求将使用上下文 cookie。

用法

browserContext.request

类型


tracing

添加于: v1.12 browserContext.tracing

用法

browserContext.tracing

类型


事件

on('backgroundpage')

在以下版本中添加:v1.11 browserContext.on('backgroundpage')
注意

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

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

const backgroundPage = await context.waitForEvent('backgroundpage');

用法

browserContext.on('backgroundpage', data => {});

事件数据


on('close')

在 v1.9 之前添加 browserContext.on('close')

当浏览器上下文关闭时发出。这可能是由于以下原因之一:

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

用法

browserContext.on('close', data => {});

事件数据


on('console')

添加于: v1.34 browserContext.on('console')

当页面中的 JavaScript 调用其中一个控制台 API 方法时发出,例如 console.logconsole.dir

传递给 console.log 和页面的参数在 ConsoleMessage 事件处理程序参数中可用。

用法

context.on('console', async msg => {
const values = [];
for (const arg of msg.args())
values.push(await arg.jsonValue());
console.log(...values);
});
await page.evaluate(() => console.log('hello', 5, { foo: 'bar' }));

事件数据


on('dialog')

添加于: v1.34 browserContext.on('dialog')

当 JavaScript 对话框出现时发出,例如 alertpromptconfirmbeforeunload。监听器**必须** dialog.accept()dialog.dismiss() 对话框 - 否则页面将 冻结 等待对话框,并且单击等操作将永远无法完成。

用法

context.on('dialog', dialog => {
dialog.accept();
});
注意

当没有 page.on('dialog')browserContext.on('dialog') 监听器存在时,所有对话框将自动关闭。

事件数据


on('page')

在 v1.9 之前添加 browserContext.on('page')

当在 BrowserContext 中创建新页面时发出此事件。页面可能仍在加载。该事件也会针对弹出页面触发。另请参阅 page.on('popup') 以接收与特定页面相关的弹出窗口的事件。

页面可用的最早时刻是在它导航到初始 URL 时。例如,当使用 window.open('http://example.com') 打开弹出窗口时,此事件将在网络请求到 "http://example.com" 完成并且其响应开始在弹出窗口中加载时触发。如果您想路由/监听此网络请求,请分别使用 browserContext.route()browserContext.on('request') 而不是 Page 上的类似方法。

const newPagePromise = context.waitForEvent('page');
await page.getByText('open new page').click();
const newPage = await newPagePromise;
console.log(await newPage.evaluate('location.href'));
注意

使用 page.waitForLoadState() 等待页面到达特定状态(在大多数情况下您不需要这样做)。

用法

browserContext.on('page', data => {});

事件数据


on('request')

添加于: v1.12 browserContext.on('request')

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

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

用法

browserContext.on('request', data => {});

事件数据


on('requestfailed')

添加于: v1.12 browserContext.on('requestfailed')

当请求失败时发出,例如超时。要仅监听来自特定页面的失败请求,请使用 page.on('requestfailed')

注意

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

用法

browserContext.on('requestfailed', data => {});

事件数据


on('requestfinished')

添加于: v1.12 browserContext.on('requestfinished')

在成功下载响应主体后,请求成功完成时发出。对于成功的响应,事件序列为 requestresponserequestfinished。要监听来自特定页面的成功请求,请使用 page.on('requestfinished')

用法

browserContext.on('requestfinished', data => {});

事件数据


on('response')

添加于: v1.12 browserContext.on('response')

当收到请求的 response 状态和标头时发出。对于成功的响应,事件序列为 requestresponserequestfinished。要监听来自特定页面的响应事件,请使用 page.on('response')

用法

browserContext.on('response', data => {});

事件数据


on('serviceworker')

在以下版本中添加:v1.11 browserContext.on('serviceworker')
注意

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

当上下文中创建新的服务工作者时发出。

用法

browserContext.on('serviceworker', data => {});

事件数据


on('weberror')

添加于: v1.38 browserContext.on('weberror')

当此上下文中的任何页面中未处理异常时发出。要监听来自特定页面的错误,请改用 page.on('pageerror')

用法

browserContext.on('weberror', data => {});

事件数据


已弃用

setHTTPCredentials

在 v1.9 之前添加 browserContext.setHTTPCredentials
已弃用

浏览器可能会在成功身份验证后缓存凭据。请改用新的浏览器上下文。

用法

await browserContext.setHTTPCredentials(httpCredentials);

参数

返回