跳转到主要内容

版本说明

版本 1.59

🎬 截屏录制 (Screencast)

新的 Page.Screencast API 提供了一个统一的接口,用于捕获页面内容,包含

  • 截屏录制
  • 操作标注
  • 视觉覆盖层
  • 实时帧捕获
  • 智能代理视频凭证 (Agentic video receipts)
Demo

截屏录制 — 支持精确的开始/停止控制来录制视频,作为 RecordVideoDir 选项的替代方案

await page.Screencast.StartAsync(new() { Path = "video.webm" });
// ... perform actions ...
await page.Screencast.StopAsync();

操作标注 — 启用内置的视觉标注,在录制过程中高亮显示交互元素并显示操作标题

await page.Screencast.ShowActionsAsync(new() { Position = "top-right" });

ShowActionsAsync 现在接受 Position"top-left""top""top-right""bottom-left""bottom""bottom-right")、Duration(每个标注的毫秒数)和 FontSize(像素)。返回一个可释放对象以停止显示操作。

视觉覆盖层 — 在页面顶部添加章节标题和自定义 HTML 覆盖层,以实现更丰富的旁白

await page.Screencast.ShowChapterAsync("Adding TODOs", new() {
Description = "Type and press enter for each TODO",
Duration = 1000,
});

await page.Screencast.ShowOverlayAsync("<div style=\"color: red\">Recording</div>");

实时帧捕获 — 流式传输 JPEG 编码的帧,用于缩略图、实时预览、AI 视觉处理等自定义处理

await page.Screencast.StartAsync(new() {
OnFrame = frame => SendToVisionModel(frame.Data),
});

智能代理视频凭证 — 编码代理可以生成其工作的视频证据。完成任务后,代理可以录制带有丰富标注的演练视频,供人工评审

await page.Screencast.StartAsync(new() { Path = "receipt.webm" });
await page.Screencast.ShowActionsAsync(new() { Position = "top-right" });

await page.Screencast.ShowChapterAsync("Verifying checkout flow", new() {
Description = "Added coupon code support per ticket #1234",
});

// Agent performs the verification steps...
await page.Locator("#coupon").FillAsync("SAVE20");
await page.Locator("#apply-coupon").ClickAsync();
await Expect(page.Locator(".discount")).ToContainTextAsync("20%");

await page.Screencast.ShowChapterAsync("Done", new() {
Description = "Coupon applied, discount reflected in total",
});

await page.Screencast.StopAsync();

生成的视频可作为凭证:章节标题提供上下文,操作标注高亮显示每次交互,且视觉演练比文本日志更易于查看。

🔍 快照与定位器

新 API

截屏录制

存储、控制台和错误

杂项

🔗 互操作性

新的 Browser.BindAsync() API,使启动的浏览器可供 playwright-cli@playwright/mcp 及其他客户端连接。

绑定浏览器 — 启动并绑定浏览器,以便他人可以连接

var serverInfo = await browser.BindAsync("my-session", new() {
WorkspaceDir = "/my/project",
});

从 playwright-cli 连接 — 从您喜爱的编码代理连接到正在运行的浏览器。

playwright-cli attach my-session
playwright-cli -s my-session snapshot

从 @playwright/mcp 连接 — 或者将您的 MCP 服务器指向正在运行的浏览器。

@playwright/mcp --endpoint=my-session

从 Playwright 客户端连接 — 使用 API 连接到浏览器。支持同时连接多个客户端!

var browser = await chromium.ConnectAsync(serverInfo.Endpoint);

传入 HostPort 选项,可通过 WebSocket 而非命名管道进行绑定

var serverInfo = await browser.BindAsync("my-session", new() {
Host = "localhost",
Port = 0,
});
// serverInfo.Endpoint is a ws:// URL

调用 Browser.UnbindAsync() 停止接受新连接。

📊 可观测性

运行 playwright-cli show 以打开仪表板,它会列出所有已绑定的浏览器及其状态,并允许与它们进行交互

  • 查看您的代理在后台浏览器上正在执行的操作
  • 点击进入会话以进行人工干预
  • 打开 DevTools 以检查来自后台浏览器的页面。
Demo
  • playwright-cli 会自动绑定其所有浏览器,以便您观察代理的动态。
  • 传递 PLAYWRIGHT_DASHBOARD=1 环境变量,即可在仪表板中查看所有 @playwright/test 浏览器。

重大变更 ⚠️

  • 移除了 WebKit 对 macOS 14 的支持。建议升级您的 macOS 版本,或保留旧版本的 Playwright。

浏览器版本

  • Chromium 147.0.7727.15
  • Mozilla Firefox 148.0.2
  • WebKit 26.4

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

  • Google Chrome 146
  • Microsoft Edge 146

版本 1.58

