發行說明
版本 1.49
Aria 快照
新的斷言 Expect(Locator).ToMatchAriaSnapshotAsync() 透過與預期的可存取性樹狀結構(以 YAML 表示)比較來驗證頁面結構。
await page.GotoAsync("https://playwright.dev.org.tw");
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.dev.org.tw/");
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 應用程式測試或瀏覽器擴充功能測試。
請參閱 issue #33566 以取得您可能遇到的可能中斷清單,以及關於 Chromium 無頭模式的更多詳細資訊。如果您在選擇加入後看到任何問題,請提交 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 作為位元組陣列而不是檔案路徑傳遞。
- Locator.SelectOptionAsync() 中的 NoWaitAfter 已被棄用。
- 我們已看到關於 WebKit 在 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("https://127.0.0.1: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"); -
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
可存取性斷言
-
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);
雜項選項
-
新方法 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
- 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() 中的新選項 Style 和 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.org.tw/");
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
- Page.CloseAsync() 中的選項 Reason、BrowserContext.CloseAsync() 中的 Reason 和 Browser.CloseAsync() 中的 Reason。關閉原因會針對所有因關閉而中斷的操作進行報告。
- BrowserType.LaunchPersistentContextAsync() 中的選項 FirefoxUserPrefs。
其他變更
- 方法 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
Evergreen 瀏覽器更新。
瀏覽器版本
- 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
重點
-
方法 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
重點
-
用於建立同時符合兩個定位器的定位器的新 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-first 斷言 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 與視窗viewport相交的元素。
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() 現在依值或標籤比對
<select multiple>
<option value="red">Red</div>
<option value="green">Green</div>
<option value="blue">Blue</div>
</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 中的即時定位器。 使用「探索」工具為頁面上的任何元素產生定位器。
新 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() 可依佔位符定位輸入。
- 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
斷言 (Assertions)
- 為 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.dev.org.tw", new() { WaitUntil = WaitUntilState.DOMContentLoaded });
在 1.26 之前,這會等待所有 iframe 觸發 DOMContentLoaded
事件。
為了與網路規範對齊,WaitUntilState.DOMContentLoaded
值僅等待目標框架觸發 '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 上支援 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 測試指南中閱讀更多相關資訊。
網路重播 (Network Replay)
現在您可以將網路流量記錄到 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");
請在我們的文件中閱讀更多相關資訊。
進階路由 (Advanced Routing)
您現在可以使用 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 斷言更新
- 新的方法 Expect(Locator).ToHaveValuesAsync(),用於斷言
<select multiple>
元素的所有選定值。 - 方法 Expect(Locator).ToContainTextAsync() 和 Expect(Locator).ToHaveTextAsync() 現在接受
ignoreCase
選項。
其他 (Miscellaneous)
-
如果服務工作人員 (service worker) 阻礙了您,您現在可以使用新的內容選項
serviceWorkers
輕鬆停用它var context = await Browser.NewContextAsync(new()
{
ServiceWorkers = ServiceWorkerPolicy.Block
}); -
對
recordHar
內容選項使用.zip
路徑會自動壓縮產生的 HARvar 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,用於篩選現有的 locator
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-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"
文字。它將會重複重新擷取節點並進行檢查,直到符合條件或達到逾時時間。您可以將此逾時時間作為選項傳遞。
請在我們的文件中閱讀更多相關資訊。
其他更新
- 方法 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
重點
-
Locator 現在支援
has
選項,以確保它在內部包含另一個 locatorawait Page.Locator("article", new() { Has = Page.Locator(".highlight") }).ClickAsync();
請在locator 文件中閱讀更多相關資訊
-
新的 Locator.Page
-
Page.ScreenshotAsync() 和 Locator.ScreenshotAsync() 現在會自動隱藏閃爍的插入符號
-
Playwright Codegen 現在會產生 locator 和框架 locator
瀏覽器版本
- Chromium 100.0.4863.0
- Mozilla Firefox 96.0.1
- WebKit 15.4
此版本也針對下列穩定通道進行了測試
- Google Chrome 98
- Microsoft Edge 98
版本 1.18
Locator 改善
-
現在可以選擇性地依據每個 locator 包含的文字進行篩選
await Page.Locator("li", new() { HasTextString = "My Item" })
.Locator("button").click();請在locator 文件中閱讀更多相關資訊
新的 API 和變更
AcceptDownloads
選項現在預設為true
。Sources
選項可將來源嵌入追蹤中。
瀏覽器版本
- Chromium 99.0.4812.0
- Mozilla Firefox 95.0
- WebKit 15.4
此版本也針對下列穩定通道進行了測試
- Google Chrome 97
- Microsoft Edge 97
版本 1.17
框架 Locator (Frame Locators)
Playwright 1.17 引入了框架 locator - 頁面上 iframe 的 locator。框架 locator 擷取了足以檢索 iframe
,然後在該 iframe 中定位元素的邏輯。框架 locator 預設為嚴格模式,將等待 iframe
出現,並且可以用於 Web-First 斷言。
可以使用 Page.FrameLocator() 或 Locator.FrameLocator() 方法建立框架 locator。
var locator = page.FrameLocator("#my-frame").Locator("text=Submit");
await locator.ClickAsync();
請在我們的文件中閱讀更多相關資訊。
追蹤檢視器更新 (Trace Viewer Update)
Playwright 追蹤檢視器現在線上可用,網址為 https://trace.playwright.dev!只需拖放您的 trace.zip
檔案即可檢查其內容。
注意:追蹤檔案不會上傳到任何地方;trace.playwright.dev 是一個 漸進式 Web 應用程式,可在本機處理追蹤。
- Playwright 測試追蹤現在預設包含來源 (可以使用追蹤選項關閉這些來源)
- 追蹤檢視器現在顯示測試名稱
- 新的追蹤中繼資料標籤,包含瀏覽器詳細資訊
- 快照現在具有 URL 列
HTML 報告更新 (HTML Report Update)
- 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
等待 locator 解析為具有給定狀態的單一元素。預設為 state: 'visible'
。
var orderSent = page.Locator("#order-sent");
orderSent.WaitForAsync();
請在Locator.WaitForAsync() 中閱讀更多相關資訊。
🎭 Playwright 追蹤檢視器
- 使用
pwsh bin/Debug/netX/playwright.ps1 show-trace
執行追蹤檢視器,並將追蹤檔案拖放到追蹤檢視器 PWA - 更佳的動作目標視覺歸屬
請在追蹤檢視器中閱讀更多相關資訊。
瀏覽器版本
- Chromium 97.0.4666.0
- Mozilla Firefox 93.0
- WebKit 15.4
此版本的 Playwright 也針對以下穩定通道進行了測試
- Google Chrome 94
- Microsoft Edge 94
版本 1.15
🖱️ 滑鼠滾輪
透過使用 Mouse.WheelAsync(),您現在可以垂直或水平滾動。
📜 新的標頭 API
先前無法取得回應的多個標頭值。現在可以了,並且提供額外的輔助函式
- Request.AllHeadersAsync()
- Request.HeadersArrayAsync()
- Request.HeaderValueAsync()
- Response.AllHeadersAsync()
- Response.HeadersArrayAsync()
- Response.HeaderValueAsync()
- Response.HeaderValuesAsync()
🌈 強制色彩模擬 (Forced-Colors emulation)
現在可以透過在 Browser.NewContextAsync() 中傳遞或呼叫 Page.EmulateMediaAsync() 來模擬 forced-colors
CSS 媒體功能。
新的 API
- Page.RouteAsync() 接受新的
times
選項,以指定應比對此路由的次數。 - 引入 Page.SetCheckedAsync() 和 Locator.SetCheckedAsync() 來設定核取方塊的核取狀態。
- Request.SizesAsync() 傳回給定 http 請求的資源大小資訊。
- Tracing.StartChunkAsync() - 啟動新的追蹤區塊。
- Tracing.StopChunkAsync() - 停止新的追蹤區塊。
重要 ⚠
- ⬆ .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 });
📍 新的 Locator API
Locator 代表頁面上元素 (或多個元素) 的檢視。它擷取了足以在任何給定時刻檢索元素的邏輯。
Locator 和 ElementHandle 之間的差異在於,後者指向特定元素,而 Locator 擷取了如何檢索該元素的邏輯。
此外,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 追蹤檢視器現在顯示參數、傳回值和
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
重點
瀏覽器版本
- Chromium 93.0.4530.0
- Mozilla Firefox 89.0
- WebKit 14.2
此版本的 Playwright 也針對以下穩定通道進行了測試
- Google Chrome 91
- Microsoft Edge 91