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
| ID | Type | Priority | Summary |
|---|---|---|---|
| #3644 | bug | critical | When a keyword fails and presenter_mode is enabled the browser is not closed |
| #5313 | bug | high | New Browser fails with FileNotFoundError for playwright-log.txt when all output files are disabled |
| #5349 | bug | high | Splitting a large response body blocks the Node event loop |
| #5317 | feature | high | Let libraries built on Browser hand over their own BrowserContext |
| #5400 | feature | high | Ship NodeJS 26 LTS in BrowserBatteries |
| #5408 | feature | high | Record keywords in the live browser: Record Keyword and Record Keywords |
| #5410 | feature | high | Extending the selector syntax with frame and label selectors |
| #5411 | feature | high | Rebuild Record Selector on Playwright's element picker and the recorder toolbar |
| #5260 | bug | medium | RF 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 |
| #5302 | bug | medium | Keyword documentation bugs found while translating 20.6.0 |
| #5320 | bug | medium | JavaScript extensions get the string "RESERVED" instead of null or undefined when there is no page, context or browser |
| #5321 | feature | medium | defaultTimeout is a reserved argument name for JavaScript extension keywords |
| #5346 | feature | medium | Support fps and showActions in recordVideo of New Context |
| #5378 | feature | medium | Drop Python 3.10 and support Python 3.11 to 3.15 |
| #5324 | --- | medium | New Persistent Context indexes only the first page, and a failed close leaves the persistent context open |
| #5357 | bug | low | Tracing with tracing_group_mode=Browser fails with IndexError when a context is created from plain Python |
| #5368 | bug | low | Pages that exist when Connect To Browser connects stay in the page stack after they close |
| #5325 | bug | --- | Processes forked after a gRPC channel opens can crash on macOS |
Altogether 18 issues. View on the issue tracker.