UI 模式和 Trace Viewer 改进

  • 新的“系统”主题选项,跟随操作系统的深色/浅色模式偏好
  • 代码编辑器现已支持搜索功能 (Cmd/Ctrl+F)
  • 网络详情面板已重新整理,以提高易用性
  • JSON 响应现在会自动格式化以便于阅读

感谢 @cpAdm 贡献这些改进!

杂项

BrowserType.ConnectOverCDPAsync() 现在接受 IsLocal 选项。设置为 true 时,会告知 Playwright 它与 CDP 服务器运行在同一主机上,从而启用文件系统优化。

重大变更 ⚠️

  • 移除了 _react_vue 选择器。请参阅 定位器指南 获取替代方案。
  • 移除了 :light 选择器引擎后缀。请改用标准 CSS 选择器。
  • 移除了 BrowserType.LaunchAsync() 中的 Devtools 选项。请改用 Args = new[] { "--auto-open-devtools-for-tabs" }
  • 移除了 WebKit 对 macOS 13 的支持。建议升级您的 macOS 版本,或继续使用旧版本的 Playwright。

浏览器版本

  • Chromium 145.0.7632.6
  • Mozilla Firefox 146.0.1
  • WebKit 26.0

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

  • Google Chrome 144
  • Microsoft Edge 144

版本 1.57

Chrome for Testing

Playwright 现在运行在 Chrome for Testing 构建版本上,而非 Chromium。有头模式使用 chrome;无头模式使用 chrome-headless-shell。升级到 v1.57 后,现有测试应能继续通过。

我们预计这次切换不会带来功能性变化。最大的变化是工具栏中新的图标和标题。

new and old logo

如果你仍然看到意外的行为变化,请提交一个 issue

在 Arm64 Linux 上,Playwright 继续使用 Chromium。

破坏性变更

在弃用 3 年后,我们从 API 中移除了 Page.Accessibility。如果您需要测试页面可访问性,请使用其他库(例如 Axe)。有关与 Axe 集成的详细信息,请参阅我们的 Node.js 指南

新 API

浏览器版本

  • Chromium 143.0.7499.4
  • Mozilla Firefox 144.0.2
  • WebKit 26.0

版本 1.56

新 API

重大变更

杂项

  • Aria 快照会渲染并比较 inputplaceholder

浏览器版本

  • Chromium 141.0.7390.37
  • Mozilla Firefox 142.0.1
  • WebKit 26.0

版本 1.55

Codegen

  • 自动 ToBeVisibleAsync() 断言:Codegen 现在可以针对常见的 UI 交互自动生成 ToBeVisibleAsync() 断言。此功能可以在 Codegen 设置界面中启用。

重大变更

  • ⚠️ 停止支持 Chromium 扩展程序清单 v2。

杂项

浏览器版本

  • Chromium 140.0.7339.16
  • Mozilla Firefox 141.0
  • WebKit 26.0

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

  • Google Chrome 139
  • Microsoft Edge 139

版本 1.54

亮点

  • BrowserContext.CookiesAsync()BrowserContext.AddCookiesAsync() 中增加了新的 Cookie 属性 PartitionKey。此属性允许保存和恢复分区 Cookie。有关更多信息,请参阅 CHIPS MDN 文章。请注意,不同浏览器对 Cookie 分区的支持和默认设置有所不同。

  • 多条命令中新增选项 `user-data-dir`。您可以指定相同的用户数据目录来在会话之间重用浏览状态,例如身份验证。

    pwsh bin/Debug/netX/playwright.ps1 codegen --user-data-dir=./user-data
  • pwsh bin/Debug/netX/playwright.ps1 open 不再打开测试录制器。请改用 pwsh bin/Debug/netX/playwright.ps1 codegen

浏览器版本

  • Chromium 139.0.7258.5
  • Mozilla Firefox 140.0.2
  • WebKit 26.0

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

  • Google Chrome 140
  • Microsoft Edge 140

版本 1.53

跟踪查看器和 HTML 报告器更新

  • Trace Viewer 中的新步骤

    New Trace Viewer Steps
  • 新增 Locator.Describe() 方法用于描述定位器,供跟踪查看器使用。

    var button = Page.GetByTestId("btn-sub").Describe("Subscribe button");
    await button.ClickAsync();
  • pwsh bin/Debug/netX/playwright.ps1 install --list 现在将列出所有已安装的浏览器、版本和位置。

浏览器版本

  • Chromium 138.0.7204.4
  • Mozilla Firefox 139.0
  • WebKit 18.5

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

  • Google Chrome 137
  • Microsoft Edge 137

版本 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""
    ");

杂项

破坏性变更

  • 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

亮点

  • BrowserContext.StorageStateAsync() 的新选项 IndexedDB 允许保存和恢复 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"
    });
  • Locator.Filter() 的新选项 Visible 允许仅匹配可见元素。

    // 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);
  • Page.EmulateMediaAsync()Browser.NewContextAsync() 的新选项 Contrast,允许模拟 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 的支持

杂项

