docs(release-notes): add 1.23 release notes for .NET (#15295)
This commit is contained in:
parent
64e6688e84
commit
1e28870af7
|
|
@ -5,6 +5,124 @@ title: "Release notes"
|
||||||
|
|
||||||
<!-- TOC -->
|
<!-- TOC -->
|
||||||
|
|
||||||
|
## Version 1.23
|
||||||
|
|
||||||
|
### API Testing
|
||||||
|
|
||||||
|
Playwright for .NET 1.23 introduces new [API Testing](./api/class-apirequestcontext) 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 [`property: Page.request`] API**:
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
// 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](./api-testing).
|
||||||
|
|
||||||
|
### 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:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pwsh bin\Debug\netX\playwright.ps1 open --save-har=example.har --save-har-glob="**/api/**" https://example.com
|
||||||
|
```
|
||||||
|
|
||||||
|
Alternatively, you can record HAR programmatically:
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
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 [`method: Page.routeFromHAR`] or [`method: BrowserContext.routeFromHAR`] to serve matching responses from the [HAR](http://www.softwareishard.com/blog/har-12-spec/) file:
|
||||||
|
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
await context.RouteFromHARAsync("example.har");
|
||||||
|
```
|
||||||
|
|
||||||
|
Read more in [our documentation](./network#record-and-replay-requests).
|
||||||
|
|
||||||
|
|
||||||
|
### Advanced Routing
|
||||||
|
|
||||||
|
You can now use [`method: Route.fallback`] to defer routing to other handlers.
|
||||||
|
|
||||||
|
Consider the following example:
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
// 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 [`method: Page.routeFromHAR`] and [`method: BrowserContext.routeFromHAR`] also participate in routing and could be deferred to.
|
||||||
|
|
||||||
|
### Web-First Assertions Update
|
||||||
|
|
||||||
|
* New method [`method: LocatorAssertions.toHaveValues`] that asserts all selected values of `<select multiple>` element.
|
||||||
|
* Methods [`method: LocatorAssertions.toContainText`] and [`method: LocatorAssertions.toHaveText`] now accept `ignoreCase` 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`:
|
||||||
|
```csharp
|
||||||
|
var context = await Browser.NewContextAsync(new()
|
||||||
|
{
|
||||||
|
ServiceWorkers = ServiceWorkerPolicy.Block
|
||||||
|
});
|
||||||
|
```
|
||||||
|
* Using `.zip` path for `recordHar` context option automatically zips the resulting HAR:
|
||||||
|
```csharp
|
||||||
|
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:
|
||||||
|
```csharp
|
||||||
|
var context = await Browser.NewContextAsync(new() { RecordHarPath = "example.har", RecordHarMode = HarMode.Minimal });
|
||||||
|
```
|
||||||
|
* Playwright now runs on Ubuntu 22 amd64 and Ubuntu 22 arm64. We also publish new docker image `mcr.microsoft.com/playwright/dotnet:v1.24.0-jammy`.
|
||||||
|
* Playwright for .NET now supports **linux-arm64** and provides a **arm64 Ubuntu 20.04 Docker image** for it.
|
||||||
|
|
||||||
## Version 1.22
|
## Version 1.22
|
||||||
|
|
||||||
### Highlights
|
### Highlights
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue