Releases: microsoft/playwright-dotnet
v1.48.0
WebSocket routing
New methods Page.RouteWebSocketAsync() and BrowserContext.RouteWebSocketAsync() allow to intercept, modify and mock WebSocket connections initiated in the page. Below is a simple example that mocks WebSocket communication by responding to a "request"
with a "response"
.
await page.RouteWebSocketAsync("/ws", ws => {
ws.OnMessage(message => {
if (message.Text == "request")
ws.Send("response");
});
});
See WebSocketRoute for more details.
UI updates
- New "copy" buttons for annotations and test location in the HTML report.
- Route method calls like Foute.FulfillAsync() are not shown in the report and trace viewer anymore. You can see which network requests were routed in the network tab instead.
- New "Copy as cURL" and "Copy as fetch" buttons for requests in the network tab.
Miscellaneous
- New method Page.RequestGCAsync() may help detect memory leaks.
- Requests made by APIRequestContext now record detailed timing and security information in the HAR.
Browser Versions
- Chromium 130.0.6723.19
- Mozilla Firefox 130.0
- WebKit 18.0
This version was also tested against the following stable channels:
- Google Chrome 129
- Microsoft Edge 129
v1.47.0
Network Tab improvements
The Network tab in the trace viewer has several nice improvements:
- filtering by asset type and URL
- better display of query string parameters
- preview of font assets
Miscellaneous
- The
mcr.microsoft.com/playwright/dotnet:v1.47.0
now serves a Playwright image based on Ubuntu 24.04 Noble.
To use the 22.04 jammy-based image, please usemcr.microsoft.com/playwright/dotnet:v1.47.0-jammy
instead. - The
:latest
/:focal
/:jammy
tag for Playwright Docker images is no longer being published. Pin to a specific version for better stability and reproducibility. - TLS client certificates can now be passed from memory by passing
cert
andkey
as byte arrays instead of file paths. NoWaitAfter
in locator.selectOption() was deprecated.- We've seen reports of WebGL in Webkit misbehaving on GitHub Actions
macos-13
. We recommend upgrading GitHub Actions tomacos-14
.
Browser Versions
- Chromium 129.0.6668.29
- Mozilla Firefox 130.0
- WebKit 18.0
This version was also tested against the following stable channels:
- Google Chrome 128
- Microsoft Edge 128
v1.46.0
TLS Client Certificates
Playwright now allows to supply client-side certificates, so that server can verify them, as specified by TLS Client Authentication.
You can provide client certificates as a parameter of browser.NewContextAsync() and APIRequest.NewContextAsync(). The following snippet sets up a client certificate for 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",
}
]
});
When using the MSTest or NUnit base-classes, these can be added by using the ContextOptions method.
Trace Viewer Updates
- Content of text attachments is now rendered inline in the attachments pane.
- New setting to show/hide routing actions like route.ContinueAsync().
- Request method and status are shown in the network details tab.
- New button to copy source file location to clipboard.
- Metadata pane now displays the
BaseURL
.
Miscellaneous
- New
MaxRetries
option in apiRequestContext.FetchAsync() which retries on theECONNRESET
network error.
Browser Versions
- Chromium 128.0.6613.18
- Mozilla Firefox 128.0
- WebKit 18.0
This version was also tested against the following stable channels:
- Google Chrome 127
- Microsoft Edge 127
v1.45.1
Highlights
microsoft/playwright-java#1617 - [Bug]: Trace Viewer not reporting all actions
microsoft/playwright#31764 - [Bug]: some actions do not appear in the trace file
Browser Versions
- Chromium 127.0.6533.5
- Mozilla Firefox 127.0
- WebKit 17.4
This version was also tested against the following stable channels:
- Google Chrome 126
- Microsoft Edge 126
v1.45.0
Clock
Utilizing the new Clock API allows to manipulate and control time within tests to verify time-related behavior. This API covers many common scenarios, including:
- testing with predefined time;
- keeping consistent time and timers;
- monitoring inactivity;
- ticking through time manually.
// 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");
See the clock guide for more details.
Miscellaneous
- Method locator.setInputFiles() now supports uploading a directory for
<input type=file webkitdirectory>
elements.await page.GetByLabel("Upload directory").SetInputFilesAsync("mydir");
- Multiple methods like locator.click() or locator.press() now support a
ControlOrMeta
modifier key. This key maps toMeta
on macOS and maps toControl
on Windows and Linux.// Press the common keyboard shortcut Control+S or Meta+S to trigger a "Save" operation. await page.Keyboard.PressAsync("ControlOrMeta+S");
- New property
httpCredentials.send
in apiRequest.newContext() that allows to either always send theAuthorization
header or only send it in response to401 Unauthorized
. - Playwright now supports Chromium, Firefox and WebKit on Ubuntu 24.04.
- v1.45 is the last release to receive WebKit update for macOS 12 Monterey. Please update macOS to keep using the latest WebKit.
Browser Versions
- Chromium 127.0.6533.5
- Mozilla Firefox 127.0
- WebKit 17.4
This version was also tested against the following stable channels:
- Google Chrome 126
- Microsoft Edge 126
v1.44.0
New APIs
Accessibility assertions
-
Expect(locator).ToHaveAccessibleNameAsync() checks if the element has the specified accessible name:
var locator = Page.GetByRole(AriaRole.Button); await Expect(locator).ToHaveAccessibleNameAsync("Submit");
-
Expect(locator).ToHaveAccessibleDescriptionAsync() checks if the element has the specified accessible description:
var locator = Page.GetByRole(AriaRole.Button); await Expect(locator).ToHaveAccessibleDescriptionAsync("Upload a photo");
-
Expect(locator).ToHaveRoleAsync() checks if the element has the specified ARIA role:
var locator = Page.GetByTestId("save-button"); await Expect(locator).ToHaveRoleAsync(AriaRole.Button);
Locator handler
- After executing the handler added with page.AddLocatorHandlerAsync(), Playwright will now wait until the overlay that triggered the handler is not visible anymore. You can opt-out of this behavior with the new
NoWaitAfter
option. - You can use new
Times
option in page.AddLocatorHandlerAsync() to specify maximum number of times the handler should be run. - The handler in page.AddLocatorHandlerAsync() now accepts the locator as argument.
- New page.RemoveLocatorHandlerAsync() method for removing previously added locator handlers.
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);
Miscellaneous options
-
Multipart
option inAPIRequestContext.FetchAsync()
supports now repeating fields with the same name using formData.append():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() now supports
IgnoreCase
option.
Browser Versions
- Chromium 125.0.6422.14
- Mozilla Firefox 125.0.1
- WebKit 17.4
This version was also tested against the following stable channels:
- Google Chrome 124
- Microsoft Edge 124
v1.43.0
New APIs
-
Method BrowserContext.ClearCookiesAsync() now supports filters to remove only some cookies.
// 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" });
-
New property Locator.ContentFrame converts a Locator object to a FrameLocator. This can be useful when you have a Locator object obtained somewhere, and later on would like to interact with the content inside the frame.
var locator = Page.Locator("iframe[name='embedded']"); // ... var frameLocator = locator.ContentFrame; await frameLocator.GetByRole(AriaRole.Button).ClickAsync();
-
New property FrameLocator.Owner converts a FrameLocator object to a Locator. This can be useful when you have a FrameLocator object obtained somewhere, and later on would like to interact with the
iframe
element.var frameLocator = page.FrameLocator("iframe[name='embedded']"); // ... var locator = frameLocator.Owner; await Expect(locator).ToBeVisibleAsync();
Browser Versions
- Chromium 124.0.6367.8
- Mozilla Firefox 124.0
- WebKit 17.4
This version was also tested against the following stable channels:
- Google Chrome 123
- Microsoft Edge 123
v1.42.0
New Locator Handler
New method page.addLocatorHandler(locator, handler, handler, handler) registers a callback that will be invoked when specified element becomes visible and may block Playwright actions. The callback can get rid of the overlay. Here is an example that closes a cookie dialog when it appears.
// 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();
New APIs
- page.pdf([options]) accepts two new options
tagged
andoutline
.
Announcements
⚠️ Ubuntu 18 is not supported anymore.
Browser Versions
- Chromium 123.0.6312.4
- Mozilla Firefox 123.0
- WebKit 17.4
This version was also tested against the following stable channels:
- Google Chrome 122
- Microsoft Edge 123
v1.41.2
Highlights
microsoft/playwright#29067 - [REGRESSION] Codegen/Recorder: not all clicks are being actioned nor recorded
microsoft/playwright#29019 - [REGRESSION] trace.playwright.dev does not currently support the loading from URL
Browser Versions
- Chromium 121.0.6167.57
- Mozilla Firefox 121.0
- WebKit 17.4
This version was also tested against the following stable channels:
- Google Chrome 120
- Microsoft Edge 120
v1.41.1
Highlights
- [REGRESSION] - ChromiumSandbox protocol mismatch (#2794 (comment))
- [REGRESSION] - Build with non-trailing slash output directory (#2827)
- [REGRESSION] - QuerySelectorAll on .NET 6 (#2830)
Browser Versions
- Chromium 121.0.6167.57
- Mozilla Firefox 121.0
- WebKit 17.4
This version was also tested against the following stable channels:
- Google Chrome 120
- Microsoft Edge 120