發行說明
版本 1.47
Network 頁籤改進
追蹤檢視器中的 Network 分頁有幾個不錯的改進:
- 按資產類型和 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
。- 現 在可以通過將
cert
和key
作為位元組陣列傳遞來從記憶體中傳遞 TLS 客戶端證書,而不是文件路徑。 - Locator.SelectOptionAsync() 中的
noWaitAfter
已被棄用。 - 我們已經看到 Webkit 中的 WebGL 在 GitHub Actions
macos-13
上表現異常。我們建議將 GitHub Actions 升級到macos-14
。
瀏覽器版本
- Chromium 129.0.6668.29
- Mozilla Firefox 130.0
- WebKit 18.0
此版本也針對以下穩定頻道進行了測試:
- Google Chrome 128
- Microsoft Edge 128
版本 1.46
TLS Client Certificates
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()。
- 請求方法和狀態顯示在網路詳細資訊標籤中。
- 新按鈕可將源文件位置複製到剪貼簿。
- Metadata 窗格現在顯示
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
。// 按下常見的鍵盤快捷鍵 Control+S 或 Meta+S 來觸發 "Save" 操作。
await page.Keyboard.PressAsync("ControlOrMeta+S"); -
新屬性
httpCredentials.send
在 ApiRequest.NewContextAsync() 中允許選擇總是發送Authorization
標頭或僅在回應401 Unauthorized
時發送。 -
Playwright 現在支援 Ubuntu 24.04 上的 Chromium、Firefox 和 WebKit。
-
v1.45 是最後一個為 macOS 12 Monterey 接收 WebKit 更新的版本。請更新 macOS 以繼續使用最新的 WebKit。
瀏覽器版本
- Chromium 127.0.6533.5
- Mozilla Firefox 127.0
- WebKit 17.4
此版本也針對以下穩定頻道進行了測試:
- Google Chrome 126
- Microsoft Edge 126
版本 1.44
新的 API
無障礙聲明
-
Expect(Locator).ToHaveAccessibleNameAsync() 檢查元素是否具有指定的可存取名稱:
var locator = Page.GetByRole(AriaRole.Button);
await Expect(locator).ToHaveAccessibleNameAsync("Submit"); -
Expect(Locator).ToHaveAccessibleDescriptionAsync() 檢查元素是否具有指定的可存取描述:
var locator = Page.GetByRole(AriaRole.Button);
await Expect(locator).ToHaveAccessibleDescriptionAsync("Upload a photo"); -
Expect(Locator).ToHaveRoleAsync() 檢查元素是否具有指定的 ARIA 角色:
var locator = Page.GetByTestId("save-button");
await Expect(locator).ToHaveRoleAsync(AriaRole.Button);
定位器處理程式
- 在執行使用 Page.AddLocatorHandlerAsync() 新增的處理程序後,Playwright 現在會等待觸發處理程序的覆蓋層不再可見。您可以使用新的
NoWaitAfter
選項選擇退出此行為。 - 您可以在 Page.AddLocatorHandlerAsync() 中使用新的
Times
選項來指定處理程序應執行的最大次數。 - Page.AddLocatorHandlerAsync() 中的處理程序現在接受定位器作為參數。
- 新增的 Page.RemoveLocatorHandlerAsync() 方法可用於移除先前新增的定位器處理程序。
var locator = Page.GetByText("This interstitial covers the button");
await Page.AddLocatorHandlerAsync(locator, async (overlay) =>
{
await overlay.Locator("#close").ClickAsync();
}, new() { Times = 3, NoWaitAfter = true });
// Run your tests that can be interrupted by the overlay.
// ...
await Page.RemoveLocatorHandlerAsync(locator);
其他選項
-
新方法 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() 現在支援過濾器來移除部分 cookies。
// 清除所有 cookies。
await Context.ClearCookiesAsync();
// 新增: 清除特定名稱的 cookies。
await Context.ClearCookiesAsync(new() { Name = "session-id" });
// 新增: 清除特定域名的 cookies。
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() 註冊的路由。可選擇等待正在進行的路由完成,或忽略它們的任何錯誤。
- 新選項
style
在 Page.ScreenshotAsync() 和 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.dev/");
await Page.GetByRole(AriaRole.Link, new() { Name = "Get started" }).ClickAsync();
await Expect(Page.GetByLabel("Breadcrumbs").GetByRole(AriaRole.List)).ToContainTextAsync("Installation");
await Expect(Page.GetByLabel("Search")).ToBeVisibleAsync();
await Page.GetByLabel("Search").ClickAsync();
await Page.GetByPlaceholder("Search docs").FillAsync("locator");
await Expect(Page.GetByPlaceholder("Search docs")).ToHaveValueAsync("locator");
新的 API
- 選項
reason
在 Page.CloseAsync(), BrowserContext.CloseAsync() 和 Browser.CloseAsync()。關閉原因會報告所有因關閉而中斷的操作。 - 選項
firefoxUserPrefs
在 BrowserType.LaunchPersistentContextAsync()。
其他變更
- 方法 Download.PathAsync() 和 Download.CreateReadStreamAsync() 會在下載失敗和取消時拋出錯誤。
- Playwright docker image 現在附帶 .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 現在支援 Debian 12 Bookworm(x86_64 和 arm64)上的 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 # 移除此安裝所安裝的瀏覽器
$ pwsh bin/Debug/netX/playwright.ps1 uninstall --all # 移除所有曾經安裝的 Playwright 瀏覽器
瀏覽器版本
- Chromium 115.0.5790.13
- Mozilla Firefox 113.0
- WebKit 16.4
此版本也針對以下穩定頻道進行了測試:
- Google Chrome 114
- Microsoft Edge 114
版本 1.34
重點
-
新的 Locator.And() 建立一個同時匹配兩個定位器的定位器。
var button = page.GetByRole(AriaRole.BUTTON).And(page.GetByTitle("Subscribe"));
-
新的事件 BrowserContext.Console 和 BrowserContext.Dialog 訂閱來自給定瀏覽器上下文中的任何頁面的任何對話框和控制台訊息。使用新方法 ConsoleMessage.Page 和 Dialog.Page 精確定位事件來源。
瀏覽器版本
- Chromium 114.0.5735.26
- Mozilla Firefox 113.0
- WebKit 16.4
此版本也針對以下穩定頻道進行了測試:
- Google Chrome 113
- Microsoft Edge 113
版本 1.33
定位器更新
-
使用 Locator.Or() 建立一個匹配任意兩個定位器的定位器。考慮一個情境,你想點擊“New email”按鈕,但有時會彈出安全設定對話框。在這種情況下,你可以等待“New email”按鈕或對話框,並相應地行動:
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
來找到不匹配某些條件的元素。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()
- 新選項
hasNot
在 Locator.Filter() - 新選項
hasNotText
在 Locator.Filter() - Expect(Locator).ToBeAttachedAsync()
- 新選項
timeout
在 Route.FetchAsync()
⚠️ 重大變更
mcr.microsoft.com/playwright/dotnet:v1.33.0
現在提供基於 Ubuntu Jammy 的 Playwright 映像。要使用基於 focal 的映像,請改用mcr.microsoft.com/playwright/dotnet:v1.33.0-focal
。
瀏覽器版本
- Chromium 113.0.5672.53
- Mozilla Firefox 112.0
- WebKit 16.4
此版本也針對以下穩定頻道進行了測試:
- Google Chrome 112
- Microsoft Edge 112
版本 1.32
新的 API
- 新選項
updateMode
和updateContent
在 Page.RouteFromHARAsync() 和 BrowserContext.RouteFromHARAsync()。 - 鏈接現有的定位器物件,詳情請參見 定位器文件。
- 新選項
name
在方法 Tracing.StartChunkAsync()。
瀏覽器版本
- 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);
// 確保元素的至少一部分與視窗相交。
await Expect(locator).ToBeInViewportAsync();
// 確保元素完全在視窗外。
await Expect(locator).Not.ToBeInViewportAsync();
// 確保元素至少有一半與視窗相交。
await Expect(locator).ToBeInViewportAsync(new() { Ratio = 0.5 }); -
新的方法 BrowserContext.NewCDPSessionAsync() 和 Browser.NewBrowserCDPSessionAsync() 分別為頁面和瀏覽器建立一個 Chrome DevTools Protocol 會話。
雜項
- 現在可以在單獨的視窗中打開追蹤檢視器中的 DOM 快照。
- 新選項
Route.fetch.maxRedirects
用於 Route.FetchAsync() 方法。 - Playwright 現在支援 Debian 11 arm64。
- 官方 docker images 現在包含 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 => {
// 獲取原始設定。
var response = await route.FetchAsync();
// 強制設定主題為預定值。
var json = await response.JsonAsync<MyDataType>();
json.Theme = "Solarized";
// 使用修改後的資料完成。
await route.FulfillAsync(new() {
Json = json
});
}); -
新方法 Locator.AllAsync() 用於遍歷所有匹配的元素:
// 檢查所有的複選框!
var checkboxes = Page.GetByRole(AriaRole.Checkbox);
foreach (var checkbox in await checkboxes.AllAsync())
await checkbox.CheckAsync(); -
Locator.SelectOptionAsync() 現在可以通過值或標籤匹配:
<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 工具
- 程式碼產生器中的即時定位器。 使用 "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 role、ARIA attributes 和 accessible name 定位。
- Page.GetByLabel() 根據關聯標籤的文字定位表單控制項。
- Page.GetByTestId() 根據
data-testid
屬性(其他屬性可配置)定位元素。 - Page.GetByPlaceholder() 根據佔位符定位輸入框。
- Page.GetByAltText() 根據替代文字定位元素,通常是圖片。
- Page.GetByTitle() 根據標題定位元素。
await page.GetByLabel("User Name").FillAsync("John");
await page.GetByLabel("Password").FillAsync("secret-password");
await page.GetByRole(AriaRole.Button, new() { NameString = "Sign in" }).ClickAsync();
await Expect(Page.GetByText("Welcome, John!")).ToBeVisibleAsync();
所有相同的方法也可在 Locator、FrameLocator 和 Frame 類別上使用。
其他亮點
- 如 v1.25 中所宣布,Ubuntu 18 將於 2022 年 12 月起不再支援。此外,從下一個 Playwright 版本開始,Ubuntu 18 將不再有 WebKit 更新。
行為變更
-
Expect(Locator).ToHaveAttributeAsync() 與空值不再匹配缺失的屬性。例如,當
button
沒有disabled
屬性時,以下程式碼片段將會成功。await Expect(Page.GetByRole(AriaRole.Button)).ToHaveAttribute("disabled", "");
瀏覽器版本
- Chromium 107.0.5304.18
- Mozilla Firefox 105.0.1
- WebKit 16.0
此版本也針對以下穩定頻道進行了測試:
- Google Chrome 106
- Microsoft Edge 106
版本 1.26
斷言
- 新選項
Enabled
用於 Expect(Locator).ToBeEnabledAsync()。 - Expect(Locator).ToHaveTextAsync() 現在可以穿透開放的 shadow roots。
- 新選項
Editable
用於 Expect(Locator).ToBeEditableAsync()。 - 新選項
Visible
用於 Expect(Locator).ToBeVisibleAsync()。 - Expect(Response).ToBeOKAsync() 現在可用。
其他亮點
- 新選項
MaxRedirects
用於 ApiRequestContext.GetAsync() 和其他用來限制重定向次數的函式。 - 程式碼產生器現在支援 MSTest 和 NUnit 框架。
- 現在支援 ASP .NET。
行為變更
一堆 Playwright API 已經支援 WaitUntil: WaitUntilState.DOMContentLoaded
選項。例如:
await Page.GotoAsync("https://playwright.dev", new() { WaitUntil = WaitUntilState.DOMContentLoaded });
在 1.26 之前,這會等待所有 iframes 觸發 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 現在支援 Debian 11 Bullseye 在 x86_64 上的 Chromium、Firefox 和 WebKit。如果 您遇到任何問題,請告訴我們!
Linux 支援看起來像這樣:
| | Ubuntu 20.04 | Ubuntu 22.04 | Debian 11 | :--- | :---: | :---: | :---: | :---: | | Chromium | ✅ | ✅ | ✅ | | WebKit | ✅ | ✅ | ✅ | | Firefox | ✅ | ✅ | ✅ |
新介紹文件
我們重寫了我們的設定指南文件,使其更專注於端到端測試。請在 playwright.dev 查看。
版本 1.23
API 測試
Playwright for .NET 1.23 準備推出新的 API Testing,讓你可以直接從 .NET 發送請求到伺服器!現在你可以:
- 測試你的伺服器 API
- 在測試中訪問 web 應用程式之前準備伺服器端狀態
- 在瀏覽器中執行一些操作後驗證伺服器端後置條件
要代表 Playwright 的 Page 進行請求,使用 new 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 Assertions Update
- 新方法 Expect(Locator).ToHaveValuesAsync() 可斷言
<select multiple>
元素的所有選定值。 - 方法 Expect(Locator).ToContainTextAsync() 和 Expect(Locator).ToHaveTextAsync() 現在接受
ignoreCase
選項。
雜項
-
如果有一個 service worker 擋住了你的路,現在可以使用新的 context 選項
serviceWorkers
輕鬆停用它:var context = await Browser.NewContextAsync(new()
{
ServiceWorkers = ServiceWorkerPolicy.Block
}); -
使用
.zip
路徑作為recordHar
context 選項會自動壓縮生成的 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 image。
版本 1.22
重點
-
允許通過其 ARIA role、ARIA attributes 和 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 role、ARIA attributes 和 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 現在支援大型檔案上傳 (數百 MB) 透過 Locator.SetInputFilesAsync() API。
瀏覽器版本
- Chromium 101.0.4951.26
- Mozilla Firefox 98.0.2
- WebKit 15.4
此版本也針對以下穩定頻道進行了測試:
- Google Chrome 100
- Microsoft Edge 100
版本 1.20
Web-First Assertions
Playwright for .NET 1.20 準備推出 Web-First Assertions。
考慮以下範例:
using System.Threading.Tasks;
using Microsoft.Playwright.NUnit;
using NUnit.Framework;
namespace PlaywrightTests;
[TestFixture]
public class ExampleTests : PageTest
{
[Test]
public async Task StatusBecomesSubmitted()
{
await Expect(Page.Locator(".status")).ToHaveTextAsync("Submitted");
}
}
Playwright 將會重新測試具有選擇器 .status
的節點,直到獲取的節點具有 "Submitted"
文本。它將會重新獲取節點並一遍又一遍地檢查,直到滿足條件或達到超時。你可以將這個超時作為選項傳遞。
閱讀更多在 我們的文件。
其他更新
- 新的選項用於方法 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
選項,以確保其內包含另一個 locator:await Page.Locator("article", new() { Has = Page.Locator(".highlight") }).ClickAsync();
閱讀更多在 locator 文件。
-
新的 Locator.Page
-
Page.ScreenshotAsync() 和 Locator.ScreenshotAsync() 現在自動隱藏閃爍的插入點
-
Playwright Codegen 現在生成 locators 和 frame locators
瀏覽器版本
- Chromium 100.0.4863.0
- Mozilla Firefox 96.0.1
- WebKit 15.4
此版本也針對以下穩定頻道進行了測試:
- Google Chrome 98
- Microsoft Edge 98
版本 1.18
定位器改進
-
每個定位器現在可以選擇性地根據其包含的文本進行過濾:
await Page.Locator("li", new() { HasTextString = "My Item" })
.Locator("button").click();閱讀更多在 定位器文件。
新的 API 和變更
AcceptDownloads
選項現在預設為true
。Sources
選項將來源嵌入追蹤中。
瀏覽器版本
- Chromium 99.0.4812.0
- Mozilla Firefox 95.0
- WebKit 15.4
此版本也針對以下穩定頻道進行了測試:
- Google Chrome 97
- Microsoft Edge 97
版本 1.17
Frame 定位器
Playwright 1.17 準備推出 frame locators - 一個頁面上 iframe 的定位器。Frame locators 捕捉足以獲取 iframe
的邏輯,然後在該 iframe 中定位元素。Frame locators 預設是嚴格的,會等待 iframe
出現,並且可以用於 Web-First 斷言。
框架定位器可以使用 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.playwright.dev 是一個 progressive web application,在本地處理追蹤。
- Playwright Test 追蹤現在預設包含來源(這些可以用追蹤選項關閉)
- 追蹤檢視器現在顯示測試名稱
- 新的追蹤 Metadata 頁籤包含瀏覽器詳細資訊
- 快照現在有 URL 欄
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 函式庫
定位器.WaitForAsync
等待定位器解析為具有給定狀態的單個元素。預設為 state: 'visible'
。
var orderSent = page.Locator("#order-sent");
orderSent.WaitForAsync();
閱讀更多關於 Locator.WaitForAsync()。
🎭 Playwright Trace Viewer
- 使用
pwsh bin/Debug/netX/playwright.ps1 show-trace
執行 trace viewer 並將 trace 檔案拖放到 trace viewer PWA - 更好的動作目標視覺歸因
閱讀更多關於 Trace Viewer 的資訊。
瀏覽器版本
- Chromium 97.0.4666.0
- Mozilla Firefox 93.0
- WebKit 15.4
此版本的 Playwright 也針對以下穩定頻道進行了測試:
- Google Chrome 94
- Microsoft Edge 94