发布说明
版本 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
- 通过 Microsoft.Playwright.Xunit 支持 xUnit 2.8+。请参阅我们的 入门指南 了解更多信息。
其他
- 新增方法 Expect(Locator).ToHaveAccessibleErrorMessageAsync() 用于断言定位器指向具有指定 aria errormessage 属性的元素。
用户界面更新
- Codegen 中新增按钮,用于选择元素以生成 aria 快照。
- 在追踪记录中,现在会显示更多详细信息(例如按下的按键)与操作API调用一起展示。
- 在追踪记录中显示
canvas
内容容易出错。现在默认禁用此显示功能,可以通过Display canvas content
界面设置来启用。 Call
和Network
面板现在显示额外的时间信息。
重大变更
- Expect(Locator).ToBeEditableAsync() 和 Locator.IsEditableAsync() 现在会在目标元素不是
、
或其他可编辑元素时抛出异常。
浏览器版本
- 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();
重大变更:chrome
和 msedge
渠道切换至全新无头模式
如果您在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报告。
<?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"按钮。
其他
- 新方法 Page.RequestGCAsync() 可能有助于检测内存泄漏。
- 由APIRequestContext发起的请求现在会在HAR中记录详细的计时和安全信息。
浏览器版本
- 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.Cert和ClientCertificates.Key作为字节数组而非文件路径传递,从内存中传递TLS客户端证书。
- NoWaitAfter 在 Locator.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
。
其他
- 在ApiRequestContext.FetchAsync()中新增
maxRetries
选项,可在遇到ECONNRESET
网络错误时进行重试。
浏览器版本
- 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.send
在 ApiRequest.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
无障碍访问断言
-
Expect(Locator).ToHaveAccessibleNameAsync() 检查元素是否具有指定的无障碍名称:
var locator = Page.GetByRole(AriaRole.Button);
await Expect(locator).ToHaveAccessibleNameAsync("Submit"); -
Expect(Locator).ToHaveAccessibleDescriptionAsync() 检查元素是否具有指定的无障碍描述:
var locator = Page.GetByRole(AriaRole.Button);
await Expect(locator).ToHaveAccessibleDescriptionAsync("Upload a photo"); -
Expect(Locator).ToHaveRoleAsync() 检查元素是否具有指定的ARIA角色:
var locator = Page.GetByTestId("save-button");
await Expect(locator).ToHaveRoleAsync(AriaRole.Button);
定位器处理器
- 在执行通过Page.AddLocatorHandlerAsync()添加的处理程序后,Playwright现在会等待触发处理程序的覆盖层不再可见。您可以通过新的
NoWaitAfter
选项选择退出此行为。 - 您可以在Page.AddLocatorHandlerAsync()中使用新的
Times
选项来指定处理程序应运行的最大次数。 - Page.AddLocatorHandlerAsync()中的处理程序现在接受定位器作为参数。
- 新增 Page.RemoveLocatorHandlerAsync() 方法,用于移除先前添加的定位器处理程序。
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 inAPIRequestContext.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
- Page.PdfAsync() 新增支持两个选项 Tagged 和 Outline。
公告
- ⚠️ 不再支持Ubuntu 18系统。
浏览器版本
- Chromium 123.0.6312.4
- Mozilla Firefox 123.0
- WebKit 17.4
此版本还针对以下稳定渠道进行了测试:
- Google Chrome 122
- Microsoft Edge 123
版本 1.41
新API
- 新增方法 Page.UnrouteAllAsync() 可移除所有由 Page.RouteAsync() 和 Page.RouteFromHARAsync() 注册的路由。可选择等待正在进行的路由完成,或忽略其中的任何错误。
- 新增方法 BrowserContext.UnrouteAllAsync() 可移除由 BrowserContext.RouteAsync() 和 BrowserContext.RouteFromHARAsync() 注册的所有路由。可选参数允许等待正在进行的路由完成,或忽略这些路由产生的任何错误。
- Page.ScreenshotAsync() 和 Locator.ScreenshotAsync() 中新增 Style 选项,可在截图前向页面添加自定义CSS样式。
浏览器版本
- Chromium 121.0.6167.57
- Mozilla Firefox 121.0
- WebKit 17.4
此版本还针对以下稳定渠道进行了测试:
- Google Chrome 120
- Microsoft Edge 120
版本 1.40
测试生成器更新
生成断言的新工具:
- "断言可见性"工具生成 Expect(Locator).ToBeVisibleAsync()。
- "断言值"工具生成 Expect(Locator).ToHaveValueAsync()。
- "断言文本"工具生成 Expect(Locator).ToContainTextAsync()。
这是一个带有断言的生成测试示例:
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
- 选项 Reason 在 Page.CloseAsync() 中,Reason 在 BrowserContext.CloseAsync() 和 Reason 在 Browser.CloseAsync() 中。关闭原因会报告所有被关闭操作中断的操作。
- 选项 FirefoxUserPrefs 在 BrowserType.LaunchPersistentContextAsync() 中。
其他变更
- 方法 Download.PathAsync() 和 Download.CreateReadStreamAsync() 对于失败和取消的下载会抛出错误。
- Playwright docker image 现在包含 .NET 8(新的长期支持版本)。
浏览器版本
- 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
追踪查看器更新
- 放大时间范围。
- 网络面板重新设计。
新API
弃用项
- 以下方法已被弃用:Page.TypeAsync()、Frame.TypeAsync()、Locator.TypeAsync()和ElementHandle.TypeAsync()。请改用速度更快的Locator.FillAsync()。仅当页面有特殊键盘处理需求且需要逐个按键时,才使用Locator.PressSequentiallyAsync()。
浏览器版本
- 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.04 | Ubuntu 22.04 | Debian 11 | Debian 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
亮点
-
新增 Locator.And() 方法,用于创建同时匹配两个定位器的定位器。
var button = page.GetByRole(AriaRole.BUTTON).And(page.GetByTitle("Subscribe"));
-
新增事件 BrowserContext.Console 和 BrowserContext.Dialog,用于订阅来自给定浏览器上下文中任何页面的对话框和控制台消息。使用新方法 ConsoleMessage.Page 和 Dialog.Page 来精确定位事件来源。
浏览器版本
- 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
- Locator.Or()
- 在Locator.Filter()中新增了HasNot选项
- 在Locator.Filter()中新增选项HasNotText|HasNotTextRegex
- Expect(Locator).ToBeAttachedAsync()
- Route.FetchAsync() 中的新选项 Timeout
⚠️ 重大变更
- 现在
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
- 新增选项 UpdateMode 和 UpdateContent 用于 Page.RouteFromHARAsync() 和 BrowserContext.RouteFromHARAsync()。
- 链式操作现有的定位器对象,详情请参阅locator docs。
- 方法 Tracing.StartChunkAsync() 中的新选项 Name。
浏览器版本
- Chromium 112.0.5615.29
- Mozilla Firefox 111.0
- WebKit 16.4
此版本还针对以下稳定渠道进行了测试:
- Google Chrome 111
- Microsoft Edge 111
版本 1.31
新API
-
New assertion Expect(Locator).ToBeInViewportAsync() ensures that locator points to an element that intersects viewport, according to the intersection observer API.
var locator = Page.GetByRole(AriaRole.Button);
// Make sure at least some part of element intersects viewport.
await Expect(locator).ToBeInViewportAsync();
// Make sure element is fully outside of viewport.
await Expect(locator).Not.ToBeInViewportAsync();
// Make sure that at least half of the element intersects viewport.
await Expect(locator).ToBeInViewportAsync(new() { Ratio = 0.5 }); -
新增方法 BrowserContext.NewCDPSessionAsync() 和 Browser.NewBrowserCDPSessionAsync() 可分别为页面和浏览器创建 Chrome DevTools Protocol 会话。
其他
- 跟踪查看器中的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 工具
- 代码生成中的实时定位器。 使用"探索"工具为页面上的任何元素生成定位器。
新API
浏览器版本
- Chromium 108.0.5359.29
- Mozilla Firefox 106.0
- WebKit 16.4
此版本还针对以下稳定渠道进行了测试:
- Google Chrome 107
- Microsoft Edge 107
版本 1.27
定位器
使用这些新的API编写定位器是一种乐趣:
- Page.GetByText() 通过文本内容定位。
- Page.GetByRole() 通过 ARIA role、ARIA attributes 和 accessible name 进行定位。
- Page.GetByLabel() 通过关联标签的文本来定位表单控件。
- Page.GetByTestId() 根据元素的
data-testid
属性定位元素(可以配置其他属性)。 - Page.GetByPlaceholder() 通过占位符定位输入框。
- Page.GetByAltText() 通过替代文本来定位元素(通常是图像)。
- Page.GetByTitle() 通过元素的标题来定位元素。
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();
所有相同的方法也可在 Locator、FrameLocator 和 Frame 类上使用。
其他亮点
- 正如在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
断言
- 新增选项
Enabled
用于 Expect(Locator).ToBeEnabledAsync()。 - Expect(Locator).ToHaveTextAsync() 现在可以穿透打开的shadow根节点。
- Expect(Locator).ToBeEditableAsync() 新增
Editable
选项。 - Expect(Locator).ToBeVisibleAsync() 新增了
Visible
选项。 - Expect(Response).ToBeOKAsync() 现已可用。
其他亮点
- 新增选项
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.NUnit
和 Microsoft.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优先断言更新
- 新增方法 Expect(Locator).ToHaveValuesAsync() 用于断言
元素的所有选中值。
- 方法 Expect(Locator).ToContainTextAsync() 和 Expect(Locator).ToHaveTextAsync() 现在支持
ignoreCase
选项。
其他
-
如果有一个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
。更多详情请参阅我们的文档。
行为变更
- Playwright 现在支持通过 Locator.SetInputFilesAsync() API 上传大文件(数百MB)。
浏览器版本
- 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"
文本。它会不断重新获取节点并进行检查,直到满足条件或达到超时时间。您可以将此超时时间作为选项传递。
了解更多信息,请参阅我们的文档。
其他更新
- New options for methods Page.ScreenshotAsync(), Locator.ScreenshotAsync() and ElementHandle.ScreenshotAsync():
- 选项
ScreenshotAnimations.Disabled
会将所有CSS动画和过渡重置到一个一致的状态 - 选项
mask: Locator[]
会遮盖给定的元素,用粉色的#FF00FF
方框覆盖它们。
- 选项
- Locator.HighlightAsync() 会以可视化方式高亮显示元素,便于调试。
公告
- 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
定位器改进
-
现在每个定位器都可以选择性地通过其包含的文本来进行过滤:
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优先断言。
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栏
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.
Ubuntu ARM64 支持 + 更多
-
Playwright 现在支持 Ubuntu 20.04 ARM64。您现在可以在 Apple M1 和树莓派上的 Docker 中运行 Playwright 测试。
-
您现在可以使用Playwright在Linux上安装Edge的稳定版本:
pwsh bin/Debug/netX/playwright.ps1 install msedge
新API
版本 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
以前无法获取响应的多个标头值。现在可以实现,并且还提供了额外的辅助函数:
- Request.AllHeadersAsync()
- Request.HeadersArrayAsync()
- Request.HeaderValueAsync()
- Response.AllHeadersAsync()
- Response.HeadersArrayAsync()
- Response.HeaderValueAsync()
- Response.HeaderValuesAsync()
🌈 强制色彩模拟
现在可以通过在Browser.NewContextAsync()中传递或调用Page.EmulateMediaAsync()来模拟forced-colors
CSS媒体特性。
新API
- Page.RouteAsync() 新增接受
times
选项,用于指定该路由应匹配的次数。 - Page.SetCheckedAsync() 和 Locator.SetCheckedAsync() 方法被引入用于设置复选框的选中状态。
- Request.SizesAsync() 返回给定HTTP请求的资源大小信息。
- Tracing.StartChunkAsync() - 开始一个新的追踪块。
- Tracing.StopChunkAsync() - 停止一个新的跟踪块。
重要 ⚠
- ⬆ 我们的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)表示对页面上元素的一个视图。它包含了在任何给定时刻检索元素所需的足够逻辑。
Locator和ElementHandle之间的区别在于,后者指向特定元素,而Locator则封装了如何检索该元素的逻辑。
此外,定位器默认情况下是"严格"的!
var locator = page.Locator("button");
await locator.ClickAsync();
了解更多信息,请参阅文档。
🧩 实验性 React 和 Vue 选择器引擎
React和Vue选择器允许通过组件名称和/或属性值来选择元素。其语法与属性选择器非常相似,并支持所有属性选择器运算符。
await page.Locator("_react=SubmitButton[enabled=true]").ClickAsync();
await page.Locator("_vue=submit-button[enabled=true]").ClickAsync();
了解更多信息,请参阅react选择器文档和vue选择器文档。
✨ 新增 nth
和 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
- 🖖 编程式拖放支持 通过 Page.DragAndDropAsync() API实现。
- 🔎 增强版HAR 包含请求和响应的正文大小。通过Browser.NewContextAsync()中的
recordHar
选项使用。
工具
- Playwright Trace Viewer 现在可以显示参数、返回值以及
console.log()
调用。
全新与全面改进的指南
浏览器版本
- Chromium 93.0.4576.0
- Mozilla Firefox 90.0
- WebKit 14.2
Playwright 新API接口
- 在Browser.NewContextAsync()和Browser.NewPageAsync()中新增
baseURL
选项 - Response.SecurityDetailsAsync() 和 Response.ServerAddrAsync()
- Page.DragAndDropAsync() 和 Frame.DragAndDropAsync()
- Download.CancelAsync()
- Page.InputValueAsync(), Frame.InputValueAsync() 和 ElementHandle.InputValueAsync()
- 新增
force
选项在 Page.FillAsync()、Frame.FillAsync() 和 ElementHandle.FillAsync() 中 - 在 Page.SelectOptionAsync()、Frame.SelectOptionAsync() 和 ElementHandle.SelectOptionAsync() 中新增
force
选项
版本 1.12
亮点
- Playwright for .NET v1.12 现已稳定发布!
- 开箱即用,内置codegen和trace viewer工具
浏览器版本
- Chromium 93.0.4530.0
- Mozilla Firefox 89.0
- WebKit 14.2
此版本的Playwright还针对以下稳定渠道进行了测试:
- Google Chrome 91
- Microsoft Edge 91