From 1e2046e11e93469e191775c9d8e4c249f9c61399 Mon Sep 17 00:00:00 2001 From: "microsoft-playwright-automation[bot]" <203992400+microsoft-playwright-automation[bot]@users.noreply.github.com> Date: Tue, 31 Mar 2026 22:31:05 +0000 Subject: [PATCH] feat(roll): roll to ToT Playwright (31-03-26) --- dotnet/docs/api/class-browser.mdx | 51 ++++++++++++ dotnet/docs/api/class-screencast.mdx | 46 +++++++++++ dotnet/docs/release-notes.mdx | 82 +++++++++++++++---- images/release-notes-1.59-dashboard.png | Bin 0 -> 93009 bytes java/docs/api/class-browser.mdx | 52 ++++++++++++ java/docs/api/class-screencast.mdx | 47 +++++++++++ java/docs/release-notes.mdx | 76 ++++++++++++++--- nodejs/docs/api/class-androiddevice.mdx | 2 +- nodejs/docs/api/class-browser.mdx | 59 +++++++++++++- nodejs/docs/api/class-browsertype.mdx | 2 +- nodejs/docs/api/class-electron.mdx | 2 +- nodejs/docs/api/class-screencast.mdx | 47 +++++++++++ nodejs/docs/api/class-testoptions.mdx | 6 +- nodejs/docs/release-notes.mdx | 103 ++++++++++++++++++++---- nodejs/docs/videos.mdx | 8 +- python/docs/api/class-browser.mdx | 51 ++++++++++++ python/docs/api/class-screencast.mdx | 46 +++++++++++ python/docs/release-notes.mdx | 82 +++++++++++++++---- 18 files changed, 696 insertions(+), 66 deletions(-) create mode 100644 images/release-notes-1.59-dashboard.png diff --git a/dotnet/docs/api/class-browser.mdx b/dotnet/docs/api/class-browser.mdx index c510bda33c..1950342de2 100644 --- a/dotnet/docs/api/class-browser.mdx +++ b/dotnet/docs/api/class-browser.mdx @@ -25,6 +25,40 @@ await browser.CloseAsync(); ## Methods +### BindAsync {#browser-bind} + +Added in: v1.59browser.BindAsync + +Binds the browser to a named pipe or web socket, making it available for other clients to connect to. + +**Usage** + +```csharp +await Browser.BindAsync(title, options); +``` + +**Arguments** +- `title` [string]# + + Title of the browser server, used for identification. +- `options` `BrowserBindOptions?` *(optional)* + - `Host` [string]? *(optional)*# + + Host to bind the web socket server to. When specified, a web socket server is created instead of a named pipe. + - `Port` [int]? *(optional)*# + + Port to bind the web socket server to. When specified, a web socket server is created instead of a named pipe. Use `0` to let the OS pick an available port. + - `WorkspaceDir` [string]? *(optional)*# + + Working directory associated with this browser server. + +**Returns** +- Bind# + - `endpoint` [string] + + +--- + ### BrowserType {#browser-browser-type} Added in: v1.23browser.BrowserType @@ -587,6 +621,23 @@ await Browser.NewPageAsync(options); --- +### UnbindAsync {#browser-unbind} + +Added in: v1.59browser.UnbindAsync + +Unbinds the browser server previously bound with [Browser.BindAsync()](/api/class-browser.mdx#browser-bind). + +**Usage** + +```csharp +await Browser.UnbindAsync(); +``` + +**Returns** +- [void]# + +--- + ### Version {#browser-version} Added before v1.9browser.Version diff --git a/dotnet/docs/api/class-screencast.mdx b/dotnet/docs/api/class-screencast.mdx index 0c36ef6a18..cf9bdbaa1d 100644 --- a/dotnet/docs/api/class-screencast.mdx +++ b/dotnet/docs/api/class-screencast.mdx @@ -14,6 +14,23 @@ Interface for capturing screencast frames from a page. ## Methods +### HideActionsAsync {#screencast-hide-actions} + +Added in: v1.59screencast.HideActionsAsync + +Removes action decorations. + +**Usage** + +```csharp +await Screencast.HideActionsAsync(); +``` + +**Returns** +- [void]# + +--- + ### HideOverlaysAsync {#screencast-hide-overlays} Added in: v1.59screencast.HideOverlaysAsync @@ -31,6 +48,35 @@ await Screencast.HideOverlaysAsync(); --- +### ShowActionsAsync {#screencast-show-actions} + +Added in: v1.59screencast.ShowActionsAsync + +Enables visual annotations on interacted elements. Returns a disposable that stops showing actions when disposed. + +**Usage** + +```csharp +await Screencast.ShowActionsAsync(options); +``` + +**Arguments** +- `options` `ScreencastShowActionsOptions?` *(optional)* + - `Duration` [float]? *(optional)*# + + How long each annotation is displayed in milliseconds. Defaults to `500`. + - `FontSize` [int]? *(optional)*# + + Font size of the action title in pixels. Defaults to `24`. + - `Position` `enum AnnotatePosition { TopLeft, Top, TopRight, BottomLeft, Bottom, BottomRight }?` *(optional)*# + + Position of the action title overlay. Defaults to `"top-right"`. + +**Returns** +- [Disposable]# + +--- + ### ShowChapterAsync {#screencast-show-chapter} Added in: v1.59screencast.ShowChapterAsync diff --git a/dotnet/docs/release-notes.mdx b/dotnet/docs/release-notes.mdx index 1976eae20e..5f2c7092d2 100644 --- a/dotnet/docs/release-notes.mdx +++ b/dotnet/docs/release-notes.mdx @@ -13,11 +13,15 @@ import LiteYouTube from '@site/src/components/LiteYouTube'; ### 🎬 Screencast -New [Page.Screencast](/api/class-page.mdx#page-screencast) API provides a unified interface for capturing page content — both as video recordings and as real-time frame streams. +New [Page.Screencast](/api/class-page.mdx#page-screencast) API provides a unified interface for capturing page content — both as video recordings, annotations, overlays, and a real-time frame stream. + +
Demo -**Video recording** — record video with precise start/stop control, as an alternative to the [RecordVideoDir](/api/class-browser.mdx#browser-new-context-option-record-video-dir) option: +
+ +**Screencast recording** — record video with precise start/stop control, as an alternative to the [RecordVideoDir](/api/class-browser.mdx#browser-new-context-option-record-video-dir) option: ```csharp await page.Screencast.StartAsync(new() { Path = "video.webm" }); @@ -36,13 +40,10 @@ await page.Screencast.StartAsync(new() { **Action annotations** — enable built-in visual annotations that highlight interacted elements and display action titles during recording: ```csharp -await page.Screencast.StartAsync(new() { - Path = "video.webm", - Annotate = new() { Position = "top-right" }, -}); +await page.Screencast.ShowActionsAsync(new() { Position = "top-right" }); ``` -The `Annotate` option accepts `Position` (`"top-left"`, `"top"`, `"top-right"`, `"bottom-left"`, `"bottom"`, `"bottom-right"`), `Duration` (ms per annotation), and `FontSize` (px). +`ShowActionsAsync` accepts `Position` (`"top-left"`, `"top"`, `"top-right"`, `"bottom-left"`, `"bottom"`, `"bottom-right"`), `Duration` (ms per annotation), and `FontSize` (px). Returns a disposable to stop showing actions. **Visual overlays** — add chapter titles and custom HTML overlays on top of the page for richer narration: @@ -58,10 +59,8 @@ await page.Screencast.ShowOverlayAsync("
Recording
+ +Demo + + +- `playwright-cli` binds all of its browsers automatically, so you can see what your agents are doing. +- Pass `PLAYWRIGHT_DASHBOARD=1` env variable to see all `@playwright/test` browsers in the dashboard. + ### Breaking Changes ⚠️ - Removed macOS 14 support for WebKit. We recommend upgrading your macOS version, or keeping an older Playwright version. ### Browser Versions - Chromium 147.0.7727.15 - Mozilla Firefox 148.0.2 -- WebKit 26.0 +- WebKit 26.4 This version was also tested against the following stable channels: - Google Chrome 146 diff --git a/images/release-notes-1.59-dashboard.png b/images/release-notes-1.59-dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..b951a63c4ef18ce0fd7634a10c8d25d0378a4dd2 GIT binary patch literal 93009 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 W*Is=PAAgl2`~+{|fU7d|xbh!tH|kUX literal 0 HcmV?d00001 diff --git a/java/docs/api/class-browser.mdx b/java/docs/api/class-browser.mdx index fb91bf178f..d94670ce01 100644 --- a/java/docs/api/class-browser.mdx +++ b/java/docs/api/class-browser.mdx @@ -30,6 +30,41 @@ public class Example { ## Methods +### bind {#browser-bind} + +Added in: v1.59browser.bind + +Binds the browser to a named pipe or web socket, making it available for other clients to connect to. + +**Usage** + +```java +Browser.bind(title); +Browser.bind(title, options); +``` + +**Arguments** +- `title` [String]# + + Title of the browser server, used for identification. +- `options` `Browser.BindOptions` *(optional)* + - `setHost` [String] *(optional)*# + + Host to bind the web socket server to. When specified, a web socket server is created instead of a named pipe. + - `setPort` [int] *(optional)*# + + Port to bind the web socket server to. When specified, a web socket server is created instead of a named pipe. Use `0` to let the OS pick an available port. + - `setWorkspaceDir` [String] *(optional)*# + + Working directory associated with this browser server. + +**Returns** +- Bind# + - `endpoint` [String] + + +--- + ### browserType {#browser-browser-type} Added in: v1.23browser.browserType @@ -654,6 +689,23 @@ Browser.stopTracing(); --- +### unbind {#browser-unbind} + +Added in: v1.59browser.unbind + +Unbinds the browser server previously bound with [Browser.bind()](/api/class-browser.mdx#browser-bind). + +**Usage** + +```java +Browser.unbind(); +``` + +**Returns** +- [void]# + +--- + ### version {#browser-version} Added before v1.9browser.version diff --git a/java/docs/api/class-screencast.mdx b/java/docs/api/class-screencast.mdx index b89aca4c7c..72396a2ae5 100644 --- a/java/docs/api/class-screencast.mdx +++ b/java/docs/api/class-screencast.mdx @@ -14,6 +14,23 @@ Interface for capturing screencast frames from a page. ## Methods +### hideActions {#screencast-hide-actions} + +Added in: v1.59screencast.hideActions + +Removes action decorations. + +**Usage** + +```java +Screencast.hideActions(); +``` + +**Returns** +- [void]# + +--- + ### hideOverlays {#screencast-hide-overlays} Added in: v1.59screencast.hideOverlays @@ -31,6 +48,36 @@ Screencast.hideOverlays(); --- +### showActions {#screencast-show-actions} + +Added in: v1.59screencast.showActions + +Enables visual annotations on interacted elements. Returns a disposable that stops showing actions when disposed. + +**Usage** + +```java +Screencast.showActions(); +Screencast.showActions(options); +``` + +**Arguments** +- `options` `Screencast.ShowActionsOptions` *(optional)* + - `setDuration` [double] *(optional)*# + + How long each annotation is displayed in milliseconds. Defaults to `500`. + - `setFontSize` [int] *(optional)*# + + Font size of the action title in pixels. Defaults to `24`. + - `setPosition` `enum AnnotatePosition { TOP_LEFT, TOP, TOP_RIGHT, BOTTOM_LEFT, BOTTOM, BOTTOM_RIGHT }` *(optional)*# + + Position of the action title overlay. Defaults to `"top-right"`. + +**Returns** +- [Disposable]# + +--- + ### showChapter {#screencast-show-chapter} Added in: v1.59screencast.showChapter diff --git a/java/docs/release-notes.mdx b/java/docs/release-notes.mdx index d878a007c4..193b0c504b 100644 --- a/java/docs/release-notes.mdx +++ b/java/docs/release-notes.mdx @@ -13,11 +13,15 @@ import LiteYouTube from '@site/src/components/LiteYouTube'; ### 🎬 Screencast -New [Page.screencast()](/api/class-page.mdx#page-screencast) API provides a unified interface for capturing page content — both as video recordings and as real-time frame streams. +New [Page.screencast()](/api/class-page.mdx#page-screencast) API provides a unified interface for capturing page content — both as video recordings, annotations, overlays, and a real-time frame stream. + +
Demo -**Video recording** — record video with precise start/stop control, as an alternative to the [setRecordVideoDir](/api/class-browser.mdx#browser-new-context-option-record-video-dir) option: +
+ +**Screencast recording** — record video with precise start/stop control, as an alternative to the [setRecordVideoDir](/api/class-browser.mdx#browser-new-context-option-record-video-dir) option: ```java page.screencast().start(new Screencast.StartOptions().setPath(Paths.get("video.webm"))); @@ -35,12 +39,10 @@ page.screencast().start(new Screencast.StartOptions() **Action annotations** — enable built-in visual annotations that highlight interacted elements and display action titles during recording: ```java -page.screencast().start(new Screencast.StartOptions() - .setPath(Paths.get("video.webm")) - .setAnnotate(new Screencast.Annotate().setPosition("top-right"))); +page.screencast().showActions(new Screencast.ShowActionsOptions().setPosition("top-right")); ``` -The `annotate` option accepts `position` (`"top-left"`, `"top"`, `"top-right"`, `"bottom-left"`, `"bottom"`, `"bottom-right"`), `duration` (ms per annotation), and `fontSize` (px). +[Screencast.showActions()](/api/class-screencast.mdx#screencast-show-actions) accepts `position` (`"top-left"`, `"top"`, `"top-right"`, `"bottom-left"`, `"bottom"`, `"bottom-right"`), `duration` (ms per annotation), and `fontSize` (px). Returns a disposable to stop showing actions. **Visual overlays** — add chapter titles and custom HTML overlays on top of the page for richer narration: @@ -57,8 +59,8 @@ page.screencast().showOverlay("
Recording
"); ```java page.screencast().start(new Screencast.StartOptions() - .setPath(Paths.get("receipt.webm")) - .setAnnotate(new Screencast.Annotate().setPosition("top-right"))); + .setPath(Paths.get("receipt.webm"))); +page.screencast().showActions(new Screencast.ShowActionsOptions().setPosition("top-right")); page.screencast().showChapter("Verifying checkout flow", new Screencast.ShowChapterOptions() @@ -89,7 +91,8 @@ The resulting video serves as a receipt: chapter titles provide context, action #### Screencast - [Page.screencast()](/api/class-page.mdx#page-screencast) provides video recording, real-time frame streaming, and overlay management. - Methods [Screencast.start()](/api/class-screencast.mdx#screencast-start) and [Screencast.stop()](/api/class-screencast.mdx#screencast-stop) for recording and frame capture. -- Methods [Screencast.showChapter()](/api/class-screencast.mdx#screencast-show-chapter) and [Screencast.showOverlay()](/api/class-screencast.mdx#screencast-show-overlay) for visual annotations. +- Methods [Screencast.showActions()](/api/class-screencast.mdx#screencast-show-actions) and [Screencast.hideActions()](/api/class-screencast.mdx#screencast-hide-actions) for action annotations. +- Methods [Screencast.showChapter()](/api/class-screencast.mdx#screencast-show-chapter) and [Screencast.showOverlay()](/api/class-screencast.mdx#screencast-show-overlay) for visual overlays. - Methods [Screencast.showOverlays()](/api/class-screencast.mdx#screencast-show-overlays) and [Screencast.hideOverlays()](/api/class-screencast.mdx#screencast-hide-overlays) for overlay visibility control. #### Storage, Console and Errors @@ -103,17 +106,68 @@ The resulting video serves as a receipt: chapter titles provide context, action - Method [BrowserContext.isClosed()](/api/class-browsercontext.mdx#browser-context-is-closed). - Method [Request.existingResponse()](/api/class-request.mdx#request-existing-response) returns the response without waiting. - Method [Response.httpVersion()](/api/class-response.mdx#response-http-version) returns the HTTP version used by the response. -- Event [CDPSession.onClose(handler)](/api/class-cdpsession.mdx#cdp-session-event-close) for CDP sessions. - Option `live` in [Tracing.start()](/api/class-tracing.mdx#tracing-start) for real-time trace updates. - Option `artifactsDir` in [BrowserType.launch()](/api/class-browsertype.mdx#browser-type-launch) to configure the artifacts directory. +### 🔗 Interoperability + +New [Browser.bind()](/api/class-browser.mdx#browser-bind) API makes a launched browser available for `playwright-cli`, `@playwright/mcp`, and other clients to connect to. + +**Bind a browser** — start a browser and bind it so others can connect: + +```java +Browser browser = chromium.launch(); +Browser.BindResult serverInfo = browser.bind("my-session", + new Browser.BindOptions().setWorkspaceDir("/my/project")); +``` + +**Connect from playwright-cli** + +```bash +playwright-cli attach my-session +``` + +**Connect from playwright/mcp** + +```bash +@playwright/mcp --endpoint=my-session +``` + +**Connect from another client** + +```java +Browser browser = chromium.connect(serverInfo.endpoint); +``` + +Pass `host` and `port` options to bind over WebSocket instead of a named pipe: + +```java +Browser.BindResult serverInfo = browser.bind("my-session", + new Browser.BindOptions().setHost("localhost").setPort(0)); +// serverInfo.endpoint is a ws:// URL +``` + +Call [Browser.unbind()](/api/class-browser.mdx#browser-unbind) to stop accepting new connections. + +### 📊 Observability + +Run `playwright-cli show` to open the Dashboard that lists all bound browsers, their status, and workspace. + +
+ +Demo + +
+- `playwright-cli` binds all of its browsers automatically, so you can see what your agents are doing. +- Pass `PLAYWRIGHT_DASHBOARD=1` env variable to see all `@playwright/test` browsers in the dashboard. + ### Breaking Changes ⚠️ - Removed macOS 14 support for WebKit. We recommend upgrading your macOS version, or keeping an older Playwright version. ### Browser Versions - Chromium 147.0.7727.15 - Mozilla Firefox 148.0.2 -- WebKit 26.0 +- WebKit 26.4 This version was also tested against the following stable channels: - Google Chrome 146 diff --git a/nodejs/docs/api/class-androiddevice.mdx b/nodejs/docs/api/class-androiddevice.mdx index 09dac4d135..00fc63052c 100644 --- a/nodejs/docs/api/class-androiddevice.mdx +++ b/nodejs/docs/api/class-androiddevice.mdx @@ -334,7 +334,7 @@ await androidDevice.launchBrowser(options); Video frame height. Optional dimensions of the recorded videos. If not specified the size will be equal to `viewport` scaled down to fit into 800x800. If `viewport` is not configured explicitly the video size defaults to 800x450. Actual picture of each page will be scaled down if necessary to fit the specified size. - - `annotate` [Object] *(optional)* + - `showActions` [Object] *(optional)* - `duration` [number] *(optional)* How long each annotation is displayed in milliseconds. Defaults to `500`. diff --git a/nodejs/docs/api/class-browser.mdx b/nodejs/docs/api/class-browser.mdx index 7f60d0ec67..9e35ed9804 100644 --- a/nodejs/docs/api/class-browser.mdx +++ b/nodejs/docs/api/class-browser.mdx @@ -25,6 +25,44 @@ const { firefox } = require('playwright'); // Or 'chromium' or 'webkit'. ## Methods +### bind {#browser-bind} + +Added in: v1.59browser.bind + +Binds the browser to a named pipe or web socket, making it available for other clients to connect to. + +**Usage** + +```js +await browser.bind(title); +await browser.bind(title, options); +``` + +**Arguments** +- `title` [string]# + + Title of the browser server, used for identification. +- `options` [Object] *(optional)* + - `host` [string] *(optional)*# + + Host to bind the web socket server to. When specified, a web socket server is created instead of a named pipe. + - `metadata` [Object]<[string], [Object]> *(optional)*# + + Additional metadata to associate with the browser server. + - `port` [number] *(optional)*# + + Port to bind the web socket server to. When specified, a web socket server is created instead of a named pipe. Use `0` to let the OS pick an available port. + - `workspaceDir` [string] *(optional)*# + + Working directory associated with this browser server. + +**Returns** +- [Promise]<[Object]># + - `endpoint` [string] + + +--- + ### browserType {#browser-browser-type} Added in: v1.23browser.browserType @@ -331,7 +369,7 @@ If directly using this method to create [BrowserContext]s, it is best practice t Video frame height. Optional dimensions of the recorded videos. If not specified the size will be equal to `viewport` scaled down to fit into 800x800. If `viewport` is not configured explicitly the video size defaults to 800x450. Actual picture of each page will be scaled down if necessary to fit the specified size. - - `annotate` [Object] *(optional)* + - `showActions` [Object] *(optional)* - `duration` [number] *(optional)* How long each annotation is displayed in milliseconds. Defaults to `500`. @@ -637,7 +675,7 @@ await browser.newPage(options); Video frame height. Optional dimensions of the recorded videos. If not specified the size will be equal to `viewport` scaled down to fit into 800x800. If `viewport` is not configured explicitly the video size defaults to 800x450. Actual picture of each page will be scaled down if necessary to fit the specified size. - - `annotate` [Object] *(optional)* + - `showActions` [Object] *(optional)* - `duration` [number] *(optional)* How long each annotation is displayed in milliseconds. Defaults to `500`. @@ -849,6 +887,23 @@ await browser.stopTracing(); --- +### unbind {#browser-unbind} + +Added in: v1.59browser.unbind + +Unbinds the browser server previously bound with [browser.bind()](/api/class-browser.mdx#browser-bind). + +**Usage** + +```js +await browser.unbind(); +``` + +**Returns** +- [Promise]<[void]># + +--- + ### version {#browser-version} Added before v1.9browser.version diff --git a/nodejs/docs/api/class-browsertype.mdx b/nodejs/docs/api/class-browsertype.mdx index 5952b48562..4dca4f3938 100644 --- a/nodejs/docs/api/class-browsertype.mdx +++ b/nodejs/docs/api/class-browsertype.mdx @@ -518,7 +518,7 @@ await browserType.launchPersistentContext(userDataDir, options); Video frame height. Optional dimensions of the recorded videos. If not specified the size will be equal to `viewport` scaled down to fit into 800x800. If `viewport` is not configured explicitly the video size defaults to 800x450. Actual picture of each page will be scaled down if necessary to fit the specified size. - - `annotate` [Object] *(optional)* + - `showActions` [Object] *(optional)* - `duration` [number] *(optional)* How long each annotation is displayed in milliseconds. Defaults to `500`. diff --git a/nodejs/docs/api/class-electron.mdx b/nodejs/docs/api/class-electron.mdx index 0ffb83b19d..6d3432abae 100644 --- a/nodejs/docs/api/class-electron.mdx +++ b/nodejs/docs/api/class-electron.mdx @@ -170,7 +170,7 @@ await electron.launch(options); Video frame height. Optional dimensions of the recorded videos. If not specified the size will be equal to `viewport` scaled down to fit into 800x800. If `viewport` is not configured explicitly the video size defaults to 800x450. Actual picture of each page will be scaled down if necessary to fit the specified size. - - `annotate` [Object] *(optional)* + - `showActions` [Object] *(optional)* - `duration` [number] *(optional)* How long each annotation is displayed in milliseconds. Defaults to `500`. diff --git a/nodejs/docs/api/class-screencast.mdx b/nodejs/docs/api/class-screencast.mdx index b09c64f212..5a811d9674 100644 --- a/nodejs/docs/api/class-screencast.mdx +++ b/nodejs/docs/api/class-screencast.mdx @@ -14,6 +14,23 @@ Interface for capturing screencast frames from a page. ## Methods +### hideActions {#screencast-hide-actions} + +Added in: v1.59screencast.hideActions + +Removes action decorations. + +**Usage** + +```js +await screencast.hideActions(); +``` + +**Returns** +- [Promise]<[void]># + +--- + ### hideOverlays {#screencast-hide-overlays} Added in: v1.59screencast.hideOverlays @@ -31,6 +48,36 @@ await screencast.hideOverlays(); --- +### showActions {#screencast-show-actions} + +Added in: v1.59screencast.showActions + +Enables visual annotations on interacted elements. Returns a disposable that stops showing actions when disposed. + +**Usage** + +```js +await screencast.showActions(); +await screencast.showActions(options); +``` + +**Arguments** +- `options` [Object] *(optional)* + - `duration` [number] *(optional)*# + + How long each annotation is displayed in milliseconds. Defaults to `500`. + - `fontSize` [number] *(optional)*# + + Font size of the action title in pixels. Defaults to `24`. + - `position` "top-left" | "top" | "top-right" | "bottom-left" | "bottom" | "bottom-right" *(optional)*# + + Position of the action title overlay. Defaults to `"top-right"`. + +**Returns** +- [Promise]<[Disposable]># + +--- + ### showChapter {#screencast-show-chapter} Added in: v1.59screencast.showChapter diff --git a/nodejs/docs/api/class-testoptions.mdx b/nodejs/docs/api/class-testoptions.mdx index b7de365def..34a31d1eb8 100644 --- a/nodejs/docs/api/class-testoptions.mdx +++ b/nodejs/docs/api/class-testoptions.mdx @@ -1020,7 +1020,7 @@ Whether to record video for each test. Defaults to `'off'`. To control video size, pass an object with `mode` and `size` properties. If video size is not specified, it will be equal to [testOptions.viewport](/api/class-testoptions.mdx#test-options-viewport) scaled down to fit into 800x800. If `viewport` is not configured explicitly the video size defaults to 800x450. Actual picture of each page will be scaled down if necessary to fit the specified size. -To annotate actions in the video, pass `annotate` with `action` and/or `test` sub-options. The `action` option controls visual highlights on interacted elements with an optional `delay` in milliseconds (defaults to `500`). The `test` option controls which test information is displayed as a status overlay. +To annotate actions in the video, pass `show` with `action` and/or `test` sub-options. The `action` option controls visual highlights on interacted elements with an optional `delay` in milliseconds (defaults to `500`). The `test` option controls which test information is displayed as a status overlay. **Usage** @@ -1049,8 +1049,8 @@ Learn more about [recording video](../test-use-options.mdx#recording-options). Size of the recorded video. Optional. - - `annotate` [Object] *(optional)* - - `action` [Object] *(optional)* + - `show` [Object] *(optional)* + - `actions` [Object] *(optional)* - `duration` [number] *(optional)* How long each annotation is displayed in milliseconds. Defaults to `500`. diff --git a/nodejs/docs/release-notes.mdx b/nodejs/docs/release-notes.mdx index c86e09fce4..077723057f 100644 --- a/nodejs/docs/release-notes.mdx +++ b/nodejs/docs/release-notes.mdx @@ -13,11 +13,15 @@ import LiteYouTube from '@site/src/components/LiteYouTube'; ### 🎬 Screencast -New [page.screencast](/api/class-page.mdx#page-screencast) API provides a unified interface for capturing page content — both as video recordings and as real-time frame streams. +New [page.screencast](/api/class-page.mdx#page-screencast) API provides a unified interface for capturing page content — both as video recordings, annotations, overlays, and a real-time frame stream. + +
Demo -**Video recording** — record video with precise start/stop control, as an alternative to the [recordVideo](/api/class-browser.mdx#browser-new-context-option-record-video) option: +
+ +**Screencast recording** — record video with precise start/stop control, as an alternative to the [recordVideo](/api/class-browser.mdx#browser-new-context-option-record-video) option: ```js await page.screencast.start({ path: 'video.webm' }); @@ -37,13 +41,27 @@ await page.screencast.start({ **Action annotations** — enable built-in visual annotations that highlight interacted elements and display action titles during recording: ```js -await page.screencast.start({ - path: 'video.webm', - annotate: { position: 'top-right' }, -}); +await page.screencast.showActions({ position: 'top-right' }); ``` -The `annotate` option accepts `position` (`'top-left'`, `'top'`, `'top-right'`, `'bottom-left'`, `'bottom'`, `'bottom-right'`), `duration` (ms per annotation), and `fontSize` (px). +[screencast.showActions()](/api/class-screencast.mdx#screencast-show-actions) accepts `position` (`'top-left'`, `'top'`, `'top-right'`, `'bottom-left'`, `'bottom'`, `'bottom-right'`), `duration` (ms per annotation), and `fontSize` (px). Returns a disposable to stop showing actions. + +Action annotations can also be enabled in test fixtures via the `video` option: + +```js +// playwright.config.ts +export default defineConfig({ + use: { + video: { + mode: 'on', + show: { + actions: { position: 'top-left' }, + test: { position: 'top-right' }, + }, + }, + }, +}); +``` **Visual overlays** — add chapter titles and custom HTML overlays on top of the page for richer narration: @@ -59,10 +77,8 @@ await page.screencast.showOverlay('
Recording
'); **Agentic video receipts** — coding agents can produce video evidence of their work. After completing a task, an agent can record a walkthrough video with rich annotations for human review: ```js -await page.screencast.start({ - path: 'receipt.webm', - annotate: { position: 'top-right' }, -}); +await page.screencast.start({ path: 'receipt.webm' }); +await page.screencast.showActions({ position: 'top-right' }); await page.screencast.showChapter('Verifying checkout flow', { description: 'Added coupon code support per ticket #1234', @@ -82,9 +98,63 @@ await page.screencast.stop(); The resulting video serves as a receipt: chapter titles provide context, action annotations highlight each interaction, and the visual walkthrough is faster to review than text logs. -### 🤖 Agentic Tools +### 🔗 Interoperability + +New [browser.bind()](/api/class-browser.mdx#browser-bind) API makes a launched browser available for `playwright-cli`, `@playwright/mcp`, and other clients to connect to. + +**Bind a browser** — start a browser and bind it so others can connect: -#### CLI debugger +```js +const browser = await chromium.launch(); +const { endpoint } = await browser.bind('my-session', { + workspaceDir: '/my/project', +}); +``` + +**Connect from playwright-cli** + +```bash +playwright-cli attach my-session +playwright-cli -s my-session snapshot +``` + +**Connect from playwright/mcp** + +```bash +@playwright/mcp --endpoint=my-session +``` + +**Connect from another client** + +```js +const browser = await chromium.connect(endpoint); +``` + +Pass `host` and `port` options to bind over WebSocket instead of a named pipe: + +```js +const { endpoint } = await browser.bind('my-session', { + host: 'localhost', + port: 0, +}); +// endpoint is a ws:// URL +``` + +Call [browser.unbind()](/api/class-browser.mdx#browser-unbind) to stop accepting new connections. + +### 📊 Observability + +Run `playwright-cli show` to open the Dashboard that lists all bound browsers, their status, and workspace. + +
+ +Demo + +
+- `playwright-cli` binds all of its browsers automatically, so you can see what your agents are doing. +- Pass `PLAYWRIGHT_DASHBOARD=1` env variable to see all `@playwright/test` browsers in the dashboard. + +### 🐛 CLI debugger for agents Coding agents can now run `npx playwright test --debug=cli` to attach and debug tests over `playwright-cli` — perfect for automatically fixing tests in agentic workflows: @@ -107,7 +177,7 @@ $ playwright-cli --session tw-87b59e step-over - Expect "toHaveTitle" at output/tests/example.spec.ts:7 ``` -#### CLI trace analysis +### 📋 CLI trace analysis for agents Coding agents can run `npx playwright trace` to explore [Playwright Trace](./trace-viewer.mdx) and understand failing or flaky tests from the command line: @@ -163,7 +233,8 @@ await using page = await context.newPage(); #### Screencast - [page.screencast](/api/class-page.mdx#page-screencast) provides video recording, real-time frame streaming, and overlay management. - Methods [screencast.start()](/api/class-screencast.mdx#screencast-start) and [screencast.stop()](/api/class-screencast.mdx#screencast-stop) for recording and frame capture. -- Methods [screencast.showChapter()](/api/class-screencast.mdx#screencast-show-chapter) and [screencast.showOverlay()](/api/class-screencast.mdx#screencast-show-overlay) for visual annotations. +- Methods [screencast.showActions()](/api/class-screencast.mdx#screencast-show-actions) and [screencast.hideActions()](/api/class-screencast.mdx#screencast-hide-actions) for action annotations. +- Methods [screencast.showChapter()](/api/class-screencast.mdx#screencast-show-chapter) and [screencast.showOverlay()](/api/class-screencast.mdx#screencast-show-overlay) for visual overlays. - Methods [screencast.showOverlays()](/api/class-screencast.mdx#screencast-show-overlays) and [screencast.hideOverlays()](/api/class-screencast.mdx#screencast-hide-overlays) for overlay visibility control. #### Storage, Console and Errors @@ -195,7 +266,7 @@ await using page = await context.newPage(); ### Browser Versions - Chromium 147.0.7727.15 - Mozilla Firefox 148.0.2 -- WebKit 26.0 +- WebKit 26.4 This version was also tested against the following stable channels: - Google Chrome 146 diff --git a/nodejs/docs/videos.mdx b/nodejs/docs/videos.mdx index dc5af286a0..3b8ca14b28 100644 --- a/nodejs/docs/videos.mdx +++ b/nodejs/docs/videos.mdx @@ -55,7 +55,9 @@ await context.close(); You can also specify video size and annotation. The video size defaults to the viewport size scaled down to fit 800x800. The video of the viewport is placed in the top-left corner of the output video, scaled down to fit if necessary. You may need to set the viewport size to match your desired video size. -When `annotate` is specified, each action will be visually highlighted in the video with the element outline and action title subtitle. The optional `duration` property controls how long each annotation is displayed (defaults to `500`ms). +When `show: { actions }` is specified, each action will be visually highlighted in the video with the element outline and action title subtitle. The optional `duration` property controls how long each annotation is displayed (defaults to `500`ms). + +When `show: { test }` is specified, video will be annotated with the current test information with configurable `level`. ```js title="playwright.config.ts" import { defineConfig } from '@playwright/test'; @@ -64,8 +66,8 @@ export default defineConfig({ video: { mode: 'on-first-retry', size: { width: 640, height: 480 }, - annotate: { - action: { + show: { + actions: { duration: 500, position: 'top-right', fontSize: 14, diff --git a/python/docs/api/class-browser.mdx b/python/docs/api/class-browser.mdx index 3c5bbc79f5..78e84b16d9 100644 --- a/python/docs/api/class-browser.mdx +++ b/python/docs/api/class-browser.mdx @@ -61,6 +61,40 @@ asyncio.run(main()) ## Methods +### bind {#browser-bind} + +Added in: v1.59browser.bind + +Binds the browser to a named pipe or web socket, making it available for other clients to connect to. + +**Usage** + +```python +browser.bind(title) +browser.bind(title, **kwargs) +``` + +**Arguments** +- `title` [str]# + + Title of the browser server, used for identification. +- `host` [str] *(optional)*# + + Host to bind the web socket server to. When specified, a web socket server is created instead of a named pipe. +- `port` [int] *(optional)*# + + Port to bind the web socket server to. When specified, a web socket server is created instead of a named pipe. Use `0` to let the OS pick an available port. +- `workspace_dir` [str] *(optional)*# + + Working directory associated with this browser server. + +**Returns** +- [Dict]# + - `endpoint` [str] + + +--- + ### close {#browser-close} Added before v1.9browser.close @@ -751,6 +785,23 @@ browser.stop_tracing() --- +### unbind {#browser-unbind} + +Added in: v1.59browser.unbind + +Unbinds the browser server previously bound with [browser.bind()](/api/class-browser.mdx#browser-bind). + +**Usage** + +```python +browser.unbind() +``` + +**Returns** +- [NoneType]# + +--- + ## Properties ### browser_type {#browser-browser-type} diff --git a/python/docs/api/class-screencast.mdx b/python/docs/api/class-screencast.mdx index 2b3c60c32e..aa78fc2eb7 100644 --- a/python/docs/api/class-screencast.mdx +++ b/python/docs/api/class-screencast.mdx @@ -14,6 +14,23 @@ Interface for capturing screencast frames from a page. ## Methods +### hide_actions {#screencast-hide-actions} + +Added in: v1.59screencast.hide_actions + +Removes action decorations. + +**Usage** + +```python +screencast.hide_actions() +``` + +**Returns** +- [NoneType]# + +--- + ### hide_overlays {#screencast-hide-overlays} Added in: v1.59screencast.hide_overlays @@ -31,6 +48,35 @@ screencast.hide_overlays() --- +### show_actions {#screencast-show-actions} + +Added in: v1.59screencast.show_actions + +Enables visual annotations on interacted elements. Returns a disposable that stops showing actions when disposed. + +**Usage** + +```python +screencast.show_actions() +screencast.show_actions(**kwargs) +``` + +**Arguments** +- `duration` [float] *(optional)*# + + How long each annotation is displayed in milliseconds. Defaults to `500`. +- `font_size` [int] *(optional)*# + + Font size of the action title in pixels. Defaults to `24`. +- `position` "top-left" | "top" | "top-right" | "bottom-left" | "bottom" | "bottom-right" *(optional)*# + + Position of the action title overlay. Defaults to `"top-right"`. + +**Returns** +- [Disposable]# + +--- + ### show_chapter {#screencast-show-chapter} Added in: v1.59screencast.show_chapter diff --git a/python/docs/release-notes.mdx b/python/docs/release-notes.mdx index 8c8f8f25dd..9c0124c7ee 100644 --- a/python/docs/release-notes.mdx +++ b/python/docs/release-notes.mdx @@ -13,11 +13,15 @@ import LiteYouTube from '@site/src/components/LiteYouTube'; ### 🎬 Screencast -New [page.screencast](/api/class-page.mdx#page-screencast) API provides a unified interface for capturing page content — both as video recordings and as real-time frame streams. +New [page.screencast](/api/class-page.mdx#page-screencast) API provides a unified interface for capturing page content — both as video recordings, annotations, overlays, and a real-time frame stream. + +
Demo -**Video recording** — record video with precise start/stop control, as an alternative to the [record_video_dir](/api/class-browser.mdx#browser-new-context-option-record-video-dir) option: +
+ +**Screencast recording** — record video with precise start/stop control, as an alternative to the [record_video_dir](/api/class-browser.mdx#browser-new-context-option-record-video-dir) option: ```python page.screencast.start(path="video.webm") @@ -36,13 +40,10 @@ page.screencast.start( **Action annotations** — enable built-in visual annotations that highlight interacted elements and display action titles during recording: ```python -page.screencast.start( - path="video.webm", - annotate={"position": "top-right"}, -) +page.screencast.show_actions(position="top-right") ``` -The `annotate` option accepts `position` (`'top-left'`, `'top'`, `'top-right'`, `'bottom-left'`, `'bottom'`, `'bottom-right'`), `duration` (ms per annotation), and `font_size` (px). +[screencast.show_actions()](/api/class-screencast.mdx#screencast-show-actions) accepts `position` (`'top-left'`, `'top'`, `'top-right'`, `'bottom-left'`, `'bottom'`, `'bottom-right'`), `duration` (ms per annotation), and `font_size` (px). Returns a disposable to stop showing actions. **Visual overlays** — add chapter titles and custom HTML overlays on top of the page for richer narration: @@ -58,10 +59,8 @@ page.screencast.show_overlay('
Recording
') **Agentic video receipts** — coding agents can produce video evidence of their work. After completing a task, an agent can record a walkthrough video with rich annotations for human review: ```python -page.screencast.start( - path="receipt.webm", - annotate={"position": "top-right"}, -) +page.screencast.start(path="receipt.webm") +page.screencast.show_actions(position="top-right") page.screencast.show_chapter("Verifying checkout flow", description="Added coupon code support per ticket #1234", @@ -92,7 +91,8 @@ The resulting video serves as a receipt: chapter titles provide context, action #### Screencast - [page.screencast](/api/class-page.mdx#page-screencast) provides video recording, real-time frame streaming, and overlay management. - Methods [screencast.start()](/api/class-screencast.mdx#screencast-start) and [screencast.stop()](/api/class-screencast.mdx#screencast-stop) for recording and frame capture. -- Methods [screencast.show_chapter()](/api/class-screencast.mdx#screencast-show-chapter) and [screencast.show_overlay()](/api/class-screencast.mdx#screencast-show-overlay) for visual annotations. +- Methods [screencast.show_actions()](/api/class-screencast.mdx#screencast-show-actions) and [screencast.hide_actions()](/api/class-screencast.mdx#screencast-hide-actions) for action annotations. +- Methods [screencast.show_chapter()](/api/class-screencast.mdx#screencast-show-chapter) and [screencast.show_overlay()](/api/class-screencast.mdx#screencast-show-overlay) for visual overlays. - Methods [screencast.show_overlays()](/api/class-screencast.mdx#screencast-show-overlays) and [screencast.hide_overlays()](/api/class-screencast.mdx#screencast-hide-overlays) for overlay visibility control. #### Storage, Console and Errors @@ -106,17 +106,71 @@ The resulting video serves as a receipt: chapter titles provide context, action - Method [browser_context.is_closed()](/api/class-browsercontext.mdx#browser-context-is-closed). - Method [request.existing_response](/api/class-request.mdx#request-existing-response) returns the response without waiting. - Method [response.http_version()](/api/class-response.mdx#response-http-version) returns the HTTP version used by the response. -- Event [cdp_session.on("close")](/api/class-cdpsession.mdx#cdp-session-event-close) for CDP sessions. - Option `live` in [tracing.start()](/api/class-tracing.mdx#tracing-start) for real-time trace updates. - Option `artifacts_dir` in [browser_type.launch()](/api/class-browsertype.mdx#browser-type-launch) to configure the artifacts directory. +### 🔗 Interoperability + +New [browser.bind()](/api/class-browser.mdx#browser-bind) API makes a launched browser available for `playwright-cli`, `@playwright/mcp`, and other clients to connect to. + +**Bind a browser** — start a browser and bind it so others can connect: + +```python +browser = await chromium.launch() +server_info = await browser.bind("my-session", + workspace_dir="/my/project", +) +``` + +**Connect from playwright-cli** + +```bash +playwright-cli attach my-session +``` + +**Connect from playwright/mcp** + +```bash +@playwright/mcp --endpoint=my-session +``` + +**Connect from another client** + +```python +browser = await chromium.connect(server_info["endpoint"]) +``` + +Pass `host` and `port` options to bind over WebSocket instead of a named pipe: + +```python +server_info = await browser.bind("my-session", + host="localhost", + port=0, +) +# server_info["endpoint"] is a ws:// URL +``` + +Call [browser.unbind()](/api/class-browser.mdx#browser-unbind) to stop accepting new connections. + +### 📊 Observability + +Run `playwright-cli show` to open the Dashboard that lists all bound browsers, their status, and workspace. + +
+ +Demo + +
+- `playwright-cli` binds all of its browsers automatically, so you can see what your agents are doing. +- Pass `PLAYWRIGHT_DASHBOARD=1` env variable to see all `@playwright/test` browsers in the dashboard. + ### Breaking Changes ⚠️ - Removed macOS 14 support for WebKit. We recommend upgrading your macOS version, or keeping an older Playwright version. ### Browser Versions - Chromium 147.0.7727.15 - Mozilla Firefox 148.0.2 -- WebKit 26.0 +- WebKit 26.4 This version was also tested against the following stable channels: - Google Chrome 146