v1.63.0
microsoft/playwrightv1.63.0Sep 4, 2026by yury-s
AI Summary
This release introduces test locks to prevent concurrency on shared resources, enhances frame locating capabilities, and adds Aria and screen snapshots to tracing. It also expands HTTP credential handling and introduces new reporter options like Perfetto.
Key Highlights
- Test Locks: Tests can declare named locks to prevent concurrent execution on shared resources.
- Locate across frames: `page.frameLocator()` now searches across frames without needing a selector.
- Visible-only locators: New `locator.visible()` method for matching only visible elements.
- Enhanced Tracing: Aria and screen snapshots can now be captured alongside DOM snapshots.
- New Reporter: The `perfetto` reporter is added for timeline visualization.
Breaking Changes
- Ubuntu 20.04 is no longer supported.
New Features
- Test locks for concurrent test execution control.
- Locate across frames functionality for `page.frameLocator()`.
- Visible-only locators using `locator.visible()`.
- Step params and subtitles for `test.step()`.
- Aria and screen snapshots in traces.
- HTTP credentials now accept an array of credentials.
- OPFS (Origin Private File System) support in storage state.
- New `dialogclosed` events for pages and browser contexts.
- Type support for API request contexts.
- New `perfetto` reporter for timeline rendering.
- New CLI options like `--add-reporter` and `--no-remove`.
- Reduced motion and forced colors test options.
Full Release Notes
## ๐ Test locks
Tests that access a shared resource โ an external service, a global account setting โ can now declare a named `lock`.
Tests that share a lock name never run concurrently, across files, workers and [projects](https://playwright.dev/docs/test-projects), while
everything else keeps running in parallel:
```js
test('update user settings', { lock: 'user-settings' }, async ({ page }) => {
// never runs at the same time as other tests holding 'user-settings'
});
```
A test can hold multiple locks, and [test.describe()](https://playwright.dev/docs/api/class-test#test-describe) accepts a `lock` for the whole group.
Learn more about [test locks](https://playwright.dev/docs/test-parallel#test-locks).
## ๐ช Locate across frames
[page.frameLocator()](https://playwright.dev/docs/api/class-page#page-frame-locator) and [frame.frameLocator()](https://playwright.dev/docs/api/class-frame#frame-frame-locator) called without a selector search in any frame of the
subtree, so you no longer need to locate the iframe first:
```js
// Finds the button in any frame on the page.
await page.frameLocator().getByRole('button').click();
```
The rest of the locator resolves inside a single frame, just like a regular locator, and an error is thrown when it
matches elements in several frames.
## ๐๏ธ Visible-only locators
New [locator.visible()](https://playwright.dev/docs/api/class-locator#locator-visible) returns a locator that matches only visible elements. It is the recommended
replacement for the `:visible` CSS pseudo-class:
```js
await page.locator('button').visible().click();
```
## ๐งพ Step params and subtitles
Steps now carry structured data for reporters. Playwright API steps report the target locator and call arguments,
and [test.step()](https://playwright.dev/docs/api/class-test#test-step) accepts `subtitle` and `params` options for your own steps:
```js
await test.step('Login', async () => {
// ...
}, { subtitle: 'as admin', params: { user: 'admin' } });
```
Reporters receive them via [testStep.subtitle](https://playwright.dev/docs/api/class-teststep#test-step-subtitle) and [testStep.params](https://playwright.dev/docs/api/class-teststep#test-step-params). For Playwright API
steps, the subtitle is the locator or the navigation url โ for example, `Click` with subtitle `getByRole('button')`.
Both are rendered next to the step title in the trace viewer and the HTML report.
## ๐ผ๏ธ Aria and screen snapshots in traces
The `snapshots` option of [tracing.start()](https://playwright.dev/docs/api/class-tracing#tracing-start) and the [testOptions.trace](https://playwright.dev/docs/api/class-testoptions#test-options-trace) fixture option now accept an
object selecting what to capture on every action:
```js
// playwright.config.ts
export default defineConfig({
use: {
trace: {
mode: 'on',
snapshots: { dom: true, aria: true, screen: true }
},
},
});
```
With aria and screen snapshots recorded, the new **Display Aria** mode in the trace viewer shows the action screenshot
side by side with the aria snapshot, and hovering an aria node highlights it on the screenshot.
## New APIs
### Browser and Context
- [`httpCredentials`](https://playwright.dev/docs/api/class-browser#browser-new-context-option-http-credentials) now also accepts an array of credentials. The first entry matching the request origin is used, and entries without an origin match any request.
- New option [`opfs`](https://playwright.dev/docs/api/class-browsercontext#browser-context-storage-state-option-opfs) includes the [origin private file system](https://developer.mozilla.org/en-US/docs/Web/API/File_System_API/Origin_private_file_system) in the storage state, so it can be persisted and restored into later contexts.
- New events [page.on('dialogclosed')](https://playwright.dev/docs/api/class-page#page-event-dialog-closed) and [browserContext.on('dialogclosed')](https://playwright.dev/docs/api/class-browsercontext#browser-context-event-dialog-closed) are emitted when a JavaScript dialog is accepted, dismissed or closed by the user.
### Locators
- New [locator.ariaSnapshotJSON()](https://playwright.dev/docs/api/class-locator#locator-aria-snapshot-json) and [page.ariaSnapshotJSON()](https://playwright.dev/docs/api/class-page#page-aria-snapshot-json) return the aria snapshot as a JSON value instead of YAML markup, with `mode`, `depth` and `boxes` options.
- [apiRequestContext.get()](https://playwright.dev/docs/api/class-apirequestcontext#api-request-context-get) and other request methods accept a type argument that types the response `json()`:
```js
const response = await request.get<User>('/api/users/42');
const user = await response.json(); // typed as User
```
### Test runner
- New standalone [testOptions.reducedMotion](https://playwright.dev/docs/api/class-testoptions#test-options-reduced-motion), [testOptions.forcedColors](https://playwright.dev/docs/api/class-testoptions#test-options-forced-colors) and [testOptions.contrast](https://playwright.dev/docs/api/class-testoptions#test-options-contrast) options.
- New `--add-reporter` command line option appends a reporter on top of the ones configured in `playwright.config`, instead of replacing them like `--reporter` does.
- New `omitTags` option for the `list`, `line`, `dot`, `github` and `junit` reporters suppresses the tags that are automatically appended to test titles.
### Command line
- `npx playwright install --no-remove` keeps the browsers of other Playwright installations instead of removing them.
- `npx playwright codegen --http-credentials` records against pages behind HTTP authentication.
### Miscellaneous
- New built-in [`perfetto`](https://playwright.dev/docs/test-reporters#perfetto-reporter) reporter writes a Trace Event Format file for the [Perfetto UI](https://ui.perfetto.dev) or `chrome://tracing`, rendering the test run as a timeline with a lane per worker.
- The HTML report renders a duration waterfall next to test steps.
## Announcements
* โ ๏ธ The experimental `@playwright/experimental-ct-react`, `@playwright/experimental-ct-react17` and `@playwright/experimental-ct-vue` packages will no longer be updated. Follow the [migration guide](https://playwright.dev/docs/test-components#migration-from-the-experimental-packages) to move to the stories model introduced in 1.62. Story ids passed to [fixtures.mount()](https://playwright.dev/docs/api/class-fixtures#fixtures-mount) can now be typed through the generated `Stories` registry.
* โ ๏ธ Ubuntu 20.04 is not supported anymore.
* ๐ง On Linux arm64, Playwright now downloads the [Chrome for Testing](https://developer.chrome.com/blog/chrome-for-testing) build of Chromium, the same build used on all other platforms.
## Browser Versions
- Chromium 153.0.8010.12
- Mozilla Firefox 155.0
- WebKit 26.6
This version was also tested against the following stable channels:
- Google Chrome 153
- Microsoft Edge 153