🌐 HAR recording on Tracing
tracing.startHar() / tracing.stopHar() expose HAR recording as a first-class tracing API, with the same content, mode and urlFilter options as recordHar. The returned Disposable makes it easy to scope a recording with await using:
await using har = await context.tracing.startHar('trace.har');
const page = await context.newPage();
await page.goto('https://playwright.dev');
// HAR is finalized when `har` goes out of scope.🪝 Drop API
New locator.drop() simulates an external drag-and-drop of files or clipboard-like data onto an element. Playwright dispatches dragenter, dragover, and drop with a synthetic [DataTransfer] in the page context — works cross-browser and is great for testing upload zones:
await page.locator('#dropzone').drop({
files: { name: 'note.txt', mimeType: 'text/plain', buffer: Buffer.from('hello') },
});
await page.locator('#dropzone').drop({
data: {
'text/plain': 'hello world',
'text/uri-list': 'https://example.com',
},
});🎯 Aria snapshots
- expect(page).toMatchAriaSnapshot() now works on a Page, in addition to a Locator — equivalent to asserting against
page.locator('body'). - New
boxesoption on locator.ariaSnapshot() / page.ariaSnapshot() appends each element's bounding box as[box=x,y,width,height], useful for AI consumption.
🛑 test.abort()
New test.abort() aborts the currently running test from a fixture, hook, or route handler with an optional message. Use it when you have detected an unrecoverable misuse and want to fail the test right away:
test('does not publish to the shared page', async ({ page }) => {
await page.route('**/publish', route => {
test.abort('Tests must not publish to the shared page. Use the `clone` option.');
return route.abort();
});
// ...
});New APIs
Browser, Context and Page
- Event browser.on('context') — fired when a new context is created on the browser.
- BrowserContext now mirrors lifecycle events from its pages: browserContext.on('download'), browserContext.on('frameattached'), browserContext.on('framedetached'), browserContext.on('framenavigated'), browserContext.on('pageclose'), browserContext.on('pageload').
Locators and Assertions
- New option
descriptionin page.getByRole() / locator.getByRole() / frame.getByRole() / frameLocator.getByRole() for matching the accessible description. - New option
pseudoin expect(locator).toHaveCSS() reads computed styles from::beforeor::after. - New option
stylein locator.highlight() applies extra inline CSS to the highlight overlay, plus new page.hideHighlight() to clear all highlights.
Network
- webSocketRoute.protocols() returns the WebSocket subprotocols requested by the page.
- New option
noDefaultsin browserType.connectOverCDP() disables Playwright's default overrides on the default context (download behavior, focus emulation, media emulation), so attaching to a user's daily-driver browser doesn't disturb its state.
Errors and Reporting
- New webError.location() mirrors consoleMessage.location().
- consoleMessage.location() now exposes
line/columnproperties (lineNumber/columnNumberare deprecated). - New testInfoError.errorContext surfaces additional diagnostic context, such as the aria snapshot of the receiver at the time of an
expect(...)matcher failure. - reporter.onError() now receives a
workerInfoargument with details about the worker for fixture teardown errors.
Test runner
- New
{testFileBaseName}token in testProject.snapshotPathTemplate — file name without extension. - Test runner now errors when a config tries to override a non-option fixture, and rejects
workers: 0or negative values.
🛠️ Other improvements
- HTML reporter:
npx playwright show-reportaccepts.zipfiles directly — no need to unzip first.- Steps that contain attachments inside nested children show an indicator on the parent step.
- The
repeatEachIndexis shown in the test header when non-zero.
- Trace Viewer adds a pretty-print toggle for JSON / form request and response bodies in the network details panel.
Breaking Changes ⚠️
- Removed long-deprecated APIs:
Locator.ariaRef()— use the standard locator.ariaSnapshot() pipeline.handleoption onBrowserContext.exposeBindingandPage.exposeBinding.loggeroption onBrowserType.connectandBrowserType.connectOverCDP— use tracing instead.- Context options
videosPath/videoSize— userecordVideoinstead.
Browser Versions
- Chromium 148.0.7778.96
- Mozilla Firefox 150.0.2
- WebKit 26.4
This version was also tested against the following stable channels:
- Google Chrome 147
- Microsoft Edge 147