发行说明
版本 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.net.cn""
");
杂项
- 新选项 MaxRedirects 在 ApiRequest.NewContextAsync() 中,用于控制最大重定向次数。
- 新选项 Ref 在 Locator.AriaSnapshotAsync() 中,为快照中的每个元素生成引用,这些引用稍后可用于定位元素。
- HTML 报告器现在支持通过
!@my-tag
或!my-file.spec.ts
或!p:my-project
进行非过滤。
重大变更
- Page.Frame() 不再支持 Base URL 匹配。我们建议迁移到 Page.FrameLocator(),以获得更便捷的 API。
- Page.RouteAsync() 等方法中的 Glob 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
重点
-
新选项 IndexedDB 在 BrowserContext.StorageStateAsync() 中,允许保存和恢复 IndexedDB 内容。这在您的应用程序使用 IndexedDB API 来存储身份令牌(例如 Firebase Authentication)时非常有用。
以下是遵循身份验证指南的示例
// 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"
}); -
新选项 Visible 在 Locator.Filter() 中,允许仅匹配可见元素。
// Ignore invisible todo items.
var todoItems = Page.GetByTestId("todo-item").Filter(new() { Visible = true });
// Check there are exactly 3 visible ones.
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() 用于断言 Locator 指向具有给定 aria errormessage 的元素。
UI 更新
- Codegen 中新增了一个用于选取元素以生成 aria 快照的按钮。
- 现在,在跟踪中,与 action API 调用一起显示更多详细信息(例如按下的键)。
- 在跟踪中显示
canvas
内容容易出错。现在默认禁用此显示,可通过Display canvas content
UI 设置启用。 Call
和Network
面板现在显示更多时间信息。
重大变更
- Expect(Locator).ToBeEditableAsync() 和 Locator.IsEditableAsync() 现在会在目标元素不是
<input>
、<select>
或其他一些可编辑元素时抛出错误。
浏览器版本
- 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.net.cn");
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() 允许您在跟踪查看器中直观地对操作进行分组。
// 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.net.cn/");
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 文档所述
另一方面,新无头模式是真正的 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 连接。下面是一个简单的示例,它通过对 "request"
响应 "response"
来模拟 WebSocket 通信。
await page.RouteWebSocketAsync("/ws", ws => {
ws.OnMessage(frame => {
if (frame.Text == "request")
ws.Send("response");
});
});
更多详细信息请参见 WebSocketRoute。
UI 更新
- HTML 报告中新增了用于复制注释和测试位置的“复制”按钮。
- 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
标签不再发布。请固定到特定版本以获得更好的稳定性和可重现性。 - TLS 客户端证书现在可以通过将 ClientCertificates.Cert 和 ClientCertificates.Key 作为字节数组而不是文件路径来从内存中传递。
- NoWaitAfter 在 Locator.SelectOptionAsync() 中已弃用。
- 我们收到了关于 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
。
杂项
- 新选项
maxRetries
在 ApiRequestContext.FetchAsync() 中,当遇到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() 现在支持为
<input type=file webkitdirectory>
元素上传目录。await page.GetByLabel("Upload directory").SetInputFilesAsync("mydir");
-
Locator.ClickAsync() 或 Locator.PressAsync() 等多个方法现在支持
ControlOrMeta
修饰键。此键在 macOS 上映射到Meta
,在 Windows 和 Linux 上映射到Control
。// Press the common keyboard shortcut Control+S or Meta+S to trigger a "Save" operation.
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() 检查元素是否具有指定的 accessible name
var locator = Page.GetByRole(AriaRole.Button);
await Expect(locator).ToHaveAccessibleNameAsync("Submit"); -
Expect(Locator).ToHaveAccessibleDescriptionAsync() 检查元素是否具有指定的 accessible description
var locator = Page.GetByRole(AriaRole.Button);
await Expect(locator).ToHaveAccessibleDescriptionAsync("Upload a photo"); -
Expect(Locator).ToHaveRoleAsync() 检查元素是否具有指定的 ARIA role
var locator = Page.GetByTestId("save-button");
await Expect(locator).ToHaveRoleAsync(AriaRole.Button);
Locator 处理器
- 执行通过 Page.AddLocatorHandlerAsync() 添加的处理器后,Playwright 现在将等待触发该处理器的覆盖层不再可见。您可以通过新的
NoWaitAfter
选项选择退出此行为。 - 您可以使用 Page.AddLocatorHandlerAsync() 中的新
Times
选项来指定处理器应运行的最大次数。 - Page.AddLocatorHandlerAsync() 中的处理器现在接受 locator 作为参数。
- 新方法 Page.RemoveLocatorHandlerAsync() 用于移除先前添加的 locator 处理器。
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 });
浏览器版本
- 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。
// Clear all cookies.
await Context.ClearCookiesAsync();
// New: clear cookies with a particular name.
await Context.ClearCookiesAsync(new() { Name = "session-id" });
// New: clear cookies for a particular domain.
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
新 Locator 处理器
新方法 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() 注册的所有路由。可选地允许等待正在进行的路由完成,或忽略它们的任何错误。
- 新选项 Style 在 Page.ScreenshotAsync() 中,以及 Style 在 Locator.ScreenshotAsync() 中,用于在截图前向页面添加自定义 CSS。
浏览器版本
- Chromium 121.0.6167.57
- Mozilla Firefox 121.0
- WebKit 17.4
此版本也针对以下稳定通道进行了测试
- Google Chrome 120
- Microsoft Edge 120
版本 1.40
测试生成器更新
生成断言的新工具
- “Assert visibility” 工具生成 Expect(Locator).ToBeVisibleAsync()。
- “Assert value” 工具生成 Expect(Locator).ToHaveValueAsync()。
- “Assert text” 工具生成 Expect(Locator).ToContainTextAsync()。
以下是一个包含断言的生成测试示例
await Page.GotoAsync("https://playwright.net.cn/");
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 镜像 现在随附了 .NET 8 (新的 LTS)。
浏览器版本
- 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
CLI 命令用于卸载浏览器二进制文件$ pwsh bin/Debug/netX/playwright.ps1 uninstall # remove browsers installed by this installation
$ pwsh bin/Debug/netX/playwright.ps1 uninstall --all # remove all ever-install Playwright browsers
浏览器版本
- 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
定位符更新
-
使用 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() 中使用新选项 HasNot 和 HasNotText|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(); -
使用新的 Web优先断言 Expect(Locator).ToBeAttachedAsync() 来确保元素存在于页面的 DOM 中。不要与 Expect(Locator).ToBeVisibleAsync() 混淆,后者确保元素既已附加又可见。
新增 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
- 在 Page.RouteFromHARAsync() 和 BrowserContext.RouteFromHARAsync() 中新增选项 UpdateMode 和 UpdateContent。
- 链接现有的定位符对象,详情请参阅定位符文档。
- 在方法 Tracing.StartChunkAsync() 中新增选项 Name。
浏览器版本
- Chromium 112.0.5615.29
- Mozilla Firefox 111.0
- WebKit 16.4
此版本也针对以下稳定通道进行了测试
- Google Chrome 111
- Microsoft Edge 111
版本 1.31
新增 API
-
新增断言 Expect(Locator).ToBeInViewportAsync() 确保定位符指向与视口相交的元素,依据 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
-
新增方法 Route.FetchAsync() 以及 Route.FulfillAsync() 的新选项
Json
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() 用于遍历所有匹配的元素
// Check all checkboxes!
var checkboxes = Page.GetByRole(AriaRole.Checkbox);
foreach (var checkbox in await checkboxes.AllAsync())
await checkbox.CheckAsync(); -
Locator.SelectOptionAsync() 现在通过 value 或 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 工具
- CodeGen 中的实时定位符。 使用“Explore”工具为页面上的任何元素生成定位符。
新增 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 角色、ARIA 属性和 可访问名称定位。
- Page.GetByLabel():按关联标签的文本定位表单控件。
- Page.GetByTestId():根据元素的
data-testid
属性定位(其他属性可配置)。 - Page.GetByPlaceholder():按 placeholder 定位输入框。
- Page.GetByAltText():按文本替代项定位元素,通常用于图片。
- Page.GetByTitle():按 title 定位元素。
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
断言
- Expect(Locator).ToBeEnabledAsync() 的新选项
Enabled
。 - Expect(Locator).ToHaveTextAsync() 现在可以穿透开放的 shadow roots。
- Expect(Locator).ToBeEditableAsync() 的新选项
Editable
。 - Expect(Locator).ToBeVisibleAsync() 的新选项
Visible
。 - Expect(Response).ToBeOKAsync() 现在可用。
其他亮点
- ApiRequestContext.GetAsync() 和其他方法的新选项
MaxRedirects
用于限制重定向次数。 - Codegen 现在支持 MSTest 和 NUnit 框架。
- 现在支持 ASP .NET。
行为变更
许多 Playwright API 已支持 WaitUntil: WaitUntilState.DOMContentLoaded
选项。例如:
await Page.GotoAsync("https://playwright.net.cn", new() { WaitUntil = WaitUntilState.DOMContentLoaded });
在 1.26 版本之前,这会等待所有 iframe 触发 DOMContentLoaded
事件。
为了与 Web 规范对齐,WaitUntilState.DOMContentLoaded
值只等待目标 frame 触发 'DOMContentLoaded'
事件。使用 WaitUntil: WaitUntilState.Load
来等待所有 iframe。
浏览器版本
- 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 上运行 Chromium、Firefox 和 WebKit 的 Debian 11 Bullseye。如果您遇到任何问题,请告知我们!
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
// 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(),用于断言
<select multiple>
元素的所有选中值。 - 方法 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 属性和 可访问名称选择元素。
// Click a button with accessible name "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 属性和 可访问名称选择元素。
// Click a button with accessible name "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优先断言。
考虑以下示例:
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"
。它将不断重新获取节点并检查,直到满足条件或达到超时。你可以将此超时作为选项传递。
在我们的文档中了解更多。
其他更新
- Page.ScreenshotAsync()、Locator.ScreenshotAsync() 和 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
亮点
-
定位符现在支持
has
选项,确保其内部包含另一个定位符。await Page.Locator("article", new() { Has = Page.Locator(".highlight") }).ClickAsync();
在定位符文档中了解更多。
-
新增 Locator.Page
-
Page.ScreenshotAsync() 和 Locator.ScreenshotAsync() 现在会自动隐藏闪烁的插入符。
-
Playwright Codegen 现在生成定位符和 frame 定位符。
浏览器版本
- 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
选项用于将源代码嵌入到 traces 中。
浏览器版本
- Chromium 99.0.4812.0
- Mozilla Firefox 95.0
- WebKit 15.4
此版本也针对以下稳定通道进行了测试
- Google Chrome 97
- Microsoft Edge 97
版本 1.17
Frame 定位符
Playwright 1.17 引入了 frame 定位符 - 用于定位页面上 iframe 的定位符。Frame 定位符捕获了足以检索 iframe
并随后在该 iframe 中定位元素的逻辑。Frame 定位符默认为严格模式,会等待 iframe
出现,并可在 Web优先断言中使用。
Frame 定位符可以通过 Page.FrameLocator() 或 Locator.FrameLocator() 方法创建。
var locator = page.FrameLocator("#my-frame").Locator("text=Submit");
await locator.ClickAsync();
在我们的文档中了解更多。
跟踪查看器更新
Playwright 跟踪查看器现在在线可用,地址是 https://trace.playwright.dev!只需将 trace.zip
文件拖放到跟踪查看器 PWA 中即可检查其内容。
注意:trace 文件不会上传到任何地方;trace.playwright.dev 是一个渐进式 Web 应用程序 (Progressive Web Application),它在本地处理 trace。
- Playwright Test trace 现在默认包含源代码(可以通过 tracing 选项关闭)。
- 跟踪查看器现在显示测试名称。
- 新增 trace 元数据选项卡,包含浏览器详细信息。
- 快照现在带有 URL 地址栏。
HTML 报告更新
- HTML 报告现在支持动态过滤。
- 报告现在是一个单一静态 HTML 文件,可以通过电子邮件或作为 Slack 附件发送。
支持 Ubuntu ARM64 及更多
-
Playwright 现在支持 Ubuntu 20.04 ARM64。现在可以在 Apple M1 和 Raspberry Pi 的 Docker 中运行 Playwright 测试。
-
现在可以使用 Playwright 在 Linux 上安装稳定版本的 Edge。
pwsh bin/Debug/netX/playwright.ps1 install msedge
新增 API
版本 1.16
🎭 Playwright 库
Locator.WaitForAsync
等待定位符解析为具有给定状态的单个元素。默认为 state: 'visible'
。
var orderSent = page.Locator("#order-sent");
orderSent.WaitForAsync();
了解更多关于 Locator.WaitForAsync() 的信息。
🎭 Playwright 跟踪查看器
- 使用
pwsh bin/Debug/netX/playwright.ps1 show-trace
运行跟踪查看器,并将 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
以前无法获取响应的多个 header 值。现在这已成为可能,并且提供了额外的辅助函数。
- 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
⚡️ 新的“严格”模式
选择器歧义是自动化测试中的常见问题。“严格”模式确保您的选择器指向单个元素,否则会抛出错误。
在您的操作调用中设置 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()
- 在 Page.FillAsync()、Frame.FillAsync() 和 ElementHandle.FillAsync() 中新增了
force
选项 - 在 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