跳到主要内容

BrowserContext

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

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

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

using var playwright = await Playwright.CreateAsync();
var browser = await playwright.Firefox.LaunchAsync(new() { Headless = false });
// 创建一个新的无痕浏览器上下文
var context = await browser.NewContextAsync();
// 在上下文中创建一个新页面。
var page = await context.NewPageAsync();
await page.GotoAsync("https://bing.com");
// 当上下文不再需要时,释放它。
await context.CloseAsync();

方法

AddCookiesAsync

在 v1.9 之前添加 browserContext.AddCookiesAsync

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

用法

await context.AddCookiesAsync(new[] { cookie1, cookie2 });

参数

  • cookies IEnumerable<Cookie>#
    • Name string

    • Value string

    • Url string?(可选

      urldomain/path 是必填项。可选。

    • Domain string?(可选

      若要使 cookie 也应用于所有子域,请在域名前加一个点,如下所示:".example.com"。urldomain/path 是必填项。可选。

    • Path string?(可选

      urldomain/path 是必填项。可选。

    • Expires [float]?(可选

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

    • HttpOnly bool?(可选

      可选。

    • Secure bool?(可选

      可选。

    • SameSite enum SameSiteAttribute { Strict, Lax, None }?可选

      可选。

返回值


AddInitScriptAsync

在 v1.9 之前添加 browserContext.AddInitScriptAsync

添加一个脚本,该脚本会在以下场景之一中执行:

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

该脚本会在文档创建后但在其任何脚本运行之前执行。这对于修改 JavaScript 环境很有用,例如设置 Math.random 的初始值。

用法

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

// preload.js
Math.random = () => 42;
await Context.AddInitScriptAsync(scriptPath: "preload.js");
备注

通过 BrowserContext.AddInitScriptAsync()Page.AddInitScriptAsync() 安装的多个脚本的执行顺序未定义。

参数

  • script string | string#

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

返回值


BackgroundPages

添加于:v1.11 browserContext.BackgroundPages
备注

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

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

用法

BrowserContext.BackgroundPages

返回值


Browser

在 v1.9 之前添加browserContext.Browser 返回上下文的浏览器实例。如果它作为持久化上下文启动,则返回 null。

用法

BrowserContext.Browser

返回值


ClearCookiesAsync

在 v1.9 之前添加 browserContext.ClearCookiesAsync

从上下文中移除 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?可选
    • Domain|DomainRegex string? | Regex?(可选在 v1.43 中添加#

      仅移除具有给定域名的 cookie。

    • Name|NameRegex string? | Regex?(可选在 v1.43 中添加#

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

    • Path|PathRegex string? | Regex?(可选在 v1.43 中添加#

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

返回值


ClearPermissionsAsync

在 v1.9 之前添加 browserContext.ClearPermissionsAsync

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

用法

var context = await browser.NewContextAsync();
await context.GrantPermissionsAsync(new[] { "clipboard-read" });
// 或者,你可以使用辅助类 ContextPermissions
// 来指定权限...
// 执行操作...
await context.ClearPermissionsAsync();

返回值


CloseAsync

在 v1.9 之前添加 browserContext.CloseAsync

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

备注

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

用法

await BrowserContext.CloseAsync(options);

参数

  • options BrowserContextCloseOptions?可选
    • Reason string? (可选在 v1.40 中添加#

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

返回值


CookiesAsync

在 v1.9 之前添加 browserContext.CookiesAsync

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

用法

await BrowserContext.CookiesAsync(urls);

参数

返回值


ExposeBindingAsync

在 v1.9 之前添加 browserContext.ExposeBindingAsync

该方法会在上下文内每个页面的每个框架的 window 对象上添加一个名为 name 的函数。调用时,该函数会执行 callback 并返回一个 Promise,该 Promise 会解析为 callback 的返回值。如果 callback 返回一个 Promise,则会等待该 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();

参数

  • name string#

    window 对象上函数的名称。

  • callback Action<BindingSource, T, [TResult]>#

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

  • options BrowserContextExposeBindingOptions?(可选)

    • Handle bool?(可选)#

      已弃用

      此选项将来会被移除。

      是否以句柄形式传递参数,而不是按值传递。传递句柄时,仅支持一个参数。按值传递时,支持多个参数。

返回值


ExposeFunctionAsync

在 v1.9 之前添加 browserContext.ExposeFunctionAsync

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

如果 callback 返回一个 Promise,则会等待该 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"));
}
}

参数

  • name string# 窗口对象上函数的名称。
  • callback Action<T, [TResult]># 将在 Playwright 上下文中调用的回调函数。

返回值


GrantPermissionsAsync

在 v1.9 之前添加 browserContext.GrantPermissionsAsync

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

用法

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'(系统独占 MIDI)
    • 'midi'
    • 'notifications'
    • 'payment-handler'
    • 'storage-access'
  • options BrowserContextGrantPermissionsOptions?(可选)

返回值


NewCDPSessionAsync

新增于:v1.11 browserContext.NewCDPSessionAsync
备注

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

返回新创建的会话。

用法

await BrowserContext.NewCDPSessionAsync(page);

参数

  • page Page | Frame#

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

返回值


NewPageAsync

在 v1.9 之前添加 browserContext.NewPageAsync

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

用法

await BrowserContext.NewPageAsync();

返回值


Pages

在 v1.9 之前添加 browserContext.Pages

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

用法

BrowserContext.Pages

返回值


RouteAsync

在 v1.9 之前添加 browserContext.RouteAsync

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

备注

BrowserContext.RouteAsync() 不会拦截由 Service Worker 拦截的请求。请参阅 问题。我们建议在使用请求拦截时,通过将 ServiceWorkers 设置为 'block' 来禁用 Service Worker。

用法

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

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

    一个通配符模式、正则表达式模式或接收 URL 的谓词,用于在路由期间进行匹配。如果在上下文选项中设置了 BaseURL,并且提供的 url 是不以 * 开头的字符串,则会使用 new URL() 构造函数进行解析。

  • handler Action<Route>#

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

  • options BrowserContextRouteOptions?(可选)

    • Times int?(可选) 新增于:v1.15#

      路由应使用的次数。默认情况下,每次都会使用。

返回值


RouteFromHARAsync

新增于:v1.23 browserContext.RouteFromHARAsync

如果指定了该方法,在此上下文环境中发出的网络请求将从 HAR 文件中提供服务。详细了解 从 HAR 重放

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

用法

await BrowserContext.RouteFromHARAsync(har, options);

参数

  • har string#

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

  • options BrowserContextRouteFromHAROptions?(可选)

    • NotFound enum HarNotFound { Abort, Fallback }?(可选)#

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

      默认值为 abort

    • Update bool?(可选)#

      如果指定,则使用实际网络信息更新给定的 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 的通配符模式、正则表达式或谓词。只有 URL 与模式匹配的请求才会从 HAR 文件提供服务。如果未指定,则所有请求都将从 HAR 文件提供服务。

返回值


RouteWebSocketAsync

新增于:v1.48 browserContext.RouteWebSocketAsync

此方法允许修改浏览器上下文中任何页面发起的 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();
});

参数

返回值


RunAndWaitForConsoleMessageAsync

新增于:v1.34 browserContext.RunAndWaitForConsoleMessageAsync

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

用法

await BrowserContext.RunAndWaitForConsoleMessageAsync(action, options);

参数

  • action Func<Task>#

    触发事件的操作。

  • options BrowserContextRunAndWaitForConsoleMessageOptions?(可选)

返回值


WaitForConsoleMessageAsync

新增于:v1.34 browserContext.WaitForConsoleMessageAsync

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

用法

await BrowserContext.WaitForConsoleMessageAsync(action, options);

参数

  • options BrowserContextRunAndWaitForConsoleMessageOptions?可选

返回值


RunAndWaitForPageAsync

新增于:v1.9 browserContext.RunAndWaitForPageAsync

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

用法

await BrowserContext.RunAndWaitForPageAsync(action, options);

参数

  • action Func<Task> 新增于:v1.12#

    触发该事件的操作。

  • options BrowserContextRunAndWaitForPageOptions? (可选)

    • Predicate Func<Page?, bool> (可选)#

      接收 Page 对象,并在等待应该解决时解析为真值。

    • Timeout [float]? (可选)#

      最大等待时间(毫秒)。默认为 30000(30 秒)。传递 0 以禁用超时。默认值可以通过使用 BrowserContext.SetDefaultTimeout() 进行更改。

返回值


WaitForPageAsync

新增于:v1.9 browserContext.WaitForPageAsync

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

用法

await BrowserContext.WaitForPageAsync(action, options);

参数

  • options BrowserContextRunAndWaitForPageOptions?可选
    • Predicate Func<Page?, bool>(可选#

      接收 Page 对象,并在等待条件满足时解析为真值。

    • Timeout [float]?(可选#

      最大等待时间(毫秒)。默认为 30000(30 秒)。传入 0 可禁用超时。默认值可以通过使用 BrowserContext.SetDefaultTimeout() 进行更改。

返回值


SetDefaultNavigationTimeout

在 v1.9 之前添加 browserContext.SetDefaultNavigationTimeout

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

用法

BrowserContext.SetDefaultNavigationTimeout(timeout);

参数

  • timeout [float]#

    最大导航时间(毫秒)


SetDefaultTimeout

在 v1.9 之前添加 browserContext.SetDefaultTimeout

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

用法

BrowserContext.SetDefaultTimeout(timeout);

参数

  • timeout [float]#

    最长时间(毫秒)。传入 0 以禁用超时。


SetExtraHTTPHeadersAsync

在 v1.9 之前添加 browserContext.SetExtraHTTPHeadersAsync

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

备注

BrowserContext.SetExtraHTTPHeadersAsync() 不保证传出请求中标头的顺序。

使用方法

await BrowserContext.SetExtraHTTPHeadersAsync(headers);

参数

  • headers IDictionary<string, string># 一个对象,包含每个请求都要发送的额外 HTTP 标头。所有标头值都必须是字符串。

返回值


SetGeolocationAsync

在 v1.9 之前添加 browserContext.SetGeolocationAsync

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

使用方法

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 之前添加 browserContext.SetOfflineAsync

用法

await BrowserContext.SetOfflineAsync(offline);

参数

  • offline bool#

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

返回值


StorageStateAsync

在 v1.9 之前添加 browserContext.StorageStateAsync

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

用法

await BrowserContext.StorageStateAsync(options);

参数

  • options BrowserContextStorageStateOptions?(可选)
    • IndexedDB bool?(可选) 新增于:v1.51#

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

    • Path string?(可选)#

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

返回值


UnrouteAsync

在 v1.9 之前新增 browserContext.UnrouteAsync

移除使用 BrowserContext.RouteAsync() 创建的路由。当未指定 handler 时,移除 url 的所有路由。

用法

await BrowserContext.UnrouteAsync(url, handler);

参数

返回值


UnrouteAllAsync

新增于:v1.41 browserContext.UnrouteAllAsync

移除使用 BrowserContext.RouteAsync()BrowserContext.RouteFromHARAsync() 创建的所有路由。

用法

await BrowserContext.UnrouteAllAsync(options);

参数

  • options BrowserContextUnrouteAllOptions?可选
    • Behavior enum UnrouteBehavior { Wait, IgnoreErrors, Default }?可选#

      用于指定是否等待已在运行的处理程序,以及在处理程序抛出错误时的操作:

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

返回值


属性

APIRequest

新增于:v1.16 browserContext.APIRequest

与该上下文关联的 API 测试辅助工具。使用此 API 发出的请求将使用上下文 cookie。

用法

BrowserContext.APIRequest

类型


Clock

新增于:v1.45 browserContext.Clock

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

用法

BrowserContext.Clock

类型


Tracing

新增于:v1.12 browserContext.Tracing

用法

BrowserContext.Tracing

类型


事件

事件 BackgroundPage

新增于:v1.11 browserContext.event BackgroundPage
备注

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

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

context.BackgroundPage += (_, backgroundPage) =>
{
Console.WriteLine(backgroundPage.Url);
};

用法

BrowserContext.BackgroundPage += async (_, page) => {};

事件数据


事件 Close

在 v1.9 之前新增 browserContext.event Close

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

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

用法

BrowserContext.Close += async (_, browserContext) => {};

事件数据


事件 Console

新增于:v1.34 browserContext.event Console

当页面内的 JavaScript 调用 console API 方法之一(例如 console.logconsole.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 browserContext.event Dialog

当 JavaScript 对话框(如 alertpromptconfirmbeforeunload)出现时触发。监听器 必须 调用 Dialog.AcceptAsync()Dialog.DismissAsync() 来处理对话框,否则页面将 冻结 等待对话框处理,诸如点击等操作将永远不会完成。

用法

Context.Dialog += async (_, dialog) =>
{
await dialog.AcceptAsync();
};
备注

当不存在 Page.DialogBrowserContext.Dialog 监听器时,所有对话框将自动被取消。

事件数据


event Page

在 v1.9 之前添加 browserContext.event Page

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

当通过此上下文创建的任何页面发出请求时触发。request 对象为只读。若只想监听特定页面发出的请求,请使用 Page.Request

若要拦截并修改请求,请参阅 BrowserContext.RouteAsync()Page.RouteAsync()

用法

BrowserContext.Request += async (_, request) => {};

事件数据


event RequestFailed

新增于:v1.12 browserContext.event RequestFailed

当请求失败(例如超时)时触发。若只想监听特定页面发出的失败请求,请使用 Page.RequestFailed

备注

从 HTTP 角度来看,HTTP 错误响应(例如 404 或 503)仍属于成功响应,因此请求将通过 BrowserContext.RequestFinished 事件完成,而不是通过 BrowserContext.RequestFailed 事件完成。

用法

BrowserContext.RequestFailed += async (_, request) => {};

事件数据


事件 RequestFinished

添加于:v1.12 browserContext.event RequestFinished

当请求在下载响应体后成功完成时触发。对于成功的响应,事件顺序为 requestresponserequestfinished。要监听来自特定页面的成功请求,请使用 Page.RequestFinished

用法

BrowserContext.RequestFinished += async (_, request) => {};

事件数据


事件 Response

添加于:v1.12 browserContext.event Response

当请求接收到 response 状态和标头时触发。对于成功的响应,事件顺序为 requestresponserequestfinished。要监听来自特定页面的响应事件,请使用 Page.Response

用法

BrowserContext.Response += async (_, response) => {};

事件数据


事件 WebError

添加于:v1.38 browserContext.event WebError

当此上下文中任何页面的异常未处理时触发。要监听来自特定页面的错误,请改用 Page.PageError

用法

BrowserContext.WebError += async (_, webError) => {};

事件数据