跳到主要内容

发行说明

版本 1.52

亮点

  • 新增方法 Expect(Locator).ToContainClassAsync(),可方便地断言元素上的单个类名。

      await Expect(Page.GetByRole(AriaRole.Listitem, new() { Name = "Ship v1.52" })).ToContainClassAsync("done");
  • Aria 快照 新增了两个属性:用于严格匹配的 /children 和用于链接的 /url

    await Expect(locator).ToMatchAriaSnapshotAsync(@"
    - list
    - /children: equal
    - listitem: Feature A
    - listitem:
    - link ""Feature B"":
    - /url: ""https://playwright.dev""
    ");

其他改进

重大变更

  • Page.RouteAsync() 等方法中的全局 URL 模式不再支持 ?[]。建议改用正则表达式。
  • Route.ContinueAsync() 方法不再允许覆盖 Cookie 标头。如果提供了 Cookie 标头,它将被忽略,并且将从浏览器的 cookie 存储中加载 cookie。要设置自定义 cookie,请使用 BrowserContext.AddCookiesAsync()
  • macOS 13 现已弃用,将不再接收 WebKit 更新。请升级到更新的 macOS 版本,以继续享受最新的 WebKit 改进。

浏览器版本

  • Chromium 136.0.7103.25
  • Mozilla Firefox 137.0
  • WebKit 18.4

此版本还针对以下稳定版本通道进行了测试:

  • Google Chrome 135
  • Microsoft Edge 135

1.51 版本

亮点

  • BrowserContext.StorageStateAsync() 的新选项 IndexedDB 允许保存和恢复 IndexedDB 内容。当应用程序使用 IndexedDB API 存储身份验证令牌(如 Firebase 身份验证)时,此功能很有用。

    以下是遵循 身份验证指南 的示例:

    // 将存储状态保存到文件中。确保包含 IndexedDB。
    await context.StorageStateAsync(new()
    {
    Path = "../../../playwright/.auth/state.json",
    IndexedDB = true
    });

    // 使用保存的存储状态创建新上下文。
    var context = await browser.NewContextAsync(new()
    {
    StorageStatePath = "../../../playwright/.auth/state.json"
    });
  • Locator.Filter() 的新选项 Visible 允许仅匹配可见元素。

    // 忽略不可见的待办事项。
    var todoItems = Page.GetByTestId("todo-item").Filter(new() { Visible = true });
    // 检查恰好有 3 个可见的待办事项。
    await Expect(todoItems).ToHaveCountAsync(3);
  • Page.EmulateMediaAsync()Browser.NewContextAsync() 方法的新选项 Contrast 允许模拟 prefers-contrast 媒体功能。

  • APIRequestContext 的新选项 FailOnStatusCode 使通过该上下文发出的所有 fetch 请求在响应状态码不是 2xx 和 3xx 时抛出异常。

浏览器版本

  • Chromium 134.0.6998.35
  • Mozilla Firefox 135.0
  • WebKit 18.4

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 133
  • Microsoft Edge 133

1.50 版本

对 Xunit 的支持

杂项

用户界面更新

  • 代码生成器中新增按钮,用于选择元素以生成可访问性(aria)快照。
  • 现在,在追踪中,操作 API 调用旁会显示更多详细信息(例如按下的键)。
  • 追踪中 canvas 内容的显示容易出错。现在默认禁用显示,可通过 “显示 canvas 内容” 用户界面设置启用。
  • “调用” 和 “网络” 面板现在会显示更多时间信息。

重大变更

浏览器版本

  • Chromium 133.0.6943.16
  • Mozilla Firefox 134.0
  • WebKit 18.2

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 132
  • Microsoft Edge 132

1.49 版本

Aria 快照

新断言 Expect(Locator).ToMatchAriaSnapshotAsync() 通过与以 YAML 表示的预期可访问性树进行比较,来验证页面结构。

await page.GotoAsync("https://playwright.dev");
await Expect(page.Locator("body")).ToMatchAriaSnapshotAsync(@"
- banner:
- heading /Playwright enables reliable/ [level=1]
- link ""Get started""
- link ""Star microsoft/playwright on GitHub""
- main:
- img ""Browsers (Chromium, Firefox, WebKit)""
- heading ""Any browser • Any platform • One API""
");

你可以使用 测试生成器 或调用 Locator.AriaSnapshotAsync() 生成此断言。

aria 快照指南 中了解更多信息。

追踪分组

新方法 Tracing.GroupAsync() 允许你在追踪查看器中以可视化方式对操作进行分组。

// GroupAsync 和 GroupEndAsync 之间的所有操作
// 将在追踪查看器中显示为一个组。
await Page.Context.Tracing.GroupAsync("Open Playwright.dev > API");
await Page.GotoAsync("https://playwright.dev/");
await Page.GetByRole(AriaRole.Link, new() { Name = "API" }).ClickAsync();
await Page.Context.Tracing.GroupEndAsync();

重大变更:chromemsedge 渠道切换到新的无头模式

如果你在 playwright.config.ts 中使用以下渠道之一,此变更将对你产生影响:

  • chromechrome-devchrome-betachrome-canary
  • msedgemsedge-devmsedge-betamsedge-canary

更新到 Playwright v1.49 后,运行你的测试套件。如果测试仍然通过,那么你可以继续使用。如果测试未通过,你可能需要更新你的快照,并围绕 PDF 查看器和扩展调整一些测试代码。有关更多详细信息,请参阅 问题 #33566

试用全新的 Chromium 无头模式

你可以通过使用 'chromium' 渠道选择启用全新的无头模式。正如 Chrome 官方文档所述

另一方面,全新的无头模式使用的是真正的 Chrome 浏览器,因此更加真实、可靠,并提供更多功能。这使其更适合高精度的端到端 Web 应用测试或浏览器扩展测试。

有关可能遇到的问题列表以及 Chromium 无头模式的更多详细信息,请参阅 问题 #33566。如果你在选择启用后发现任何问题,请提交一个问题。

runsettings.xml
<?xml version="1.0" encoding="utf-8"?>
<RunSettings>
<Playwright>
<BrowserName>chromium</BrowserName>
<LaunchOptions>
<Channel>chromium</Channel>
</LaunchOptions>
</Playwright>
</RunSettings>
dotnet test -- Playwright.BrowserName=chromium Playwright.LaunchOptions.Channel=chromium

其他事项

  • Ubuntu 20.04 和 Debian 11 上的 WebKit 将不再有更新。我们建议将操作系统更新到更高版本。
  • 快照中的 <canvas> 元素现在会绘制一个预览。

浏览器版本

  • Chromium 131.0.6778.33
  • Mozilla Firefox 132.0
  • WebKit 18.2

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 130
  • Microsoft Edge 130

1.48 版本

WebSocket 路由

新方法 Page.RouteWebSocketAsync()BrowserContext.RouteWebSocketAsync() 允许拦截、修改和模拟页面中发起的 WebSocket 连接。以下是一个简单示例,通过用 "response" 响应 "request" 来模拟 WebSocket 通信。

await page.RouteWebSocketAsync("/ws", ws => {
ws.OnMessage(frame => {
if (frame.Text == "request")
ws.Send("response");
});
});

更多详细信息,请参阅 WebSocketRoute

用户界面更新

  • HTML 报告中注释和测试位置新增 “复制” 按钮。
  • 诸如 Route.FulfillAsync() 之类的路由方法调用不再显示在报告和跟踪查看器中。您可以在网络选项卡中查看哪些网络请求被路由。
  • 网络选项卡中的请求新增 “复制为 cURL” 和 “复制为 fetch” 按钮。

其他改进

浏览器版本

  • Chromium 130.0.6723.19
  • Mozilla Firefox 130.0
  • WebKit 18.0

此版本还针对以下稳定版本通道进行了测试:

  • Google Chrome 129
  • Microsoft Edge 129

1.47 版本

网络选项卡改进

跟踪查看器中的网络选项卡有多项不错的改进:

  • 按资源类型和 URL 进行筛选
  • 更好地显示查询字符串参数
  • 字体资源预览

网络选项卡现在有筛选功能

杂项

  • mcr.microsoft.com/playwright/dotnet:v1.47.0 现在提供基于 Ubuntu 24.04 Noble 的 Playwright 镜像。若要使用基于 22.04 jammy 的镜像,请改用 mcr.microsoft.com/playwright/dotnet:v1.47.0-jammy
  • Playwright Docker 镜像的 :latest/:focal/:jammy 标签不再发布。为了获得更好的稳定性和可重复性,请指定具体版本。
  • 现在,可以通过将 ClientCertificates.CertClientCertificates.Key 作为字节数组而非文件路径传入,从内存中传递 TLS 客户端证书。
  • Locator.SelectOptionAsync() 中的 NoWaitAfter 已弃用。
  • 我们收到报告称,在 GitHub Actions macos-13 上,Webkit 中的 WebGL 表现异常。我们建议将 GitHub Actions 升级到 macos-14

浏览器版本

  • Chromium 129.0.6668.29
  • Mozilla Firefox 130.0
  • WebKit 18.0

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 128
  • Microsoft Edge 128

1.46 版本

TLS 客户端证书

Playwright 现在允许提供客户端证书,以便服务器按照 TLS 客户端身份验证的规定对其进行验证。

你可以将客户端证书作为 Browser.NewContextAsync()ApiRequest.NewContextAsync() 的参数提供。以下代码片段为 https://example.com 设置了客户端证书:

var context = await Browser.NewContextAsync(new() {
ClientCertificates = [
new() {
Origin = "https://example.com",
CertPath = "client-certificates/cert.pem",
KeyPath = "client-certificates/key.pem",
}
]
});

追踪查看器更新

  • 文本附件的内容现在会在附件窗格中内联呈现。
  • 新增显示/隐藏诸如 Route.ContinueAsync() 之类路由操作的设置。
  • 请求方法和状态会显示在网络详情标签页中。
  • 新增将源文件位置复制到剪贴板的按钮。
  • 元数据窗格现在会显示 BaseURL

其他杂项

浏览器版本

  • Chromium 128.0.6613.18
  • Mozilla Firefox 128.0
  • WebKit 18.0

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 127
  • Microsoft Edge 127

1.45 版本

时钟

利用新的 Clock API 可以在测试中操作和控制时间,以验证与时间相关的行为。该 API 涵盖许多常见场景,包括:

  • 使用预定义时间进行测试;
  • 保持一致的时间和定时器;
  • 监控非活动状态;
  • 手动推进时间。
// 在测试时间之前的某个时间初始化时钟,并让页面自然加载。
// 随着定时器触发,`Date.now` 将推进。
await Page.Clock.InstallAsync(new()
{
TimeDate = new DateTime(2024, 2, 2, 8, 0, 0)
});
await Page.GotoAsync("http://localhost:3333");

// 假设用户合上笔记本电脑盖子,然后在上午 10 点再次打开。
// 一旦到达该时间点,暂停时间。
await Page.Clock.PauseAtAsync(new DateTime(2024, 2, 2, 10, 0, 0));

// 断言页面状态。
await Expect(Page.GetByTestId("current-time")).ToHaveTextAsync("2/2/2024, 10:00:00 AM");

// 再次合上笔记本电脑盖子,并在上午 10:30 打开。
await Page.Clock.FastForwardAsync("30:00");
await Expect(Page.GetByTestId("current-time")).ToHaveTextAsync("2/2/2024, 10:30:00 AM");

更多详细信息,请参阅 时钟指南

杂项

  • 方法 Locator.SetInputFilesAsync() 现在支持为 <input type=file webkitdirectory> 元素上传目录。

    await page.GetByLabel("Upload directory").SetInputFilesAsync("mydir");
  • 诸如 Locator.ClickAsync()Locator.PressAsync() 等多种方法现在支持 ControlOrMeta 修改键。此键在 macOS 上映射为 Meta,在 Windows 和 Linux 上映射为 Control

    // 按下常用键盘快捷键 Control+S 或 Meta+S 以触发 “保存” 操作。
    await page.Keyboard.PressAsync("ControlOrMeta+S");
  • ApiRequest.NewContextAsync() 中的新属性 httpCredentials.send,它允许始终发送 Authorization 标头,或仅在响应 401 Unauthorized 时发送。

  • Playwright 现在支持在 Ubuntu 24.04 上使用 Chromium、Firefox 和 WebKit。

  • v1.45 是为 macOS 12 Monterey 提供 WebKit 更新的最后一个版本。请更新 macOS 以继续使用最新的 WebKit。

浏览器版本

  • Chromium 127.0.6533.5
  • Mozilla Firefox 127.0
  • WebKit 17.4

此版本还针对以下稳定频道进行了测试:

  • Google Chrome 126
  • Microsoft Edge 126

1.44 版本

新 API

可访问性断言

定位器处理程序

var locator = Page.GetByText("This interstitial covers the button");
await Page.AddLocatorHandlerAsync(locator, async (overlay) =>
{
await overlay.Locator("#close").ClickAsync();
}, new() { Times = 3, NoWaitAfter = true });
// Run your tests that can be interrupted by the overlay.
// ...
await Page.RemoveLocatorHandlerAsync(locator);

其他选项

  • 新方法 FormData.Append() 允许在 APIRequestContext.FetchAsync()Multipart 选项中指定具有相同名称的重复字段:

    var formData = Context.APIRequest.CreateFormData();
    formData.Append("file", new FilePayload()
    {
    Name = "f1.js",
    MimeType = "text/javascript",
    Buffer = System.Text.Encoding.UTF8.GetBytes("var x = 2024;")
    });
    formData.Append("file", new FilePayload()
    {
    Name = "f2.txt",
    MimeType = "text/plain",
    Buffer = System.Text.Encoding.UTF8.GetBytes("hello")
    });
    var response = await Context.APIRequest.PostAsync("https://example.com/uploadFiles", new() { Multipart = formData });
  • Expect(Page).ToHaveURLAsync() 现在支持 IgnoreCase 选项

浏览器版本

  • Chromium 125.0.6422.14
  • Mozilla Firefox 125.0.1
  • WebKit 17.4

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 124
  • Microsoft Edge 124

1.43 版本

新增 API

  • 方法 BrowserContext.ClearCookiesAsync() 现在支持使用筛选器仅移除部分 cookie。

    // 清除所有 cookie。
    await Context.ClearCookiesAsync();
    // 新增功能:清除特定名称的 cookie。
    await Context.ClearCookiesAsync(new() { Name = "session-id" });
    // 新增功能:清除特定域名的 cookie。
    await Context.ClearCookiesAsync(new() { Domain = "my-origin.com" });
  • 新增属性 Locator.ContentFrame 可将 Locator 对象转换为 FrameLocator。当你在某个地方获取到一个 Locator 对象,之后想要与框架内的内容进行交互时,这个属性会很有用。

    var locator = Page.Locator("iframe[name='embedded']");
    // ...
    var frameLocator = locator.ContentFrame;
    await frameLocator.GetByRole(AriaRole.Button).ClickAsync();
  • 新增属性 FrameLocator.Owner 可将 FrameLocator 对象转换为 Locator。当你在某个地方获取到一个 FrameLocator 对象,之后想要与 iframe 元素进行交互时,这个属性会很有用。

    var frameLocator = page.FrameLocator("iframe[name='embedded']");
    // ...
    var locator = frameLocator.Owner;
    await Expect(locator).ToBeVisibleAsync();

浏览器版本

  • Chromium 124.0.6367.8
  • Mozilla Firefox 124.0
  • WebKit 17.4

此版本还针对以下稳定版本通道进行了测试:

  • Google Chrome 123
  • Microsoft Edge 123

1.42 版本

新定位器处理程序

新方法 Page.AddLocatorHandlerAsync() 注册一个回调函数,当指定元素可见且可能阻止 Playwright 操作时,该回调函数将被调用。该回调函数可以消除覆盖层。以下是一个示例,当出现 cookie 对话框时将其关闭。

// 设置处理程序。
await Page.AddLocatorHandlerAsync(
Page.GetByRole(AriaRole.Heading, new() { Name = "Hej! You are in control of your cookies." }),
async () =>
{
await Page.GetByRole(AriaRole.Button, new() { Name = "Accept all" }).ClickAsync();
});
// 像往常一样编写测试。
await Page.GotoAsync("https://www.ikea.com/");
await Page.GetByRole(AriaRole.Link, new() { Name = "Collection of blue and white" }).ClickAsync();
await Expect(Page.GetByRole(AriaRole.Heading, new() { Name = "Light and easy" })).ToBeVisibleAsync();

新 API

公告

  • ⚠️ 不再支持 Ubuntu 18。

浏览器版本

  • Chromium 123.0.6312.4
  • Mozilla Firefox 123.0
  • WebKit 17.4

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 122
  • Microsoft Edge 123

1.41 版本

新增 API

浏览器版本

  • Chromium 121.0.6167.57
  • Mozilla Firefox 121.0
  • WebKit 17.4

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 120
  • Microsoft Edge 120

1.40 版本

测试生成器更新

Playwright 测试生成器

用于生成断言的新工具:

以下是一个生成的带断言测试示例:

await Page.GotoAsync("https://playwright.dev/");
await Page.GetByRole(AriaRole.Link, new() { Name = "Get started" }).ClickAsync();
await Expect(Page.GetByLabel("Breadcrumbs").GetByRole(AriaRole.List)).ToContainTextAsync("Installation");
await Expect(Page.GetByLabel("Search")).ToBeVisibleAsync();
await Page.GetByLabel("Search").ClickAsync();
await Page.GetByPlaceholder("Search docs").FillAsync("locator");
await Expect(Page.GetByPlaceholder("Search docs")).ToHaveValueAsync("locator");

新 API

其他变更

浏览器版本

  • Chromium 120.0.6099.28
  • Mozilla Firefox 119.0
  • WebKit 17.4

此版本还在以下稳定渠道进行了测试:

  • Google Chrome 119
  • Microsoft Edge 119

1.39 版本

常青浏览器更新。

浏览器版本

  • Chromium 119.0.6045.9
  • Mozilla Firefox 118.0.1
  • WebKit 17.4

此版本还在以下稳定渠道进行了测试:

  • Google Chrome 118
  • Microsoft Edge 118

1.38 版本

追踪查看器更新

Playwright 追踪查看器

  1. 放大时间范围。
  2. 网络面板重新设计。

新 API

弃用内容

浏览器版本

  • Chromium 117.0.5938.62
  • Mozilla Firefox 117.0
  • WebKit 17.0

此版本还在以下稳定渠道进行了测试:

  • Google Chrome 116
  • Microsoft Edge 116

1.37 版本

📚 Debian 12 Bookworm 支持

Playwright 现在在 x86_64 和 arm64 架构上支持 Debian 12 Bookworm,适用于 Chromium、Firefox 和 WebKit。如果遇到任何问题,请告知我们! Linux 支持情况如下:

Ubuntu 20.04Ubuntu 22.04Debian 11Debian 12
Chromium
WebKit
Firefox

浏览器版本

  • Chromium 116.0.5845.82
  • Mozilla Firefox 115.0
  • WebKit 17.0

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 115
  • Microsoft Edge 115

1.36 版本

🏝️ 夏季维护版本。

浏览器版本

  • Chromium 115.0.5790.75
  • Mozilla Firefox 115.0
  • WebKit 17.0

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 114
  • Microsoft Edge 114

1.35 版本

亮点

  • Page.ScreenshotAsync()Locator.ScreenshotAsync() 方法新增 MaskColor 选项,用于更改默认遮罩颜色。

  • 新增 uninstall CLI 命令,用于卸载浏览器二进制文件:

    $ pwsh bin/Debug/netX/playwright.ps1 uninstall # 删除此安装所安装的浏览器
    $ pwsh bin/Debug/netX/playwright.ps1 uninstall --all # 删除所有曾经安装的 Playwright 浏览器

浏览器版本

  • Chromium 115.0.5790.13
  • Mozilla Firefox 113.0
  • WebKit 16.4

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 114
  • Microsoft Edge 114

1.34 版本

亮点

浏览器版本

  • Chromium 114.0.5735.26
  • Mozilla Firefox 113.0
  • WebKit 16.4

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 113
  • Microsoft Edge 113

1.33 版本

定位器更新

  • 使用 Locator.Or() 创建一个定位器,它可以匹配两个定位器中的任意一个。假设有这样一个场景,你想要点击 “新建邮件” 按钮,但有时会弹出安全设置对话框。在这种情况下,你可以等待 “新建邮件” 按钮或对话框出现,然后采取相应的行动:

    var newEmail = Page.GetByRole(AriaRole.Button, new() { Name = "New email" });
    var dialog = Page.GetByText("Confirm security settings");
    await Expect(newEmail.Or(dialog)).ToBeVisibleAsync();
    if (await dialog.IsVisibleAsync())
    await Page.GetByRole(AriaRole.Button, new() { Name = "Dismiss" }).ClickAsync();
    await newEmail.ClickAsync();
  • Locator.Filter() 中使用新选项 HasNotHasNotText|HasNotTextRegex 来查找 不匹配 特定条件的元素。

    var rowLocator = Page.Locator("tr");
    await rowLocator
    .Filter(new() { HasNotText = "text in column 1" })
    .Filter(new() { HasNot = Page.GetByRole(AriaRole.Button, new() { Name = "column 2 button" })})
    .ScreenshotAsync();
  • 使用新的以网页为优先的断言 Expect(Locator).ToBeAttachedAsync() 来确保元素存在于页面的 DOM 中。不要与 Expect(Locator).ToBeVisibleAsync() 混淆,后者确保元素既已附加又可见。

新增 API

⚠️ 重大变更

  • mcr.microsoft.com/playwright/dotnet:v1.33.0 现在提供基于 Ubuntu Jammy 的 Playwright 镜像。若要使用基于 focal 的镜像,请改用 mcr.microsoft.com/playwright/dotnet:v1.33.0-focal

浏览器版本

  • Chromium 113.0.5672.53
  • Mozilla Firefox 112.0
  • WebKit 16.4

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 112
  • Microsoft Edge 112

1.32 版本

新增 API

浏览器版本

  • Chromium 112.0.5615.29
  • Mozilla Firefox 111.0
  • WebKit 16.4

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 111
  • Microsoft Edge 111

1.31 版本

新增 API

其他更新

  • 跟踪查看器中的 DOM 快照现在可以在单独的窗口中打开。
  • 方法 Route.FetchAsync() 新增选项 MaxRedirects
  • Playwright 现在支持 Debian 11 arm64。
  • 官方 Docker 镜像 现在包含 Node 18 而非 Node 16。

浏览器版本

  • Chromium 111.0.5563.19
  • Mozilla Firefox 109.0
  • WebKit 16.4

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 110
  • Microsoft Edge 110

1.30 版本

浏览器版本

  • Chromium 110.0.5481.38
  • Mozilla Firefox 108.0.2
  • WebKit 16.4

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 109
  • Microsoft Edge 109

1.29 版本

新增 API

  • 新方法 Route.FetchAsync() 以及 Route.FulfillAsync() 的新选项 Json

    await Page.RouteAsync("**/api/settings", async route => {
    // 获取原始设置。
    var response = await route.FetchAsync();

    // 强制将设置主题设为预定义值。
    var json = await response.JsonAsync<MyDataType>();
    json.Theme = "Solarized";

    // 使用修改后的数据完成请求。
    await route.FulfillAsync(new() {
    Json = json
    });
    });
  • 新方法 Locator.AllAsync(),用于遍历所有匹配的元素:

    // 勾选所有复选框!
    var checkboxes = Page.GetByRole(AriaRole.Checkbox);
    foreach (var checkbox in await checkboxes.AllAsync())
    await checkbox.CheckAsync();
  • Locator.SelectOptionAsync() 现在可通过值或标签进行匹配:

    <select multiple>
    <option value="red">Red</option>
    <option value="green">Green</option>
    <option value="blue">Blue</option>
    </select>
    await element.SelectOptionAsync("Red");

浏览器版本

  • Chromium 109.0.5414.46
  • Mozilla Firefox 107.0
  • WebKit 16.4

此版本还针对以下稳定版本进行了测试:

  • Google Chrome 108
  • Microsoft Edge 108

1.28 版本

Playwright 工具

  • 代码生成中的实时定位器。使用 “探索” 工具为页面上的任何元素生成定位器。

定位器探索器

新增 API

浏览器版本

  • Chromium 108.0.5359.29
  • Mozilla Firefox 106.0
  • WebKit 16.4

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 107
  • Microsoft Edge 107

1.27 版本

定位器

有了这些新 API,编写定位器变得轻松愉快:

await page.GetByLabel("用户名").FillAsync("John");

await page.GetByLabel("密码").FillAsync("secret-password");

await page.GetByRole(AriaRole.Button, new() { NameString = "登录" }).ClickAsync();

await Expect(Page.GetByText("欢迎,John!")).ToBeVisibleAsync();

所有相同的方法在 LocatorFrameLocatorFrame 类中也可用。

其他亮点

  • 正如在 1.25 版本中宣布的,自 2022 年 12 月起,不再支持 Ubuntu 18。除此之外,从下一个 Playwright 版本开始,Ubuntu 18 上也不会再有 WebKit 更新。

行为变更

  • Expect(Locator).ToHaveAttributeAsync() 带空值时,不再匹配缺失的属性。例如,当 button 没有 disabled 属性时,以下代码片段将执行成功。

    await Expect(Page.GetByRole(AriaRole.Button)).ToHaveAttributeAsync("disabled", "");

浏览器版本

  • Chromium 107.0.5304.18
  • Mozilla Firefox 105.0.1
  • WebKit 16.0

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 106
  • Microsoft Edge 106

1.26 版本

断言

其他亮点

  • ApiRequestContext.GetAsync() 及其他方法新增选项 MaxRedirects,用于限制重定向次数。
  • 代码生成(Codegen)现在支持 MSTest 和 NUnit 框架。
  • 现在支持 ASP .NET。

行为变更

许多 Playwright API 已经支持 WaitUntil: WaitUntilState.DOMContentLoaded 选项。例如:

await Page.GotoAsync("https://playwright.dev", new() { WaitUntil = WaitUntilState.DOMContentLoaded });

在 1.26 版本之前,这将等待所有 iframe 触发 DOMContentLoaded 事件。

为了与 Web 规范保持一致,WaitUntilState.DOMContentLoaded 值仅等待目标框架触发 'DOMContentLoaded' 事件。若要等待所有 iframe,请使用 WaitUntil: WaitUntilState.Load

浏览器版本

  • Chromium 106.0.5249.30
  • Mozilla Firefox 104.0
  • WebKit 16.0

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 105
  • Microsoft Edge 105

1.25 版本

新增 .runsettings 文件支持

Microsoft.Playwright.NUnitMicrosoft.Playwright.MSTest 在运行端到端测试时,现在会考虑 .runsettings 文件以及通过命令行界面传递的设置。有关支持设置的完整列表,请参阅 文档

以下内容现在可以正常工作:

<?xml version="1.0" encoding="utf-8"?>
<RunSettings>
<!-- Playwright -->
<Playwright>
<BrowserName>chromium</BrowserName>
<ExpectTimeout>5000</ExpectTimeout>
<LaunchOptions>
<Headless>true</Headless>
<Channel>msedge</Channel>
</LaunchOptions>
</Playwright>
<!-- 常规运行配置 -->
<RunConfiguration>
<EnvironmentVariables>
<!-- 为了调试选择器,建议设置以下环境变量 -->
<DEBUG>pw:api</DEBUG>
</EnvironmentVariables>
</RunConfiguration>
</RunSettings>

公告

  • 🪦 这是最后一个支持 macOS 10.15 的版本(自 1.21 版本起弃用)。
  • ⚠️ Ubuntu 18 现已弃用,自 2022 年 12 月起不再支持。

浏览器版本

  • Chromium 105.0.5195.19
  • Mozilla Firefox 103.0
  • WebKit 16.0

此版本还针对以下稳定渠道进行了测试:

  • Google Chrome 104
  • Microsoft Edge 104

1.24 版本

🐂 Debian 11 Bullseye 支持

Playwright 现在在 x86_64 架构上支持 Debian 11 Bullseye 系统的 Chromium、Firefox 和 WebKit。如果遇到任何问题,请告知我们!

Linux 支持情况如下:

| | Ubuntu 20.04 | Ubuntu 22.04 | Debian 11 | :--- | :---: | :---: | :---: | :---: | | Chromium | ✅ | ✅ | ✅ | | WebKit | ✅ | ✅ | ✅ | | Firefox | ✅ | ✅ | ✅ |

全新入门文档

我们重写了入门文档,使其更侧重于端到端测试。请访问 playwright.dev 查看。

1.23 版本

API 测试

Playwright for .NET 1.23 引入了全新的 API 测试,允许你直接从 .NET 向服务器发送请求!现在你可以:

  • 测试服务器 API
  • 在测试中访问 Web 应用程序之前准备服务器端状态
  • 在浏览器中执行某些操作后验证服务器端后置条件

要代表 Playwright 的 Page 执行请求,请使用全新的 Page.APIRequest API:

// 代表页面执行 GET 请求
var response = await Page.APIRequest.GetAsync("http://example.com/foo.json");
Console.WriteLine(response.Status);
Console.WriteLine(response.StatusText);
Console.WriteLine(response.Ok);
Console.WriteLine(response.Headers["Content-Type"]);
Console.WriteLine(await response.TextAsync());
Console.WriteLine((await response.JsonAsync())?.GetProperty("foo").GetString());

在我们的 API 测试指南 中了解更多信息。

网络重放

现在,你可以将网络流量记录到 HAR 文件中,并在测试中重复使用这些流量。

要将网络流量记录到 HAR 文件中:

pwsh bin/Debug/netX/playwright.ps1 open --save-har=example.har --save-har-glob="**/api/**" https://example.com

或者,你也可以通过编程方式记录 HAR:

var context = await browser.NewContextAsync(new()
{
RecordHarPath = harPath,
RecordHarUrlFilterString = "**/api/**",
});

// ... 执行操作 ...

// 关闭上下文以确保 HAR 保存到磁盘。
context.CloseAsync();

使用新方法 Page.RouteFromHARAsync()BrowserContext.RouteFromHARAsync()HAR 文件提供匹配的响应:

await context.RouteFromHARAsync("example.har");

我们的文档 中了解更多信息。

高级路由

现在,你可以使用 Route.FallbackAsync() 将路由推迟到其他处理程序。

考虑以下示例:

// 从所有请求中删除一个标头。
await page.RouteAsync("**/*", async route =>
{
var headers = route.Request.Headers;
headers.Remove("X-Secret");
await route.ContinueAsync(new() { Headers = headers });
});

// 中止所有图片。
await page.RouteAsync("**/*", async route =>
{
if (route.Request.ResourceType == "image")
{
await route.AbortAsync();
}
else
{
await route.FallbackAsync();
}
});

请注意,新方法 Page.RouteFromHARAsync()BrowserContext.RouteFromHARAsync() 也参与路由,并且可以推迟处理。

以 Web 为优先的断言更新

杂项

  • 如果有服务工作线程(service worker)妨碍操作,现在可以通过新的上下文选项 serviceWorkers 轻松禁用它:

    var context = await Browser.NewContextAsync(new()
    {
    ServiceWorkers = ServiceWorkerPolicy.Block
    });
  • recordHar 上下文选项使用 .zip 路径会自动压缩生成的 HAR:

    var context = await Browser.NewContextAsync(new() { RecordHarPath = "example.har.zip" });
  • 如果打算手动编辑 HAR,可以考虑使用 "minimal" HAR 录制模式,该模式仅记录重放所需的基本信息:

    var context = await Browser.NewContextAsync(new() { RecordHarPath = "example.har", RecordHarMode = HarMode.Minimal });
  • Playwright 现在可在 Ubuntu 22 amd64 和 Ubuntu 22 arm64 上运行。

  • Playwright for .NET 现在支持 linux-arm64,并为其提供了 arm64 Ubuntu 20.04 Docker 镜像

1.22 版本

亮点

  • 角色选择器,支持通过 ARIA 角色ARIA 属性可访问名称 选择元素。

    // 点击可访问名称为“登录”的按钮
    await page.Locator("role=button[name='log in']").ClickAsync();

    更多信息请阅读 我们的文档

  • 全新的 Locator.Filter() API,用于筛选现有定位器。

    var buttons = page.Locator("role=button");
    // ...
    var submitLocator = buttons.Filter(new() { HasText = "注册" });
    await submitLocator.ClickAsync();

1.21 版本

亮点

  • 全新的角色选择器,支持通过 ARIA 角色ARIA 属性可访问名称 选择元素。

    // 点击可访问名称为“登录”的按钮
    await page.Locator("role=button[name='log in']").ClickAsync();

    更多信息请阅读 我们的文档

  • Page.ScreenshotAsync() 中新增 scale 选项,用于生成较小尺寸的截图。

  • Page.ScreenshotAsync() 中新增 caret 选项,用于控制文本插入符号。默认为 "hide"

  • 我们现在提供了指定的 .NET Docker 镜像 mcr.microsoft.com/playwright/dotnet。更多信息请阅读 我们的文档

行为变更

浏览器版本

  • Chromium 101.0.4951.26
  • Mozilla Firefox 98.0.2
  • WebKit 15.4

此版本还针对以下稳定版本通道进行了测试:

  • Google Chrome 100
  • Microsoft Edge 100

1.20 版本

以网页为优先的断言

Playwright for .NET 1.20 引入了以网页为优先的断言

考虑以下示例:

using System.Threading.Tasks;
using Microsoft.Playwright.NUnit;
using NUnit.Framework;

namespace PlaywrightTests;

[TestFixture]
public class ExampleTests : PageTest
{
[Test]
public async Task StatusBecomesSubmitted()
{
await Expect(Page.Locator(".status")).ToHaveTextAsync("Submitted");
}
}

Playwright 将反复测试选择器为 .status 的节点,直到获取到的节点文本为 "Submitted"。它会不断重新获取并检查该节点,直到条件满足或超时。你可以将此超时时间作为一个选项传入。

我们的文档中了解更多信息。

其他更新

公告

  • v1.20 是针对 macOS 10.15 Catalina 发布的最后一个包含 WebKit 更新的版本。请更新 macOS 以继续使用最新最好的 WebKit!

浏览器版本

  • Chromium 101.0.4921.0
  • Mozilla Firefox 97.0.1
  • WebKit 15.4

此版本还针对以下稳定版本通道进行了测试:

  • Google Chrome 99
  • Microsoft Edge 99

1.19 版本

亮点

  • Locator 现在支持 has 选项,该选项可确保其内部包含另一个定位器:

    await Page.Locator("article", new() { Has = Page.Locator(".highlight") }).ClickAsync();

    更多信息请阅读 定位器文档

  • 新增 Locator.Page

  • Page.ScreenshotAsync()Locator.ScreenshotAsync() 现在会自动隐藏闪烁的插入符号。

  • Playwright Codegen 现在会生成定位器和框架定位器。

浏览器版本

  • Chromium 100.0.4863.0
  • Mozilla Firefox 96.0.1
  • WebKit 15.4

此版本还针对以下稳定版本通道进行了测试:

  • Google Chrome 98
  • Microsoft Edge 98

1.18 版本

定位器改进

  • Locator.DragToAsync()

  • 现在每个定位器都可以根据其包含的文本进行可选过滤:

    await Page.Locator("li", new() { HasTextString = "My Item" })
    .Locator("button").click();

    更多信息请阅读 定位器文档

新 API 及变更

浏览器版本

  • Chromium 99.0.4812.0
  • Mozilla Firefox 95.0
  • WebKit 15.4

此版本还针对以下稳定版本通道进行了测试:

  • Google Chrome 97
  • Microsoft Edge 97

1.17 版本

框架定位器

Playwright 1.17 引入了 框架定位器(Frame Locator),这是一种用于定位页面上 iframe 的定位器。框架定位器包含了足够的逻辑,可用于检索 iframe,然后在该 iframe 中定位元素。框架定位器默认是严格模式,会等待 iframe 出现,并且可用于以 Web 为优先的断言。

Graphics

可以使用 Page.FrameLocator()Locator.FrameLocator() 方法创建框架定位器。

var locator = page.FrameLocator("#my-frame").Locator("text=Submit");
await locator.ClickAsync();

我们的文档 中了解更多信息。

追踪查看器更新

Playwright 追踪查看器现已在 线上可用,网址为 https://trace.playwright.dev!只需拖放 trace.zip 文件即可查看其内容。

注意:追踪文件不会上传到任何地方;trace.playwright.dev 是一个 渐进式 Web 应用程序,可在本地处理追踪信息。

  • Playwright 测试追踪现在默认包含源文件(可以通过追踪选项关闭)
  • 追踪查看器现在显示测试名称
  • 新增带有浏览器详细信息的追踪元数据标签
  • 快照现在包含 URL 栏

image

HTML 报告更新

  • HTML 报告现在支持动态筛选
  • 报告现在是一个 单一静态 HTML 文件,可以通过电子邮件发送或作为 Slack 附件发送。

image

Ubuntu ARM64 支持及更多功能

  • Playwright 现在支持 Ubuntu 20.04 ARM64。现在,你可以在 Apple M1 及树莓派的 Docker 中运行 Playwright 测试。

  • 现在你可以使用 Playwright 在 Linux 上安装稳定版的 Edge 浏览器:

    pwsh bin/Debug/netX/playwright.ps1 install msedge

新 API

  • 追踪(Tracing)现在支持 'title' 选项
  • 页面导航支持新的 'commit' 等待选项

1.16 版本

🎭 Playwright 库

Locator.WaitForAsync

等待定位器(Locator)解析为具有给定状态的单个元素。默认为 state: 'visible'

var orderSent = page.Locator("#order-sent");
orderSent.WaitForAsync();

详细了解 Locator.WaitForAsync()

🎭 Playwright 追踪查看器

  • 使用 pwsh bin/Debug/netX/playwright.ps1 show-trace 运行追踪查看器,并将追踪文件拖放到追踪查看器 PWA 中
  • 对操作目标进行更好的可视化归因

详细了解 追踪查看器

浏览器版本

  • Chromium 97.0.4666.0
  • Mozilla Firefox 93.0
  • WebKit 15.4

此版本的 Playwright 还针对以下稳定渠道进行了测试:

  • Google Chrome 94
  • Microsoft Edge 94

1.15 版本

🖱️ 鼠标滚轮

现在,通过使用 Mouse.WheelAsync(),你可以进行垂直或水平滚动。

📜 全新的 Headers API

以前,无法获取响应的多个标头值。现在这已成为可能,并且还提供了其他辅助函数:

🌈 强制颜色模拟

现在,可以通过在 Browser.NewContextAsync() 中传递 forced-colors CSS 媒体功能,或调用 Page.EmulateMediaAsync() 来模拟该功能。

新 API

重要 ⚠

  • ⬆ 我们的 CLI 工具 不再 支持 .NET Core Apps 2.1。自 2021 年 8 月 31 日起,.NET Core 2.1 已 不再受支持,并且不会再接收任何安全更新。我们决定推进 CLI 的发展,并要求最低使用 .NET Core 3.1。

浏览器版本

  • Chromium 96.0.4641.0
  • Mozilla Firefox 92.0
  • WebKit 15.0

1.14 版本

⚡️ 全新 “严格” 模式

选择器的模糊性是自动化测试中常见的问题。“严格” 模式 可确保选择器指向单个元素,否则将抛出异常。

在操作调用中设置 setStrict(true) 以启用该模式。

// 如果存在多个按钮,这将抛出异常!
await page.Locator("button", new() { Strict = true });

📍 全新 定位器 API

定位器(Locator)表示页面上元素的视图。它包含了在任何给定时刻检索元素所需的逻辑。

定位器(Locator)元素句柄(ElementHandle) 之间的区别在于,后者指向特定的元素,而 定位器(Locator) 则包含了如何检索该元素的逻辑。

此外,定位器默认是 “严格” 的

var locator = page.Locator("button");
await locator.ClickAsync();

文档 中了解更多信息。

🧩 实验性的 ReactVue 选择器引擎

React 和 Vue 选择器允许通过组件名称和 / 或属性值来选择元素。其语法与 属性选择器 非常相似,并支持所有属性选择器运算符。

await page.Locator("_react=SubmitButton[enabled=true]").ClickAsync();
await page.Locator("_vue=submit-button[enabled=true]").ClickAsync();

React 选择器文档Vue 选择器文档 中了解更多信息。

✨ 全新的 nthvisible 选择器引擎

  • nth 选择器引擎等同于 :nth-match 伪类,但可以与其他选择器引擎结合使用。
  • visible 选择器引擎等同于 :visible 伪类,但可以与其他选择器引擎结合使用。
// 在所有按钮中选择第一个按钮
await button.ClickAsync("button >> nth=0");
// 或者如果您使用定位器,可以使用 First、Nth() 和 Last
await page.Locator("button").First.ClickAsync();

// 点击一个可见按钮
await button.ClickAsync("button >> visible=true");

浏览器版本

  • Chromium 94.0.4595.0
  • Mozilla Firefox 91.0
  • WebKit 15.0

1.13 版本

Playwright

工具

  • Playwright 追踪查看器现在会显示参数、返回值和 console.log() 调用。

全新和全面修订的指南

浏览器版本

  • Chromium 93.0.4576.0
  • Mozilla Firefox 90.0
  • WebKit 14.2

全新 Playwright API

1.12 版本

亮点

浏览器版本

  • Chromium 93.0.4530.0
  • Mozilla Firefox 89.0
  • WebKit 14.2

此版本的 Playwright 还针对以下稳定版本进行了测试:

  • Google Chrome 91

  • Microsoft Edge 91