Selenium 4.47 Released!
Categories:
We’re excited to announce the release of Selenium 4.47 for JavaScript, Ruby, Python, .NET, Java and the Grid! 🎉
Links to all assets can be found on our downloads page.
Selenium 4.47 Released
✨ Highlights
- BiDi Continued unifying the BiDi protocol layer across bindings around the shared, binding-neutral CDDL-derived schema — Ruby now generates its BiDi domain type accessors, union variant factories, and typed errors from it, matching JavaScript’s earlier adoption.
- [Java] Removed the redundant BiDi subscription scope tracking and fixed BiDi not
initializing for
RemoteWebDriverbuilt via the builder. - [.NET] BiDi transport factories are now composable, the optional command timeout was removed from command options, and spurious warnings when there are no BiDi subscribers are gone.
- [.NET][Python][Ruby] Firefox now blocks CDP access, reinforcing BiDi as the standard cross-browser protocol.
- [Grid] Dynamic Grid videos are now consistently stored in a per-session subfolder via
SE_VIDEO_SESSION_SUBFOLDER, including on Kubernetes, removing the previous pod-wait and relocation logic. - [Java] Fixed
By.className()/By.id()misescaping non-ASCII leading digits, and aBy.name()doubleString.formatbug on names containing%. - [Rust] Selenium Manager fixes: honors
--browser-versionfor Electron driver resolution, locates Chrome and Edge in known install directories, and no longer caches an empty driver version.
📦 Notable Changes
Java
- Removed the redundant BiDi subscription scope tracking, and fixed BiDi not initializing for
RemoteWebDriverbuilt via the builder. - Fixed
By.className()/By.id()misescaping non-ASCII leading digits, and aBy.name()doubleString.formatbug on names containing%. - Added regression coverage for relative locators on collapsed table borders.
- Removed deprecated FTP proxy support and deprecated invalid Firefox profile code (shared with JavaScript, Ruby, and .NET).
Python
- Blocked CDP access with Firefox (shared with .NET and Ruby).
- Fixed
no_proxymatching so empty entries and substrings no longer bypass the proxy. find_element/find_elementstype hints now acceptBy.- Ensured driver service subprocess resources are cleaned up.
- Fixed the default
command_executorURL in theRemoteWebDriverdocstring.
Ruby
- Generated the BiDi domain type accessors, union variant factories, and typed WebDriver errors from the shared binding-neutral schema.
- Constructed the BiDi transport inside the domain from a connection, and routed BiDiBridge
navigation through the generated
Protocol::BrowsingContext. - Added inbound/outbound validation for BiDi fields, including nullable-constant params, ref fields, and float/enum type fidelity.
- Added support for WebDriver BiDi on Safari Preview, moving
#bidiontoDriver. - Added a
browser_familytest guard, and support for custom vendor-specific capabilities in options classes.
.NET
- Made BiDi transport factories composable.
- Removed the optional command timeout from command options, and stopped warning when there are no BiDi subscribers.
- Added support for
SE_*DRIVERenvironment variables to set driver locations. - Blocked CDP access with Firefox (shared with Python and Ruby).
Grid
- Store Dynamic Grid videos in a per-session subfolder via
SE_VIDEO_SESSION_SUBFOLDER, including on Kubernetes, removing the previous pod-wait and relocation logic. - Inherited the Node Pod container’s
securityContextfor Dynamic Grid on Kubernetes. - Honored client-advertised
se:remoteUrlfor reachable BiDi/CDP/VNC URLs.
Build & Infra
- Continued the BiDi schema unification: merged vendor CDDL files into the shared schema, derived per-type inbound/outbound directionality, and cleaned up schema generation.
- Published a Selenium 5 release charter and an ADR documenting BiDi implementation boundaries.
- Generated a cross-platform Selenium Manager SBOM and NOTICE, bundled into each package.
- Bumped Rust build tooling (
@llvm,rules_rs,rules_ruby) and updated Node.js versioning for testing and publishing.
🐳 Docker Selenium
- Docker: Support Google Chrome images for linux/arm64 (#3187)
- [build] Keep Chrome dev/beta images on linux/amd64 only, resolve the latest rclone tag (#3188)
- [video] Fall back to SE_NODE_CONTAINER_NAME for the per-session subfolder (#3194)
- K8s: Implement KEDA external scaler and use it as default (#3169)
- K8s: Gate distributed component replicas on external datastore (#3175)
- See all changes
We thank all our contributors for their incredible efforts in making Selenium better with every release. ❤️
For a detailed look at all changes, check out the release notes.
Contributors
Special shout-out to everyone who helped the Selenium Team get this release out!
Selenium
Mathias Paulenko Echeverz
Mohab Mohie
Dennis Ameling
Gaurav Dubey
VIPUL TRIPATHI
Selenium Docs & Website
David Constantin Damian
Ajith KV
Ivan Trechekas
Ujjwal Kumar Singh
David Winiecki
halex2005
Noritaka Kobayashi
Pablo Martinez
Selenium Team Members
Thanks as well to all the team members who contributed to this release:
ian zhang
David Burns
Boni García
Corey Goldberg
Diego Molina
Navin Chandra
Nikolay Borisenko
Puja Jagani
Titus Fortner
Viet Nguyen Duc
Stay tuned for updates by following SeleniumHQ on:
Happy automating!




