What’s New

Playwright v1.60.0

v1.60.0
Added
  • Add tracing.startHar() and tracing.stopHar() to expose HAR recording as a first-class tracing API
  • Add locator.drop() to simulate external drag-and-drop of files or clipboard-like data onto an element
  • Add expect(page).toMatchAriaSnapshot() to work on a Page in addition to a Locator
  • Add boxes option on locator.ariaSnapshot() and page.ariaSnapshot() to append each element's bounding box
  • Add test.abort() to abort the currently running test from a fixture, hook, or route handler
  • Add browser.on('context') event fired when a new context is created on the browser
  • Add lifecycle events to BrowserContext: browserContext.on('download'), browserContext.on('frameattached'), browserContext.on('framedetached'), browserContext.on('framenavigated'), browserContext.on('pageclose'), browserContext.on('pageload')
  • Add description option in page.getByRole(), locator.getByRole(), frame.getByRole(), and frameLocator.getByRole()
  • Add pseudo option in expect(locator).toHaveCSS() to read computed styles from ::before or ::after
  • Add style option in locator.highlight() to apply extra inline CSS to the highlight overlay
  • Add page.hideHighlight() to clear all highlights
  • Add webSocketRoute.protocols() to return the WebSocket subprotocols requested by the page
  • Add noDefaults option in browserType.connectOverCDP() to disable Playwright's default overrides on the default context
  • Add webError.location() to mirror consoleMessage.location()
  • Add testInfoError.errorContext to surface additional diagnostic context such as the aria snapshot of the receiver at the time of an expect(...) matcher failure
Changed
  • consoleMessage.location() now exposes line and column properties
Deprecated
  • consoleMessage.location() properties lineNumber and columnNumber are deprecated
🌐 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
🛑 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
Locators and Assertions
Network
  • webSocketRoute.protocols() returns the WebSocket subprotocols requested by the page.
  • New option noDefaults in 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
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: 0 or negative values.
🛠️ Other improvements
  • HTML reporter:
    • npx playwright show-report accepts .zip files directly — no need to unzip first.
    • Steps that contain attachments inside nested children show an indicator on the parent step.
    • The repeatEachIndex is 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.
    • handle option on BrowserContext.exposeBinding and Page.exposeBinding.
    • logger option on BrowserType.connect and BrowserType.connectOverCDP — use tracing instead.
    • Context options videosPath / videoSize — use recordVideo instead.
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
View original