Nightly
- 8d1433a: [py]: Apply ClientConfig
user_agentandextra_headersper connection (#17944) (Navin Chandra) #17944 - da30f92: [build] add bazel flag to support cross-compiling all Selenium Manager binaries from Linux or Mac (#18029) (Titus Fortner) #18029
- e5fc773: [build] Automated Selenium Manager Update (Selenium CI Bot)
- f9c29f7: [build] only flag major browser bumps for stable pins, not beta (Titus Fortner)
- 071b77c: [build] skip the affected-target job when every target runs anyway (Titus Fortner)
- 4a2ca99: [build] use --build_tests_only for all Ruby CI test jobs (Titus Fortner)
- 6c63e70: [rb] render WebSocket debug log lines lazily (#18033) (Ikraam Ghoor) #18033
- 7f06065: [build] fail release workflows for unauthorized actors instead of requesting approval (Titus Fortner)
- d32c5f2: [rb] Implement driver methods for installing and uninstalling web extensions via BiDi (#17879) (Titus Fortner) #17879
- 2120564: [build] remove the Unlock Trunk workflow; Manage Trunk Restrictions now unlocks by default when dispatched (Titus Fortner)
v1.63.0
page.frameLocator() and frame.frameLocator() called without a selector search in any frame of the subtree, so you no longer need to locate the iframe first:
// Finds the button in any frame on the page.
page.frameLocator().getByRole(AriaRole.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.
New locator.visible() returns a locator that matches only visible elements. It is the recommended replacement for the :visible CSS pseudo-class:
page.locator("button").visible().click();
New ariaSnapshots and screenSnapshots options of tracing.start() capture an aria snapshot and a screenshot of the page on every action:
context.tracing().start(new Tracing.StartOptions()
.setSnapshots(true)
.setAriaSnapshots(true)
.setScreenSnapshots(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.
The public API is now annotated with JSpecify nullability annotations. The com.microsoft.playwright, com.microsoft.playwright.options and com.microsoft.playwright.assertions packages are @NullMarked, and values that can be absent are marked @Nullable, so null-checking tools such as NullAway, as well as Kotlin code, can catch missing null checks at compile time.
httpCredentialsnow also accepts a list of credentials. The first entry matching the request origin is used, and entries without an origin match any request.- New option
opfsincludes the origin private file system in the storage state, so it can be persisted and restored into later contexts. - New events page.onDialogClosed() and browserContext.onDialogClosed() are emitted when a JavaScript dialog is accepted, dismissed or closed by the user.
mvn exec:java -e -D exec.mainClass=com.microsoft.playwright.CLI -D exec.args="install --no-remove"keeps the browsers of other Playwright installations instead of removing them.mvn exec:java -e -D exec.mainClass=com.microsoft.playwright.CLI -D exec.args="codegen --http-credentials"records against pages behind HTTP authentication.
⚠️ Ubuntu 20.04 is not supported anymore.- 🐧 On Linux arm64, Playwright now downloads the Chrome for Testing build of Chromium, the same build used on all other platforms.
- 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
Byte Buddy 1.18.14
- Avoid exposure of the agent argument on the command line of the process that is spawned for an external attachment.
- Avoid the resolution of symbolic links when the Gradle plugin deletes a folder recursively.
- Limit the nesting depth that is accepted when parsing a generic type signature to avoid an exhaustion of the stack for a malformed class file.
- Sign all deployed files using sigstore, in addition to the existing GPG signature.
- Validate entry names when the Android plugin retains a file to avoid the propagation of path traversals.