跳至主要内容

发布说明

版本 1.51

亮点

  • New option IndexedDB for BrowserContext.StorageStateAsync() allows to save and restore IndexedDB contents. Useful when your application uses IndexedDB API to store authentication tokens, like Firebase Authentication.

    Here is an example following the authentication guide:

    // Save storage state into the file. Make sure to include IndexedDB.
    await context.StorageStateAsync(new()
    {
    Path = "../../../playwright/.auth/state.json",
    IndexedDB = true
    });

    // Create a new context with the saved storage state.
    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);
  • 新增选项 Contrast 用于方法 Page.EmulateMediaAsync()Browser.NewContextAsync(),可以模拟 prefers-contrast 媒体特性。

  • 新增选项 FailOnStatusCode 使得通过 APIRequestContext 发出的所有fetch请求在响应码非2xx和3xx时会抛出异常。

浏览器版本

  • Chromium 134.0.6998.35
  • Mozilla Firefox 135.0
  • WebKit 18.4

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

  • Google Chrome 133
  • Microsoft Edge 133

版本 1.50

支持Xunit

其他

用户界面更新

  • Codegen 中新增按钮,用于选择元素以生成 aria 快照。
  • 在追踪记录中,现在会显示更多详细信息(例如按下的按键)与操作API调用一起展示。
  • 在追踪记录中显示canvas内容容易出错。现在默认禁用此显示功能,可以通过Display canvas content界面设置来启用。
  • CallNetwork 面板现在显示额外的时间信息。

重大变更

浏览器版本

  • 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""
");

您可以通过Test Generator生成此断言,或者调用Locator.AriaSnapshotAsync()来实现。

了解更多信息,请参阅aria快照指南

追踪分组

新方法 Tracing.GroupAsync() 允许您在追踪查看器中直观地对操作进行分组。

// All actions between GroupAsync and GroupEndAsync
// will be shown in the trace viewer as a group.
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中使用以下任一渠道,此更改将影响您:

  • chrome, chrome-dev, chrome-beta, 或 chrome-canary
  • msedge, msedge-dev, msedge-beta, 或 msedge-canary

升级到Playwright v1.49后,运行您的测试套件。如果测试仍然通过,说明一切正常。如果未通过,您可能需要更新快照,并调整一些关于PDF查看器和扩展的测试代码。详情请参阅issue #33566

尝试新的Chromium无头模式

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

另一方面,New Headless是真正的Chrome浏览器,因此更真实、可靠,并提供更多功能。这使得它更适合高精度的端到端Web应用程序测试或浏览器扩展测试。

有关您可能遇到的潜在问题列表及Chromium无头模式的更多详情,请参阅issue #33566。如果在选择加入后遇到任何问题,请提交issue报告。

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

用户界面更新

  • New "copy" buttons for annotations and test location in the HTML report.
  • 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进行筛选
  • 更好地显示查询字符串参数
  • 字体资源预览

Network tab now has filters

其他

  • 现在 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客户端证书。
  • NoWaitAfterLocator.SelectOptionAsync() 中已被弃用。
  • 我们收到关于Webkit中WebGL在GitHub Actions macos-13上运行异常的反馈。建议将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涵盖了许多常见场景,包括:

  • 使用预定义时间进行测试;
  • 保持时间与计时器的一致性;
  • 监控不活动状态;
  • 手动逐步推进时间。
// Initialize clock with some time before the test time and let the page load naturally.
// `Date.now` will progress as the timers fire.
await Page.Clock.InstallAsync(new()
{
TimeDate = new DateTime(2024, 2, 2, 8, 0, 0)
});
await Page.GotoAsync("http://localhost:3333");

// Pretend that the user closed the laptop lid and opened it again at 10am.
// Pause the time once reached that point.
await Page.Clock.PauseAtAsync(new DateTime(2024, 2, 2, 10, 0, 0));

// Assert the page state.
await Expect(Page.GetByTestId("current-time")).ToHaveTextAsync("2/2/2024, 10:00:00 AM");

// Close the laptop lid again and open it at 10:30am.
await Page.Clock.FastForwardAsync("30:00");
await Expect(Page.GetByTestId("current-time")).ToHaveTextAsync("2/2/2024, 10:30:00 AM");

更多详情请参阅时钟指南

其他

  • 方法 Locator.SetInputFilesAsync() 现在支持为 元素上传目录。

    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");
  • 新增属性 httpCredentials.sendApiRequest.NewContextAsync() 中,允许始终发送 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);

其他选项

  • New method FormData.Append() allows to specify repeating fields with the same name in Multipart option in APIRequestContext.FetchAsync():

    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 option

浏览器版本

  • 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对话框时自动关闭它。

// Setup the handler.
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();
});
// Write the test as usual.
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 Test Generator

生成断言的新工具:

这是一个带有断言的生成测试示例:

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 Trace Viewer

  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

亮点

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

  • 新增 uninstall 命令行工具用于卸载浏览器二进制文件:

    $ 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

定位器更新

  • Use Locator.Or() to create a locator that matches either of the two locators. Consider a scenario where you'd like to click on a "New email" button, but sometimes a security settings dialog shows up instead. In this case, you can wait for either a "New email" button, or a dialog and act accordingly:

    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();
  • Use new options HasNot and HasNotText|HasNotTextRegex in Locator.Filter() to find elements that do not match certain conditions.

    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() 混淆,后者确保元素既存在于DOM中又可见。