UI 更新

  • Codegen 中新增按钮,用于选择元素以生成 aria 快照。
  • 现在在跟踪中,除了操作 API 调用外,还显示附加详细信息(例如按下的键)。
  • 在跟踪中显示 `canvas` 内容容易出错。现在默认禁用显示,可通过 `Display canvas content` UI 设置启用。
  • “调用”和“网络”面板现在显示额外的计时信息。

重大变更

浏览器版本

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

破坏性变更:chromemsedge 渠道切换到新的无头模式

如果您在 `playwright.config.ts` 中使用以下通道之一,此更改会影响您

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

更新到 Playwright v1.49 后,运行你的测试套件。如果它仍然通过,那么一切就绪。如果失败,你可能需要更新快照,并调整一些围绕 PDF 查看器和扩展的测试代码。有关 Chromium 无头模式的更多详细信息,请参阅问题 #33566

尝试新的 Chromium 无头模式

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

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

有关你可能遇到的潜在中断列表和 Chromium 无头模式的更多详细信息,请参阅问题 #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 不再有更新。我们建议您将操作系统更新到更高版本。
  • 快照中的 `` 元素现在会绘制预览。

浏览器版本

  • 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" 来模拟 WebSocket 通信的简单示例。

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

更多详细信息请参阅 WebSocketRoute

UI 更新

  • 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 筛选
  • 更好地显示查询字符串参数
  • 字体资产预览
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 标签不再发布。请锁定到特定版本以获得更好的稳定性和可重现性。
  • TLS 客户端证书现在可以通过将 ClientCertificates.CertClientCertificates.Key 作为字节数组而非文件路径来从内存传递。
  • NoWaitAfterLocator.SelectOptionAsync() 中已被弃用。
  • 我们发现 GitHub Actions `macos-13` 上 WebGL 在 Webkit 中表现异常的报告。我们建议将 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("https://: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");

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

杂项 (Miscellaneous)

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

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

新的定位器处理程序

新增 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.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

其他变更

浏览器版本

  • Chromium 120.0.6099.28
  • Mozilla Firefox 119.0
  • WebKit 17.4

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

  • Google Chrome 119
  • Microsoft Edge 119

版本 1.39

Evergreen 浏览器更新。

浏览器版本

  • 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 现在支持 Debian 12 Bookworm 上的 x86_64 和 arm64 的 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 # 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

亮点

浏览器版本

  • 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();
  • 使用新的 web 断言 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 => {
    // 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() 现在可以通过值或标签进行匹配

    <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 中的实时定位器。** 使用“探索”工具为页面上的任何元素生成定位器。
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

断言

其他亮点

  • 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 值仅等待目标框架触发 'DOMContentLoaded' 事件。使用 WaitUntil: WaitUntilState.Load 等待所有 iframes。

浏览器版本

  • 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 测试,让您可以直接从 .NET 向服务器发送请求!现在您可以

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

要代表 Playwright 的页面执行请求,请使用 新的 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-First 断言更新

杂项

  • 如果有一个服务工作线程妨碍了您,您现在可以使用新的上下文选项 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。在 我们的文档 中阅读更多内容。

行为变更

浏览器版本

  • Chromium 101.0.4951.26
  • Mozilla Firefox 98.0.2
  • WebKit 15.4

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

  • Google Chrome 100
  • Microsoft Edge 100

版本 1.20

Web-First 断言

Playwright for .NET 1.20 引入了 Web-First 断言

请看以下示例

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 locators) - 指向页面上 iframe 的定位器。框架定位器捕获检索 iframe 所需的逻辑,然后在该 iframe 中定位元素。框架定位器默认是严格的,会等待 iframe 出现,并可用于 Web-First 断言。

Graphics

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

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

我们的文档 中阅读更多内容。

Trace Viewer 更新

Playwright Trace Viewer 现在**在线可用**于 https://trace.playwright.dev!只需将您的 trace.zip 文件拖放即可检查其内容。

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

  • Playwright Test 跟踪现在默认包含源(可以通过跟踪选项关闭)
  • Trace Viewer 现在显示测试名称
  • 新的跟踪元数据选项卡,包含浏览器详细信息
  • 快照现在有 URL 栏
image

HTML 报告更新

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

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

  • 跟踪现在支持 'title' 选项
  • 页面导航支持新的 'commit' 等待选项

版本 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 运行跟踪查看器,并将跟踪文件拖放到跟踪查看器 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(),您现在可以垂直或水平滚动。

📜 新的 Headers API

以前无法获取响应的多个 header 值。现在这成为可能,并且提供了额外的辅助函数

🌈 强制颜色模拟

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

新 API

重要 ⚠

  • ⬆ .NET Core Apps 2.1 不再受我们的 CLI 工具支持。截至 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) 之间的区别在于,后者指向特定元素,而 定位器 捕获检索该元素的逻辑。

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

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() 调用。

新的和 overhauled 指南

浏览器版本

  • 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