BROWSER

Browser 21.0.0

Released November 1, 2026

Playwright
1.64.1
Supports
Python 3.11+, Node 22/24 LTS and Node 26, and Robot Framework 7.1.1+

Most important enhancements

Record keywords in the live browser: Record Keyword and Record Keywords (#5408)

Now can record their interactions in the browser at any point during a test run, naming keywords, turning values into arguments and undoing mistakes as they go, so that they can get reusable User Keywords built from Browser keywords, without whole tests being generated and without translating generated Playwright code.

Let libraries built on Browser hand over their own BrowserContext (#5317)

Playwright can drive more than Chromium, Firefox and WebKit. It can drive Electron applications with playwright._electron, and Chrome on Android devices with playwright._android. Requests to support such platforms in Browser come up again and again in different issues. Each platform needs its own lifecycle, its own test setup and people who know it well. None of that fits into Browser or should land on its maintainers. Now we have opened the Plugin API to build on top of Browser library to support other platforms too. Stay tuned for new libraries in this front.

Splitting a large response body blocks the Node event loop (#5349)

Splitting a large response body blocks the Node event loop was done by one character at the time. With large response this causes blocking operation in the NodeJS side and caused problems with Pabot. Now there is better logic for splitting large response and it should improve the performance of the library

Extending the selector syntax with frame and label selectors (#5410)

we now support >>> id=btn syntax in with the frame locator. See the issue for more details.

Rebuild Record Selector on Playwright's element picker and the recorder toolbar (#5411)

We have enhanced Record Selector feature. There has been several problems with it and we have made several enhancement to the feature. See issue for more details.

Backwards incompatible changes

Ship NodeJS 26 LTS in BrowserBatteries (#5400)

NodeJS 26 moved to LTS and we moved BrowserBatteries to use NodeJS 26 in the BrowserBatteries wheels. This is the main reason to mark this release as Backwards incompatible.

Acknowledgements

When a keyword fails and presenter_mode is enabled the browser is not closed (#3644)

When a keyword fails and presenter_mode is enabled the browser is not closed when the test finishes. he reason is that the keyword Record Selector is called when a keyword fails and presenter_mode is enabled. This is now fixed. Many thanks for Marduk Bolaños reporting the problem and ShryukGrandhi to provide a fix for the bug.

New Browser fails with FileNotFoundError for playwright-log.txt when all output files are disabled (#5313)

If ${OUTPUT_DIR} did not exist, then starting the Browser library would fail in error, this can happen example when output is disabled with these: --output NONE --log NONE --report NONE command line switches. This problem has been reported and fixed by Daniel Biehl

Full list of fixes and enhancements

IDTypePrioritySummary
#3644bugcriticalWhen a keyword fails and presenter_mode is enabled the browser is not closed
#5313bughighNew Browser fails with FileNotFoundError for playwright-log.txt when all output files are disabled
#5349bughighSplitting a large response body blocks the Node event loop
#5317featurehighLet libraries built on Browser hand over their own BrowserContext
#5400featurehighShip NodeJS 26 LTS in BrowserBatteries
#5408featurehighRecord keywords in the live browser: Record Keyword and Record Keywords
#5410featurehighExtending the selector syntax with frame and label selectors
#5411featurehighRebuild Record Selector on Playwright's element picker and the recorder toolbar
#5260bugmediumRF suite/test context in the node logger is module-global, so log lines are attributed to the wrong worker when a node process is shared
#5302bugmediumKeyword documentation bugs found while translating 20.6.0
#5320bugmediumJavaScript extensions get the string "RESERVED" instead of null or undefined when there is no page, context or browser
#5321featuremediumdefaultTimeout is a reserved argument name for JavaScript extension keywords
#5346featuremediumSupport fps and showActions in recordVideo of New Context
#5378featuremediumDrop Python 3.10 and support Python 3.11 to 3.15
#5324---mediumNew Persistent Context indexes only the first page, and a failed close leaves the persistent context open
#5357buglowTracing with tracing_group_mode=Browser fails with IndexError when a context is created from plain Python
#5368buglowPages that exist when Connect To Browser connects stay in the page stack after they close
#5325bug---Processes forked after a gRPC channel opens can crash on macOS

Altogether 18 issues. View on the issue tracker.