新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

  • New method Route.FetchAsync() and new option Json for Route.FulfillAsync():

    await Page.RouteAsync("**/api/settings", async route => {
    // Fetch original settings.
    var response = await route.FetchAsync();

    // Force settings theme to a predefined value.
    var json = await response.JsonAsync<MyDataType>();
    json.Theme = "Solarized";

    // Fulfill with modified data.
    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() matches now by value or label:

    <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 工具

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

Locator Explorer

新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("User Name").FillAsync("John");

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

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

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

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

其他亮点

  • 正如在v1.25版本中所宣布的,Ubuntu 18将从2022年12月起不再受支持。除此之外,从下一个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

断言

其他亮点

  • 新增选项 MaxRedirects 用于 ApiRequestContext.GetAsync() 等方法以限制重定向次数。
  • Codegen 现在支持 MSTest 和 NUnit 框架。
  • 现在支持ASP .NET。

行为变更

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

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

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

为了与网页规范保持一致,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 文件以及通过CLI传递的设置。完整支持设置列表请参阅文档

以下操作目前无法工作:

<?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>
<!-- General run configuration -->
<RunConfiguration>
<EnvironmentVariables>
<!-- For debugging selectors, it's recommend to set the following environment variable -->
<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 Testing 功能,让您可以直接从 .NET 发送请求到服务器!现在您可以:

  • 测试你的服务器API
  • 在测试中访问网页应用前准备服务器端状态
  • 在浏览器中运行某些操作后验证服务器端后置条件

要代表Playwright的Page发起请求,请使用新的Page.APIRequest API

// Do a GET request on behalf of page
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/**",
});

// ... Perform actions ...

// Close context to ensure HAR is saved to disk.
context.CloseAsync();

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

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

了解更多信息,请参阅我们的文档

高级路由

您现在可以使用Route.FallbackAsync()来将路由延迟交给其他处理程序。

考虑以下示例:

// Remove a header from all requests.
await page.RouteAsync("**/*", async route =>
{
var headers = route.Request.Headers;
headers.Remove("X-Secret");
await route.ContinueAsync(new() { Headers = headers });
});

// Abort all images.
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属性可访问名称来选择元素。

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

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

  • 新增 Locator.Filter() API 用于过滤现有的定位器

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

版本 1.21

亮点

  • 新增角色选择器,允许通过元素的ARIA角色ARIA属性可访问名称来选择元素。

    // 点击可访问名称为"log in"的按钮
    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

Web优先断言

Playwright for .NET 1.20 引入了 Web-First Assertions

考虑以下示例:

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与变更

  • AcceptDownloads 选项现在默认设置为 true
  • Sources 选项可将源代码嵌入到跟踪记录中。

浏览器版本

  • Chromium 99.0.4812.0
  • Mozilla Firefox 95.0
  • WebKit 15.4

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

  • Google Chrome 97
  • Microsoft Edge 97

版本 1.17

框架定位器

Playwright 1.17 引入了frame locators - 用于定位页面上的iframe。框架定位器封装了足够逻辑来获取iframe并在该iframe中定位元素。框架定位器默认是严格的,会等待iframe出现,并可用于Web优先断言。

Graphics

Frame定位器可以通过Page.FrameLocator()Locator.FrameLocator()方法创建。

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

了解更多信息,请访问我们的文档

追踪查看器更新

Playwright Trace Viewer 现已在线提供,访问地址为 https://trace.playwright.dev!只需拖放您的 trace.zip 文件即可检查其内容。

注意: 跟踪文件不会上传到任何地方;trace.playwright.dev是一个渐进式网络应用,它会在本地处理跟踪记录。

  • Playwright Test 现在默认包含源代码追踪(可通过tracing选项关闭此功能)
  • Trace Viewer 现在会显示测试名称
  • 新增跟踪元数据标签页,显示浏览器详细信息
  • 快照现在包含URL栏

image

HTML Report Update

  • HTML report now supports dynamic filtering
  • Report is now a single static HTML file that could be sent by e-mail or as a slack attachment.

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 库

定位器.WaitFor异步方法

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

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

了解更多关于Locator.WaitForAsync()的信息。

🎭 Playwright Trace Viewer

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

了解更多关于Trace Viewer的信息。

浏览器版本

  • Chromium 97.0.4666.0
  • Mozilla Firefox 93.0
  • WebKit 15.4

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

  • Google Chrome 94
  • Microsoft Edge 94

版本 1.15

🖱️ 鼠标滚轮

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

📜 新标题API

以前无法获取响应的多个标头值。现在可以实现,并且还提供了额外的辅助函数:

🌈 强制色彩模拟

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

新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

⚡️ 新增"严格"模式

选择器歧义是自动化测试中的常见问题。"strict"模式确保您的选择器指向单个元素,否则会抛出异常。

在你的操作调用中设置setStrict(true)来选择加入。

// This will throw if you have more than one button!
await page.Locator("button", new() { Strict = true });

📍 全新 定位器API

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

LocatorElementHandle之间的区别在于,后者指向特定元素,而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 伪类,但可以与其他选择器引擎组合使用。
// select the first button among all buttons
await button.ClickAsync("button >> nth=0");
// or if you are using locators, you can use First, Nth() and Last
await page.Locator("button").First.ClickAsync();

// click a visible button
await button.ClickAsync("button >> visible=true");

浏览器版本

  • Chromium 94.0.4595.0
  • Mozilla Firefox 91.0
  • WebKit 15.0

版本 1.13

Playwright

工具

  • Playwright Trace Viewer 现在可以显示参数、返回值以及 console.log() 调用。

全新与全面改进的指南

浏览器版本

  • Chromium 93.0.4576.0
  • Mozilla Firefox 90.0
  • WebKit 14.2

Playwright 新API接口

版本 1.12

亮点

  • Playwright for .NET v1.12 现已稳定发布!
  • 开箱即用,内置codegentrace viewer工具

浏览器版本

  • Chromium 93.0.4530.0
  • Mozilla Firefox 89.0
  • WebKit 14.2

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

  • Google Chrome 91
  • Microsoft Edge 91