Highlights
API Testing
Playwright for .NET 1.23 introduces new API Testing that lets you send requests to the server directly from .NET!
Now you can:
- test your server API
- prepare server side state before visiting the web application in a test
- validate server side post-conditions after running some actions in the browser
To do a request on behalf of Playwright's Page, use 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());
Read more about it in our API testing guide.
Network Replay
Now you can record network traffic into a HAR file and re-use this traffic in your tests.
To record network into HAR file:
pwsh bin\Debug\netX\playwright.ps1 open --save-har=example.har --save-har-glob="**/api/**" https://example.com
Alternatively, you can record HAR programmatically:
var context = await browser.NewContextAsync(new ()
{
RecordHarPath = harPath,
RecordHarUrlFilterString = "**/api/**",
});
// ... Perform actions ...
// Close context to ensure HAR is saved to disk.
context.CloseAsync();
Use the new methods Page.RouteFromHARAsync
or BrowserContext.RouteFromHARAsync
to serve matching responses from the HAR file:
await context.RouteFromHARAsync("example.har");
Read more in our documentation.
Advanced Routing
You can now use Route.FallbackAsync
to defer routing to other handlers.
Consider the following example:
// 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();
}
});
Note that the new methods Page.RouteFromHARAsync
and BrowserContext.RouteFromHARAsync
also participate in routing and could be deferred to.
Web-First Assertions Update
- New method
LocatorAssertions.ToHaveValuesAsync
that asserts all selected values of<select multiple>
element. - Methods
LocatorAssertions.ToContainTextAsync
andLocatorAssertions.ToHaveTextAsync
now acceptIgnoreCase
option.
Miscellaneous
- If there's a service worker that's in your way, you can now easily disable it with a new context option
ServiceWorkers
:var context = await Browser.NewContextAsync(new() { ServiceWorkers = ServiceWorkerPolicy.Block });
- Using
.zip
path forrecordHar
context option automatically zips the resulting HAR:var context = await Browser.NewContextAsync(new() { RecordHarPath = "example.har.zip" });
- If you intend to edit HAR by hand, consider using the
"minimal"
HAR recording mode
that only records information that is essential for replaying:var context = await Browser.NewContextAsync(new() { RecordHarPath = "example.har", RecordHarMode = HarMode.Minimal });
- Playwright now runs on Ubuntu 22 amd64 and Ubuntu 22 arm64.
- Playwright for .NET now supports linux-arm64 and provides a arm64 Ubuntu 20.04 Docker image for it.