github microsoft/playwright-dotnet v1.23.0

latest releases: v1.44.0, v1.43.0, v1.42.0...
22 months ago

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

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 for recordHar 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.

Don't miss a new playwright-dotnet release

NewReleases is sending notifications on new releases.