diff --git a/dotnet/docs/api/class-browser.mdx b/dotnet/docs/api/class-browser.mdx
index 0ca1d4a6ff..9104f28fa0 100644
--- a/dotnet/docs/api/class-browser.mdx
+++ b/dotnet/docs/api/class-browser.mdx
@@ -311,6 +311,9 @@ await browser.CloseAsync();
- `Permissions` [IEnumerable]?<[string]> *(optional)*#
A list of permissions to grant to all pages in this context. See [BrowserContext.GrantPermissionsAsync()](/api/class-browsercontext.mdx#browser-context-grant-permissions) for more details. Defaults to none.
+ - `PierceFrames` [bool]? *(optional)*#
+
+ If set to true, all selectors in this context will pierce frames by default, as if every locator was created through [Page.PierceFrames()](/api/class-page.mdx#page-pierce-frames). Defaults to `false`.
- `Proxy` Proxy? *(optional)*#
- `Server` [string]
@@ -533,6 +536,9 @@ await Browser.NewPageAsync(options);
- `Permissions` [IEnumerable]?<[string]> *(optional)*#
A list of permissions to grant to all pages in this context. See [BrowserContext.GrantPermissionsAsync()](/api/class-browsercontext.mdx#browser-context-grant-permissions) for more details. Defaults to none.
+ - `PierceFrames` [bool]? *(optional)*#
+
+ If set to true, all selectors in this context will pierce frames by default, as if every locator was created through [Page.PierceFrames()](/api/class-page.mdx#page-pierce-frames). Defaults to `false`.
- `Proxy` Proxy? *(optional)*#
- `Server` [string]
diff --git a/dotnet/docs/api/class-browsertype.mdx b/dotnet/docs/api/class-browsertype.mdx
index fd6bbb2de7..352cd2c242 100644
--- a/dotnet/docs/api/class-browsertype.mdx
+++ b/dotnet/docs/api/class-browsertype.mdx
@@ -461,6 +461,9 @@ await BrowserType.LaunchPersistentContextAsync(userDataDir, options);
- `Permissions` [IEnumerable]?<[string]> *(optional)*#
A list of permissions to grant to all pages in this context. See [BrowserContext.GrantPermissionsAsync()](/api/class-browsercontext.mdx#browser-context-grant-permissions) for more details. Defaults to none.
+ - `PierceFrames` [bool]? *(optional)*#
+
+ If set to true, all selectors in this context will pierce frames by default, as if every locator was created through [Page.PierceFrames()](/api/class-page.mdx#page-pierce-frames). Defaults to `false`.
- `Proxy` Proxy? *(optional)*#
- `Server` [string]
diff --git a/dotnet/docs/api/class-frame.mdx b/dotnet/docs/api/class-frame.mdx
index 32c2b5dd2d..11c29790cb 100644
--- a/dotnet/docs/api/class-frame.mdx
+++ b/dotnet/docs/api/class-frame.mdx
@@ -900,6 +900,12 @@ var locator = frame.PierceFrames.GetByRole(AriaRole.Button);
await locator.ClickAsync();
```
+**Arguments**
+- `options` `FramePierceFramesOptions?` *(optional)*
+ - `Pierce` [bool]? *(optional)*#
+
+ Whether to pierce frames. Pass `false` to opt out of frame piercing enabled by the [PierceFrames](/api/class-browser.mdx#browser-new-context-option-pierce-frames) context option. Defaults to `true`.
+
**Returns**
- [FrameLocator]#
diff --git a/dotnet/docs/api/class-page.mdx b/dotnet/docs/api/class-page.mdx
index 72421c21b4..6e4b686dbc 100644
--- a/dotnet/docs/api/class-page.mdx
+++ b/dotnet/docs/api/class-page.mdx
@@ -1643,6 +1643,12 @@ var locator = page.PierceFrames.GetByRole(AriaRole.Button);
await locator.ClickAsync();
```
+**Arguments**
+- `options` `PagePierceFramesOptions?` *(optional)*
+ - `Pierce` [bool]? *(optional)*#
+
+ Whether to pierce frames. Pass `false` to opt out of frame piercing enabled by the [PierceFrames](/api/class-browser.mdx#browser-new-context-option-pierce-frames) context option. Defaults to `true`.
+
**Returns**
- [FrameLocator]#
diff --git a/dotnet/docs/browsers.mdx b/dotnet/docs/browsers.mdx
index f3e6ebc4fb..ce3076574f 100644
--- a/dotnet/docs/browsers.mdx
+++ b/dotnet/docs/browsers.mdx
@@ -68,7 +68,7 @@ See [system requirements](./intro.mdx#system-requirements) for officially suppor
## Configure Browsers
-Playwright can run tests on Chromium, WebKit and Firefox browsers as well as branded browsers such as Google Chrome and Microsoft Edge. It can also run on emulated tablet and mobile devices. See the [registry of device parameters](https://github.com/microsoft/playwright/blob/main/packages/playwright-core/src/server/deviceDescriptorsSource.json) for a complete list of selected desktop, tablet and mobile devices.
+Playwright can run tests on Chromium, WebKit and Firefox browsers as well as branded browsers such as Google Chrome and Microsoft Edge. It can also run on emulated tablet and mobile devices. See the [registry of device parameters](https://github.com/microsoft/playwright/blob/main/packages/isomorphic/deviceDescriptorsSource.json) for a complete list of selected desktop, tablet and mobile devices.
### Run tests on different browsers
diff --git a/dotnet/docs/emulation.mdx b/dotnet/docs/emulation.mdx
index a25624864d..f86ddacb08 100644
--- a/dotnet/docs/emulation.mdx
+++ b/dotnet/docs/emulation.mdx
@@ -12,7 +12,7 @@ With Playwright you can test your app on any browser as well as emulate a real d
## Devices
-Playwright comes with a [registry of device parameters](https://github.com/microsoft/playwright/blob/main/packages/playwright-core/src/server/deviceDescriptorsSource.json) using [Playwright.Devices](/api/class-playwright.mdx#playwright-devices) for selected desktop, tablet and mobile devices. It can be used to simulate browser behavior for a specific device such as user agent, screen size, viewport and if it has touch enabled. All tests will run with the specified device parameters.
+Playwright comes with a [registry of device parameters](https://github.com/microsoft/playwright/blob/main/packages/isomorphic/deviceDescriptorsSource.json) using [Playwright.Devices](/api/class-playwright.mdx#playwright-devices) for selected desktop, tablet and mobile devices. It can be used to simulate browser behavior for a specific device such as user agent, screen size, viewport and if it has touch enabled. All tests will run with the specified device parameters.
```csharp
using Microsoft.Playwright;
diff --git a/dotnet/docs/getting-started-cli.mdx b/dotnet/docs/getting-started-cli.mdx
index 69684ba510..2e526e707a 100644
--- a/dotnet/docs/getting-started-cli.mdx
+++ b/dotnet/docs/getting-started-cli.mdx
@@ -44,6 +44,12 @@ Coding agents like Claude Code and GitHub Copilot can use locally installed skil
playwright-cli install --skills
```
+To share the skills across all your projects, add the `-g` flag to install them into your home directory (`~/.claude/skills` or, with `--skills=agents`, `~/.agents/skills`):
+
+```bash
+playwright-cli install --skills -g
+```
+
### Skills-less operation
You can also point your agent at the CLI directly and let it discover commands on its own:
@@ -103,7 +109,7 @@ playwright-cli check [ # check a checkbox or radio button
playwright-cli uncheck ][ # uncheck a checkbox
playwright-cli hover ][ # hover over element
playwright-cli drag # drag and drop between elements
-playwright-cli upload # upload files
+playwright-cli upload # upload one or multiple files
playwright-cli close # close the page
```
diff --git a/dotnet/docs/release-notes.mdx b/dotnet/docs/release-notes.mdx
index f510706f5b..6c0b50157f 100644
--- a/dotnet/docs/release-notes.mdx
+++ b/dotnet/docs/release-notes.mdx
@@ -9,6 +9,34 @@ import HTMLCard from '@site/src/components/HTMLCard';
import LiteYouTube from '@site/src/components/LiteYouTube';
+## Version 1.62
+
+### 🖼️ WebP screenshots
+
+[Page.ScreenshotAsync()](/api/class-page.mdx#page-screenshot) and [Locator.ScreenshotAsync()](/api/class-locator.mdx#locator-screenshot) can now capture screenshots in the WebP format — Playwright infers the format from a `.webp` file extension, or you can set the `type` explicitly. Quality `100` (the default) is lossless, while lower values use lossy compression:
+
+```csharp
+await page.ScreenshotAsync(new() { Path = "homepage.webp", Quality = 50 });
+```
+
+### New APIs
+- New `scroll` option (`"auto"` | `"none"`) on actions to opt out of Playwright's automatic scroll-into-view.
+- New [Locator.WaitForFunctionAsync()](/api/class-locator.mdx#locator-wait-for-function) waits until a function — called with the matching element — returns a truthy value.
+- New [ApiResponse.Timing](/api/class-apiresponse.mdx#api-response-timing) returns resource timing information for an API response.
+
+### Announcements
+* 📋 The clipboard is now isolated from the operating system in headless mode, so tests that use `navigator.clipboard` no longer read or overwrite the clipboard of the machine running them.
+* ⚠️ Debian 11 is not supported anymore.
+
+### Browser Versions
+- Chromium 151.0.7922.34
+- Mozilla Firefox 153.0
+- WebKit 26.5
+
+This version was also tested against the following stable channels:
+- Google Chrome 151
+- Microsoft Edge 151
+
## Version 1.61
### 🔑 WebAuthn passkeys
diff --git a/java/docs/api/class-browser.mdx b/java/docs/api/class-browser.mdx
index 416f0a4c84..e7b873a907 100644
--- a/java/docs/api/class-browser.mdx
+++ b/java/docs/api/class-browser.mdx
@@ -316,6 +316,9 @@ browser.close();
- `setPermissions` [List]<[String]> *(optional)*#
A list of permissions to grant to all pages in this context. See [BrowserContext.grantPermissions()](/api/class-browsercontext.mdx#browser-context-grant-permissions) for more details. Defaults to none.
+ - `setPierceFrames` [boolean] *(optional)*#
+
+ If set to true, all selectors in this context will pierce frames by default, as if every locator was created through [Page.pierceFrames()](/api/class-page.mdx#page-pierce-frames). Defaults to `false`.
- `setProxy` Proxy *(optional)*#
- `setServer` [String]
@@ -539,6 +542,9 @@ Browser.newPage(options);
- `setPermissions` [List]<[String]> *(optional)*#
A list of permissions to grant to all pages in this context. See [BrowserContext.grantPermissions()](/api/class-browsercontext.mdx#browser-context-grant-permissions) for more details. Defaults to none.
+ - `setPierceFrames` [boolean] *(optional)*#
+
+ If set to true, all selectors in this context will pierce frames by default, as if every locator was created through [Page.pierceFrames()](/api/class-page.mdx#page-pierce-frames). Defaults to `false`.
- `setProxy` Proxy *(optional)*#
- `setServer` [String]
diff --git a/java/docs/api/class-browsertype.mdx b/java/docs/api/class-browsertype.mdx
index 40ae0a2e0b..dd1a6f6d44 100644
--- a/java/docs/api/class-browsertype.mdx
+++ b/java/docs/api/class-browsertype.mdx
@@ -461,6 +461,9 @@ BrowserType.launchPersistentContext(userDataDir, options);
- `setPermissions` [List]<[String]> *(optional)*#
A list of permissions to grant to all pages in this context. See [BrowserContext.grantPermissions()](/api/class-browsercontext.mdx#browser-context-grant-permissions) for more details. Defaults to none.
+ - `setPierceFrames` [boolean] *(optional)*#
+
+ If set to true, all selectors in this context will pierce frames by default, as if every locator was created through [Page.pierceFrames()](/api/class-page.mdx#page-pierce-frames). Defaults to `false`.
- `setProxy` Proxy *(optional)*#
- `setServer` [String]
diff --git a/java/docs/api/class-frame.mdx b/java/docs/api/class-frame.mdx
index fb4d70d837..2bc00e1ab7 100644
--- a/java/docs/api/class-frame.mdx
+++ b/java/docs/api/class-frame.mdx
@@ -903,6 +903,12 @@ Locator locator = frame.pierceFrames().getByRole(AriaRole.BUTTON);
locator.click();
```
+**Arguments**
+- `options` `Frame.PierceFramesOptions` *(optional)*
+ - `setPierce` [boolean] *(optional)*#
+
+ Whether to pierce frames. Pass `false` to opt out of frame piercing enabled by the [setPierceFrames](/api/class-browser.mdx#browser-new-context-option-pierce-frames) context option. Defaults to `true`.
+
**Returns**
- [FrameLocator]#
diff --git a/java/docs/api/class-page.mdx b/java/docs/api/class-page.mdx
index 74c15fa5ac..3b963befb0 100644
--- a/java/docs/api/class-page.mdx
+++ b/java/docs/api/class-page.mdx
@@ -1701,6 +1701,12 @@ Locator locator = page.pierceFrames().getByRole(AriaRole.BUTTON);
locator.click();
```
+**Arguments**
+- `options` `Page.PierceFramesOptions` *(optional)*
+ - `setPierce` [boolean] *(optional)*#
+
+ Whether to pierce frames. Pass `false` to opt out of frame piercing enabled by the [setPierceFrames](/api/class-browser.mdx#browser-new-context-option-pierce-frames) context option. Defaults to `true`.
+
**Returns**
- [FrameLocator]#
diff --git a/java/docs/browsers.mdx b/java/docs/browsers.mdx
index 5b214a230a..607f4baadd 100644
--- a/java/docs/browsers.mdx
+++ b/java/docs/browsers.mdx
@@ -56,7 +56,7 @@ See [system requirements](./intro.mdx#system-requirements) for officially suppor
## Configure Browsers
-Playwright can run tests on Chromium, WebKit and Firefox browsers as well as branded browsers such as Google Chrome and Microsoft Edge. It can also run on emulated tablet and mobile devices. See the [registry of device parameters](https://github.com/microsoft/playwright/blob/main/packages/playwright-core/src/server/deviceDescriptorsSource.json) for a complete list of selected desktop, tablet and mobile devices.
+Playwright can run tests on Chromium, WebKit and Firefox browsers as well as branded browsers such as Google Chrome and Microsoft Edge. It can also run on emulated tablet and mobile devices. See the [registry of device parameters](https://github.com/microsoft/playwright/blob/main/packages/isomorphic/deviceDescriptorsSource.json) for a complete list of selected desktop, tablet and mobile devices.
### Run tests on different browsers
diff --git a/java/docs/getting-started-cli.mdx b/java/docs/getting-started-cli.mdx
index 10bd768b9b..7474caea16 100644
--- a/java/docs/getting-started-cli.mdx
+++ b/java/docs/getting-started-cli.mdx
@@ -44,6 +44,12 @@ Coding agents like Claude Code and GitHub Copilot can use locally installed skil
playwright-cli install --skills
```
+To share the skills across all your projects, add the `-g` flag to install them into your home directory (`~/.claude/skills` or, with `--skills=agents`, `~/.agents/skills`):
+
+```bash
+playwright-cli install --skills -g
+```
+
### Skills-less operation
You can also point your agent at the CLI directly and let it discover commands on its own:
@@ -103,7 +109,7 @@ playwright-cli check ][ # check a checkbox or radio button
playwright-cli uncheck ][ # uncheck a checkbox
playwright-cli hover ][ # hover over element
playwright-cli drag # drag and drop between elements
-playwright-cli upload # upload files
+playwright-cli upload # upload one or multiple files
playwright-cli close # close the page
```
diff --git a/java/docs/release-notes.mdx b/java/docs/release-notes.mdx
index e5339534eb..71a83af946 100644
--- a/java/docs/release-notes.mdx
+++ b/java/docs/release-notes.mdx
@@ -9,6 +9,36 @@ import HTMLCard from '@site/src/components/HTMLCard';
import LiteYouTube from '@site/src/components/LiteYouTube';
+## Version 1.62
+
+### 🖼️ WebP screenshots
+
+[Page.screenshot()](/api/class-page.mdx#page-screenshot) and [Locator.screenshot()](/api/class-locator.mdx#locator-screenshot) can now capture screenshots in the WebP format — Playwright infers the format from a `.webp` file extension, or you can set the `type` explicitly. Quality `100` (the default) is lossless, while lower values use lossy compression:
+
+```java
+page.screenshot(new Page.ScreenshotOptions()
+ .setPath(Paths.get("homepage.webp"))
+ .setQuality(50));
+```
+
+### New APIs
+- New `scroll` option (`"auto"` | `"none"`) on actions to opt out of Playwright's automatic scroll-into-view.
+- New [Locator.waitForFunction()](/api/class-locator.mdx#locator-wait-for-function) waits until a function — called with the matching element — returns a truthy value.
+- New [APIResponse.timing()](/api/class-apiresponse.mdx#api-response-timing) returns resource timing information for an API response.
+
+### Announcements
+* 📋 The clipboard is now isolated from the operating system in headless mode, so tests that use `navigator.clipboard` no longer read or overwrite the clipboard of the machine running them.
+* ⚠️ Debian 11 is not supported anymore.
+
+### Browser Versions
+- Chromium 151.0.7922.34
+- Mozilla Firefox 153.0
+- WebKit 26.5
+
+This version was also tested against the following stable channels:
+- Google Chrome 151
+- Microsoft Edge 151
+
## Version 1.61
### 🔑 WebAuthn passkeys
diff --git a/nodejs/docs/api/class-androiddevice.mdx b/nodejs/docs/api/class-androiddevice.mdx
index bb7f8adc5e..49d2a8ed67 100644
--- a/nodejs/docs/api/class-androiddevice.mdx
+++ b/nodejs/docs/api/class-androiddevice.mdx
@@ -287,6 +287,9 @@ await androidDevice.launchBrowser(options);
- `permissions` [Array]<[string]> *(optional)*#
A list of permissions to grant to all pages in this context. See [browserContext.grantPermissions()](/api/class-browsercontext.mdx#browser-context-grant-permissions) for more details. Defaults to none.
+ - `pierceFrames` [boolean] *(optional)*#
+
+ If set to true, all selectors in this context will pierce frames by default, as if every locator was created through [page.pierceFrames()](/api/class-page.mdx#page-pierce-frames). Defaults to `false`.
- `pkg` [string] *(optional)*#
Optional package name to launch instead of default Chrome for Android.
diff --git a/nodejs/docs/api/class-browser.mdx b/nodejs/docs/api/class-browser.mdx
index 686ff72371..f3dc631ddf 100644
--- a/nodejs/docs/api/class-browser.mdx
+++ b/nodejs/docs/api/class-browser.mdx
@@ -325,6 +325,9 @@ If directly using this method to create [BrowserContext]s, it is best practice t
- `permissions` [Array]<[string]> *(optional)*#
A list of permissions to grant to all pages in this context. See [browserContext.grantPermissions()](/api/class-browsercontext.mdx#browser-context-grant-permissions) for more details. Defaults to none.
+ - `pierceFrames` [boolean] *(optional)*#
+
+ If set to true, all selectors in this context will pierce frames by default, as if every locator was created through [page.pierceFrames()](/api/class-page.mdx#page-pierce-frames). Defaults to `false`.
- `proxy` [Object] *(optional)*#
- `server` [string]
@@ -618,6 +621,9 @@ await browser.newPage(options);
- `permissions` [Array]<[string]> *(optional)*#
A list of permissions to grant to all pages in this context. See [browserContext.grantPermissions()](/api/class-browsercontext.mdx#browser-context-grant-permissions) for more details. Defaults to none.
+ - `pierceFrames` [boolean] *(optional)*#
+
+ If set to true, all selectors in this context will pierce frames by default, as if every locator was created through [page.pierceFrames()](/api/class-page.mdx#page-pierce-frames). Defaults to `false`.
- `proxy` [Object] *(optional)*#
- `server` [string]
diff --git a/nodejs/docs/api/class-browsertype.mdx b/nodejs/docs/api/class-browsertype.mdx
index 5e0ff64663..f1eab13e53 100644
--- a/nodejs/docs/api/class-browsertype.mdx
+++ b/nodejs/docs/api/class-browsertype.mdx
@@ -468,6 +468,9 @@ await browserType.launchPersistentContext(userDataDir, options);
- `permissions` [Array]<[string]> *(optional)*#
A list of permissions to grant to all pages in this context. See [browserContext.grantPermissions()](/api/class-browsercontext.mdx#browser-context-grant-permissions) for more details. Defaults to none.
+ - `pierceFrames` [boolean] *(optional)*#
+
+ If set to true, all selectors in this context will pierce frames by default, as if every locator was created through [page.pierceFrames()](/api/class-page.mdx#page-pierce-frames). Defaults to `false`.
- `proxy` [Object] *(optional)*#
- `server` [string]
diff --git a/nodejs/docs/api/class-frame.mdx b/nodejs/docs/api/class-frame.mdx
index e120a0ba6e..468e84de80 100644
--- a/nodejs/docs/api/class-frame.mdx
+++ b/nodejs/docs/api/class-frame.mdx
@@ -924,6 +924,12 @@ const locator = frame.pierceFrames().getByRole('button');
await locator.click();
```
+**Arguments**
+- `options` [Object] *(optional)*
+ - `pierce` [boolean] *(optional)*#
+
+ Whether to pierce frames. Pass `false` to opt out of frame piercing enabled by the [pierceFrames](/api/class-browser.mdx#browser-new-context-option-pierce-frames) context option. Defaults to `true`.
+
**Returns**
- [FrameLocator]#
diff --git a/nodejs/docs/api/class-locator.mdx b/nodejs/docs/api/class-locator.mdx
index b74c62456a..170de900fe 100644
--- a/nodejs/docs/api/class-locator.mdx
+++ b/nodejs/docs/api/class-locator.mdx
@@ -175,6 +175,54 @@ An AI-optimized snapshot, controlled by [mode](/api/class-locator.mdx#locator-ar
---
+### ariaSnapshotJSON {/* #locator-aria-snapshot-json */}
+
+Added in: v1.63locator.ariaSnapshotJSON
+
+Captures the aria snapshot of the given element as a free form JSON object.
+
+**Usage**
+
+```js
+await page.getByRole('list').ariaSnapshotJSON();
+```
+
+**Arguments**
+- `options` [Object] *(optional)*
+ - `boxes` [boolean] *(optional)*#
+
+ When `true`, includes each element's bounding box as a `box` property with `x`, `y`, `width` and `height`. Coordinates are relative to the viewport, in CSS pixels, as returned by [`Element.getBoundingClientRect()`](https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect). Defaults to `false`.
+ - `depth` [number] *(optional)*#
+
+ When specified, limits the depth of the snapshot.
+ - `mode` "ai" | "default" *(optional)*#
+
+ When set to `"ai"`, returns a snapshot optimized for AI consumption. Defaults to `"default"`. See details in [locator.ariaSnapshot()](/api/class-locator.mdx#locator-aria-snapshot).
+ - `signal` [AbortSignal] *(optional)* Added in: v1.62#
+
+ Allows to cancel the operation using an [`AbortSignal`](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal). If the signal is aborted, the operation will be aborted and throw an error. Note that providing a signal does not disable the default timeout, which can be changed using [browserContext.setDefaultTimeout()](/api/class-browsercontext.mdx#browser-context-set-default-timeout) or [page.setDefaultTimeout()](/api/class-page.mdx#page-set-default-timeout); pass `timeout: 0` to disable the timeout entirely.
+ - `timeout` [number] *(optional)*#
+
+ Maximum time in milliseconds. Defaults to `0` - no timeout. The default value can be changed via `actionTimeout` option in the config, or by using the [browserContext.setDefaultTimeout()](/api/class-browsercontext.mdx#browser-context-set-default-timeout) or [page.setDefaultTimeout()](/api/class-page.mdx#page-set-default-timeout) methods.
+
+**Returns**
+- [Promise]<[Serializable]>#
+
+**Details**
+
+This method returns the same tree as [locator.ariaSnapshot()](/api/class-locator.mdx#locator-aria-snapshot), serialized as a JSON value instead of YAML markup. The result is a list of nodes, each node being either a plain string with static text, or an object with the following properties:
+* `role` <[string]> Aria role of the element.
+* `name` <[string]> Accessible name of the element, if any.
+* `text` <[string]> Text content of the element, when it is the only child.
+* `children` <[Array]> Child nodes and text fragments.
+* Boolean and value properties for element state flags: `checked`, `disabled`, `expanded`, `active`, `invalid`, `level`, `pressed` and `selected`.
+* Additional element properties, for example `url` for links and `placeholder` for text boxes.
+* `ref` <[string]> Element reference for AI-optimized snapshots.
+* `cursor` <[string]> Set to `"pointer"` for clickable elements in AI-optimized snapshots.
+* `box` <[Object]> Bounding box of the element when [boxes](/api/class-locator.mdx#locator-aria-snapshot-json-option-boxes) is set.
+
+---
+
### blur {/* #locator-blur */}
Added in: v1.28locator.blur
diff --git a/nodejs/docs/api/class-page.mdx b/nodejs/docs/api/class-page.mdx
index 113d8bcb1e..e22ec51f59 100644
--- a/nodejs/docs/api/class-page.mdx
+++ b/nodejs/docs/api/class-page.mdx
@@ -297,6 +297,42 @@ await page.ariaSnapshot(options);
---
+### ariaSnapshotJSON {/* #page-aria-snapshot-json */}
+
+Added in: v1.63page.ariaSnapshotJSON
+
+Captures the aria snapshot of the page as a free form JSON object. Returns the same tree as [page.ariaSnapshot()](/api/class-page.mdx#page-aria-snapshot), serialized as a JSON value instead of YAML markup. See [locator.ariaSnapshotJSON()](/api/class-locator.mdx#locator-aria-snapshot-json) for the details of the format.
+
+**Usage**
+
+```js
+await page.ariaSnapshotJSON();
+await page.ariaSnapshotJSON(options);
+```
+
+**Arguments**
+- `options` [Object] *(optional)*
+ - `boxes` [boolean] *(optional)*#
+
+ When `true`, includes each element's bounding box as a `box` property with `x`, `y`, `width` and `height`. Coordinates are relative to the viewport, in CSS pixels, as returned by [`Element.getBoundingClientRect()`](https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect). Defaults to `false`.
+ - `depth` [number] *(optional)*#
+
+ When specified, limits the depth of the snapshot.
+ - `mode` "ai" | "default" *(optional)*#
+
+ When set to `"ai"`, returns a snapshot optimized for AI consumption: including element references like `[ref=e2]` and snapshots of `]