BrowserContext
BrowserContexts 提供了一种操作多个独立浏览器会话的方式。
如果一个页面打开另一个页面,例如通过 window.open
调用,则弹出的页面将属于父页面的浏览器上下文。
Playwright 允许使用 Browser.NewContextAsync() 方法创建隔离的非持久性浏览器上下文。非持久性浏览器上下文不会将任何浏览数据写入磁盘。
using var playwright = await Playwright.CreateAsync();
var browser = await playwright.Firefox.LaunchAsync(new() { Headless = false });
// Create a new incognito browser context
var context = await browser.NewContextAsync();
// Create a new page inside context.
var page = await context.NewPageAsync();
await page.GotoAsync("https://bing.com");
// Dispose context once it is no longer needed.
await context.CloseAsync();
方法
AddCookiesAsync
v1.9 之前添加向此浏览器上下文添加 cookie。此上下文中的所有页面都将安装这些 cookie。可以通过 BrowserContext.CookiesAsync() 获取 cookie。
用法
await context.AddCookiesAsync(new[] { cookie1, cookie2 });
参数
cookies
IEnumerable<Cookie
>#-
Name
string -
Value
string -
Url
string? (可选)需要 url 或 domain / path。可选。
-
Domain
string? (可选)要使 cookie 也应用于所有子域,请在域前加上一个点,例如:".example.com"。需要 url 或 domain / path。可选。
-
Path
string? (可选)需要 url 或 domain / path。可选。
-
Expires
[float]? (可选)以秒为单位的 Unix 时间。可选。
-
HttpOnly
bool? (可选)可选。
-
Secure
bool? (可选)可选。
-
SameSite
enum SameSiteAttribute { Strict, Lax, None }?
(可选)可选。
-
返回
AddInitScriptAsync
v1.9 之前添加添加一个将在以下任一场景中评估的脚本
- 在浏览器上下文中创建或导航页面时。
- 在浏览器上下文中任何页面附加或导航子框架时。在这种情况下,脚本在新附加的框架上下文中进行评估。
脚本在文档创建后但在其任何脚本运行之前进行评估。这对于修改 JavaScript 环境很有用,例如,为 Math.random
设置种子。
用法
在页面加载前覆盖 Math.random
的示例
// preload.js
Math.random = () => 42;
await Context.AddInitScriptAsync(scriptPath: "preload.js");
通过 BrowserContext.AddInitScriptAsync() 和 Page.AddInitScriptAsync() 安装的多个脚本的评估顺序未定义。
参数
返回
BackgroundPages
添加于: v1.11仅 Chromium 内核浏览器支持后台页面。
上下文中所有现有的后台页面。
用法
BrowserContext.BackgroundPages
返回
Browser
v1.9 之前添加返回上下文的浏览器实例。如果作为持久性上下文启动,则返回 null。
用法
BrowserContext.Browser
返回
ClearCookiesAsync
v1.9 之前添加从上下文移除 cookie。接受可选过滤器。
用法
await context.ClearCookiesAsync();
await context.ClearCookiesAsync(new() { Name = "session-id" });
await context.ClearCookiesAsync(new() { Domain = "my-origin.com" });
await context.ClearCookiesAsync(new() { Path = "/api/v1" });
await context.ClearCookiesAsync(new() { Name = "session-id", Domain = "my-origin.com" });
参数
options
BrowserContextClearCookiesOptions?
(可选)
返回
ClearPermissionsAsync
v1.9 之前添加清除浏览器上下文的所有权限覆盖设置。
用法
var context = await browser.NewContextAsync();
await context.GrantPermissionsAsync(new[] { "clipboard-read" });
// Alternatively, you can use the helper class ContextPermissions
// to specify the permissions...
// do stuff ...
await context.ClearPermissionsAsync();
返回
CloseAsync
v1.9 之前添加关闭浏览器上下文。属于此浏览器上下文的所有页面都将关闭。
默认的浏览器上下文不能关闭。
用法
await BrowserContext.CloseAsync(options);
参数
返回
CookiesAsync
v1.9 之前添加如果未指定 URL,此方法返回所有 cookie。如果指定了 URL,则仅返回影响这些 URL 的 cookie。
用法
await BrowserContext.CookiesAsync(urls);
参数
-
urls
string? | IEnumerable?<string> (可选)#可选的 URL 列表。
返回
- IReadOnlyList<
BrowserContextCookiesResult
>#
ExposeBindingAsync
v1.9 之前添加此方法在上下文中每个页面的每个框架的 window
对象上添加一个名为 name 的函数。调用时,该函数执行 callback 并返回一个 Promise,该 Promise 将解析为 callback 的返回值。如果 callback 返回一个 Promise,则将等待其完成。
callback
函数的第一个参数包含调用者的信息:{ browserContext: BrowserContext, page: Page, frame: Frame }
。
请参阅 Page.ExposeBindingAsync() 获取仅页面版本。
用法
将页面 URL 暴露给上下文中所有页面的所有框架的示例
using Microsoft.Playwright;
using var playwright = await Playwright.CreateAsync();
var browser = await playwright.Webkit.LaunchAsync(new() { Headless = false });
var context = await browser.NewContextAsync();
await context.ExposeBindingAsync("pageURL", source => source.Page.Url);
var page = await context.NewPageAsync();
await page.SetContentAsync("<script>\n" +
" async function onClick() {\n" +
" document.querySelector('div').textContent = await window.pageURL();\n" +
" }\n" +
"</script>\n" +
"<button onclick=\"onClick()\">Click me</button>\n" +
"<div></div>");
await page.GetByRole(AriaRole.Button).ClickAsync();
参数
-
window
对象上的函数名称。 -
callback
Action<BindingSource, T, [TResult]>#将在 Playwright 上下文中调用的回调函数。
-
options
BrowserContextExposeBindingOptions?
(可选)
返回
ExposeFunctionAsync
v1.9 之前添加此方法在上下文中每个页面的每个框架的 window
对象上添加一个名为 name 的函数。调用时,该函数执行 callback 并返回一个 Promise,该 Promise 将解析为 callback 的返回值。
如果 callback 返回一个 Promise,则将等待其完成。
请参阅 Page.ExposeFunctionAsync() 获取仅页面版本。
用法
向上下文中所有页面添加 sha256
函数的示例
using Microsoft.Playwright;
using System;
using System.Security.Cryptography;
using System.Threading.Tasks;
class BrowserContextExamples
{
public static async Task Main()
{
using var playwright = await Playwright.CreateAsync();
var browser = await playwright.Webkit.LaunchAsync(new() { Headless = false });
var context = await browser.NewContextAsync();
await context.ExposeFunctionAsync("sha256", (string input) =>
{
return Convert.ToBase64String(
SHA256.Create().ComputeHash(System.Text.Encoding.UTF8.GetBytes(input)));
});
var page = await context.NewPageAsync();
await page.SetContentAsync("<script>\n" +
" async function onClick() {\n" +
" document.querySelector('div').textContent = await window.sha256('PLAYWRIGHT');\n" +
" }\n" +
"</script>\n" +
"<button onclick=\"onClick()\">Click me</button>\n" +
"<div></div>");
await page.GetByRole(AriaRole.Button).ClickAsync();
Console.WriteLine(await page.TextContentAsync("div"));
}
}
参数
返回
GrantPermissionsAsync
v1.9 之前添加授予指定的权限给浏览器上下文。如果指定了 origin,则仅授予相应的权限给该 origin。
用法
await BrowserContext.GrantPermissionsAsync(permissions, options);
参数
-
permissions
IEnumerable<string>#要授予的权限列表。
危险不同浏览器之间,甚至同一浏览器的不同版本之间,支持的权限可能不同。任何权限在更新后都可能停止工作。
以下是某些浏览器可能支持的部分权限
'accelerometer'
'ambient-light-sensor'
'background-sync'
'camera'
'clipboard-read'
'clipboard-write'
'geolocation'
'gyroscope'
'magnetometer'
'microphone'
'midi-sysex'
(system-exclusive midi)'midi'
'notifications'
'payment-handler'
'storage-access'
-
options
BrowserContextGrantPermissionsOptions?
(可选)-
要授予权限的 Origin,例如 "https://example.com"。
-
返回
NewCDPSessionAsync
添加于: v1.11仅 Chromium 内核浏览器支持 CDP 会话。
返回新创建的会话。
用法
await BrowserContext.NewCDPSessionAsync(page);
参数
返回
NewPageAsync
v1.9 之前添加在浏览器上下文中创建一个新页面。
用法
await BrowserContext.NewPageAsync();
返回
Pages
v1.9 之前添加返回上下文中所有已打开的页面。
用法
BrowserContext.Pages
返回
RouteAsync
v1.9 之前添加路由提供了修改浏览器上下文中任何页面发起的网络请求的能力。一旦启用路由,每个匹配 url 模式的请求都会暂停,除非它被继续、完成或中止。
BrowserContext.RouteAsync() 不会拦截由 Service Worker 拦截的请求。请参阅 此 问题。建议在使用请求拦截时禁用 Service Worker,将 ServiceWorkers 设置为 'block'
。
用法
一个简单的处理程序,它中止所有图像请求的示例
var context = await browser.NewContextAsync();
var page = await context.NewPageAsync();
await context.RouteAsync("**/*.{png,jpg,jpeg}", r => r.AbortAsync());
await page.GotoAsync("https://theverge.com");
await browser.CloseAsync();
或者使用正则表达式模式的相同代码片段
var context = await browser.NewContextAsync();
var page = await context.NewPageAsync();
await context.RouteAsync(new Regex("(\\.png$)|(\\.jpg$)"), r => r.AbortAsync());
await page.GotoAsync("https://theverge.com");
await browser.CloseAsync();
可以检查请求以决定路由操作。例如,模拟所有包含某些 POST 数据的请求,并保持所有其他请求不变。
await page.RouteAsync("/api/**", async r =>
{
if (r.Request.PostData.Contains("my-string"))
await r.FulfillAsync(new() { Body = "mocked-data" });
else
await r.ContinueAsync();
});
当请求同时匹配页面路由(通过 Page.RouteAsync() 设置)和浏览器上下文路由时,页面路由优先。
要移除路由及其处理程序,可以使用 BrowserContext.UnrouteAsync()。
启用路由会禁用 HTTP 缓存。
参数
-
url
string | Regex | Func<string, bool>#一个 glob 模式、正则表达式模式或 predicate,它接收一个 URL 用于路由期间的匹配。如果在上下文选项中设置了 BaseURL 并且提供的 URL 是一个不以
*
开头的字符串,则使用new URL()
构造函数进行解析。 -
用于路由请求的处理函数。
-
options
BrowserContextRouteOptions?
(可选)
返回
RouteFromHARAsync
添加于: v1.23如果指定,上下文中发出的网络请求将从 HAR 文件提供。阅读更多关于 从 HAR 回放 的信息。
Playwright 不会从 HAR 文件提供由 Service Worker 拦截的请求。请参阅 此 问题。建议在使用请求拦截时禁用 Service Worker,将 ServiceWorkers 设置为 'block'
。
用法
await BrowserContext.RouteFromHARAsync(har, options);
参数
-
包含预记录网络数据的 HAR 文件路径。如果
path
是相对路径,则相对于当前工作目录解析。 -
options
BrowserContextRouteFromHAROptions?
(可选)-
NotFound
enum HarNotFound { Abort, Fallback }?
(可选)#- 如果设置为 'abort',任何未在 HAR 文件中找到的请求将被中止。
- 如果设置为 'fallback',则进入处理程序链中的下一个路由处理程序。
默认为 abort。
-
如果指定,则使用实际网络信息更新给定的 HAR,而不是从文件提供。文件在调用 BrowserContext.CloseAsync() 时写入磁盘。
-
UpdateContent
enum RouteFromHarUpdateContentPolicy { Embed, Attach }?
(可选)添加于: v1.32#用于控制资源内容管理的选项设置。如果指定
attach
,资源将作为单独的文件或 ZIP 存档中的条目保留。如果指定embed
,内容将内联存储在 HAR 文件中。 -
UpdateMode
enum HarMode { Full, Minimal }?
(可选)添加于: v1.32#设置为
minimal
时,仅记录从 HAR 路由所需的信息。这会忽略大小、时序、页面、cookie、安全以及从 HAR 回放时未使用的其他类型的 HAR 信息。默认为minimal
。 -
Url|UrlRegex
string? | Regex? (可选)#用于匹配请求 URL 的 glob 模式、正则表达式或 predicate。只有 URL 匹配模式的请求才会从 HAR 文件提供。如果未指定,则所有请求都从 HAR 文件提供。
-
返回
RouteWebSocketAsync
添加于: v1.48此方法允许修改浏览器上下文中任何页面建立的 websocket 连接。
请注意,只有在此方法调用后创建的 WebSocket
连接才会被路由。建议在创建任何页面之前调用此方法。
用法
下面是一个简单的处理程序示例,它会阻止某些 websocket 消息。请参阅 WebSocketRoute 获取更多详细信息和示例。
await context.RouteWebSocketAsync("/ws", async ws => {
ws.RouteSend(message => {
if (message == "to-be-blocked")
return;
ws.Send(message);
});
await ws.ConnectAsync();
});
参数
-
url
string | Regex | Func<string, bool>#只有 URL 匹配此模式的 WebSockets 将被路由。字符串模式可以相对于 BaseURL 上下文选项。
-
handler
Action<WebSocketRoute>#用于路由 WebSocket 的处理函数。
返回
RunAndWaitForConsoleMessageAsync
添加于: v1.34执行 action 并等待上下文页面中记录一个 ConsoleMessage。如果提供了 predicate,它会将 ConsoleMessage 值传递给 predicate
函数,并等待 predicate(message)
返回一个 truthy 值。如果在 BrowserContext.Console 事件触发之前页面关闭,将抛出错误。
用法
await BrowserContext.RunAndWaitForConsoleMessageAsync(action, options);
参数
-
触发事件的 action。
-
options
BrowserContextRunAndWaitForConsoleMessageOptions?
(可选)-
Predicate
Func<ConsoleMessage?, bool> (可选)#接收 ConsoleMessage 对象,当等待应该解决时,解析为真值。
-
Timeout
[float]? (可选)#最大等待时间,单位为毫秒。默认为
30000
(30 秒)。传递0
可禁用超时。可以使用 BrowserContext.SetDefaultTimeout() 更改默认值。
-
返回
WaitForConsoleMessageAsync
添加于: v1.34执行 action 并等待上下文页面中记录一个 ConsoleMessage。如果提供了 predicate,它会将 ConsoleMessage 值传递给 predicate
函数,并等待 predicate(message)
返回一个 truthy 值。如果在 BrowserContext.Console 事件触发之前页面关闭,将抛出错误。
用法
await BrowserContext.WaitForConsoleMessageAsync(action, options);
参数
options
BrowserContextRunAndWaitForConsoleMessageOptions?
(可选)-
Predicate
Func<ConsoleMessage?, bool> (可选)#接收 ConsoleMessage 对象,当等待应该解决时,解析为真值。
-
Timeout
[float]? (可选)#最大等待时间,单位为毫秒。默认为
30000
(30 秒)。传递0
可禁用超时。可以使用 BrowserContext.SetDefaultTimeout() 更改默认值。
-
返回
RunAndWaitForPageAsync
新增于: v1.9执行操作并等待在上下文中创建一个新的 Page。如果提供了谓词,它会将 Page 值传递给 predicate
函数,并等待 predicate(event)
返回一个真值。如果在创建新的 Page 之前上下文关闭,将抛出错误。
用法
await BrowserContext.RunAndWaitForPageAsync(action, options);
参数
-
触发事件的 action。
-
options
BrowserContextRunAndWaitForPageOptions?
(可选)
返回
WaitForPageAsync
新增于: v1.9执行操作并等待在上下文中创建一个新的 Page。如果提供了谓词,它会将 Page 值传递给 predicate
函数,并等待 predicate(event)
返回一个真值。如果在创建新的 Page 之前上下文关闭,将抛出错误。
用法
await BrowserContext.WaitForPageAsync(action, options);
参数
options
BrowserContextRunAndWaitForPageOptions?
(可选)
返回
SetDefaultNavigationTimeout
v1.9 之前添加此设置将更改以下方法及相关快捷方式的默认最大导航时间
- Page.GoBackAsync()
- Page.GoForwardAsync()
- Page.GotoAsync()
- Page.ReloadAsync()
- Page.SetContentAsync()
- Page.RunAndWaitForNavigationAsync()
用法
BrowserContext.SetDefaultNavigationTimeout(timeout);
参数
-
timeout
[float]#最大导航时间,单位为毫秒
SetDefaultTimeout
v1.9 之前添加此设置将更改所有接受 timeout 选项的方法的默认最大时间。
用法
BrowserContext.SetDefaultTimeout(timeout);
参数
-
timeout
[float]#最大时间,单位为毫秒。传递
0
可禁用超时。
SetExtraHTTPHeadersAsync
v1.9 之前添加附加的 HTTP 头部将随上下文中任何页面发起的每个请求一起发送。这些头部与通过 Page.SetExtraHTTPHeadersAsync() 设置的页面特定附加 HTTP 头部合并。如果页面覆盖了某个特定头部,将使用页面特定的头部值而不是浏览器上下文头部值。
BrowserContext.SetExtraHTTPHeadersAsync() 不保证出站请求中头部的顺序。
用法
await BrowserContext.SetExtraHTTPHeadersAsync(headers);
参数
-
headers
IDictionary<string, string>#一个对象,包含要随每个请求一起发送的附加 HTTP 头部。所有头部值必须是字符串。
返回
SetGeolocationAsync
v1.9 之前添加设置上下文的地理位置。传递 null
或 undefined
模拟位置不可用。
用法
await context.SetGeolocationAsync(new Geolocation()
{
Latitude = 59.95f,
Longitude = 30.31667f
});
考虑使用 BrowserContext.GrantPermissionsAsync() 为浏览器上下文页面授予读取其地理位置的权限。
参数
geolocation
Geolocation?#-
Latitude
[float]纬度,介于 -90 和 90 之间。
-
Longitude
[float]经度,介于 -180 和 180 之间。
-
Accuracy
[float]? (可选)非负精度值。默认为
0
。
-
返回
SetOfflineAsync
v1.9 之前添加用法
await BrowserContext.SetOfflineAsync(offline);
参数
返回
StorageStateAsync
v1.9 之前添加返回此浏览器上下文的存储状态,包含当前 cookie、本地存储快照和 IndexedDB 快照。
用法
await BrowserContext.StorageStateAsync(options);
参数
options
BrowserContextStorageStateOptions?
(可选)
返回
UnrouteAsync
v1.9 之前添加移除使用 BrowserContext.RouteAsync() 创建的路由。如果未指定 handler,则移除 url 的所有路由。
用法
await BrowserContext.UnrouteAsync(url, handler);
参数
-
url
string | Regex | Func<string, bool>#用于注册路由的 glob 模式、正则表达式模式或接收 URL 的谓词,配合 BrowserContext.RouteAsync() 使用。
-
可选的处理函数,用于配合 BrowserContext.RouteAsync() 注册路由。
返回
UnrouteAllAsync
新增于: v1.41移除所有通过 BrowserContext.RouteAsync() 和 BrowserContext.RouteFromHARAsync() 创建的路由。
用法
await BrowserContext.UnrouteAllAsync(options);
参数
options
BrowserContextUnrouteAllOptions?
(可选)-
Behavior
enum UnrouteBehavior { Wait, IgnoreErrors, Default }?
(可选)#指定是否等待正在运行的处理程序完成,以及如果它们抛出错误该怎么办
'default'
- 不等待当前的处理程序调用(如果有)完成,如果未路由的处理程序抛出异常,可能导致未处理的错误'wait'
- 等待当前的处理程序调用(如果有)完成'ignoreErrors'
- 不等待当前的处理程序调用(如果有)完成,取消路由后由处理程序抛出的所有错误将被静默捕获
-
返回
属性
APIRequest
新增于: v1.16与此上下文关联的 API 测试辅助工具。使用此 API 发出的请求将使用上下文 cookie。
用法
BrowserContext.APIRequest
类型
Clock
新增于: v1.45Playwright 能够模拟时钟和时间的流逝。
用法
BrowserContext.Clock
类型
Tracing
新增于: v1.12用法
BrowserContext.Tracing
类型
事件
event BackgroundPage
添加于: v1.11仅适用于 Chromium 浏览器的持久性上下文。
在上下文中创建新的后台页面时触发。
context.BackgroundPage += (_, backgroundPage) =>
{
Console.WriteLine(backgroundPage.Url);
};
用法
BrowserContext.BackgroundPage += async (_, page) => {};
事件数据
event Close
v1.9 之前添加当浏览器上下文关闭时触发。这可能由于以下原因之一发生:
- 浏览器上下文已关闭。
- 浏览器应用程序已关闭或崩溃。
- 调用了 Browser.CloseAsync() 方法。
用法
BrowserContext.Close += async (_, browserContext) => {};
事件数据
event Console
添加于: v1.34当页面内的 JavaScript 调用控制台 API 方法之一时触发,例如 console.log
或 console.dir
。
传递给 console.log
的参数和页面可在 ConsoleMessage 事件处理程序参数上获取。
用法
context.Console += async (_, msg) =>
{
foreach (var arg in msg.Args)
Console.WriteLine(await arg.JsonValueAsync<object>());
};
await page.EvaluateAsync("console.log('hello', 5, { foo: 'bar' })");
事件数据
event Dialog
添加于: v1.34当出现 JavaScript 对话框时触发,例如 alert
、prompt
、confirm
或 beforeunload
。监听器必须 接受 或 关闭 对话框 - 否则页面将 冻结 等待对话框,并且点击等操作永远不会完成。
用法
Context.Dialog += async (_, dialog) =>
{
await dialog.AcceptAsync();
};
当不存在 Page.Dialog 或 BrowserContext.Dialog 监听器时,所有对话框都会自动关闭。
事件数据
event Page
v1.9 之前添加当 BrowserContext 中创建新页面时触发此事件。页面可能仍在加载中。此事件也会为弹窗页面触发。另请参阅 Page.Popup,以接收与特定页面相关的弹窗事件。
页面最早可用的时刻是当它导航到初始 URL 时。例如,当使用 window.open('http://example.com')
打开弹窗时,此事件将在对“http://example.com”的网络请求完成且其响应开始在弹窗中加载时触发。如果您想路由/监听此网络请求,请分别使用 BrowserContext.RouteAsync() 和 BrowserContext.Request,而不是 Page 上的类似方法。
var popup = await context.RunAndWaitForPageAsync(async =>
{
await page.GetByText("open new page").ClickAsync();
});
Console.WriteLine(await popup.EvaluateAsync<string>("location.href"));
使用 Page.WaitForLoadStateAsync() 等待页面达到特定状态(在大多数情况下您不需要这样做)。
用法
BrowserContext.Page += async (_, page) => {};
事件数据
event Request
新增于: v1.12当通过此上下文创建的任何页面发出请求时触发。 request 对象是只读的。要仅监听特定页面发出的请求,请使用 Page.Request。
要拦截和修改请求,请参阅 BrowserContext.RouteAsync() 或 Page.RouteAsync()。
用法
BrowserContext.Request += async (_, request) => {};
事件数据
event RequestFailed
新增于: v1.12当请求失败时触发,例如超时。要仅监听特定页面失败的请求,请使用 Page.RequestFailed。
HTTP 错误响应,例如 404 或 503,从 HTTP 的角度来看仍然是成功的响应,因此请求将以 BrowserContext.RequestFinished 事件完成,而不是以 BrowserContext.RequestFailed 事件完成。
用法
BrowserContext.RequestFailed += async (_, request) => {};
事件数据
event RequestFinished
新增于: v1.12当请求成功完成并下载响应体后触发。对于成功的响应,事件顺序是 request
、response
和 requestfinished
。要监听特定页面成功的请求,请使用 Page.RequestFinished。
用法
BrowserContext.RequestFinished += async (_, request) => {};
事件数据
event Response
新增于: v1.12当请求收到 response 状态和头部时触发。对于成功的响应,事件顺序是 request
、response
和 requestfinished
。要监听特定页面响应事件,请使用 Page.Response。
用法
BrowserContext.Response += async (_, response) => {};
事件数据
event WebError
新增于: v1.38当此上下文中任何页面出现未处理的异常时触发。要监听特定页面的错误,请改用 Page.PageError。
用法
BrowserContext.WebError += async (_, webError) => {};
事件数据