You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Python users can now use Selenium Manager on Windows ARM64 systems via emulation rather than raising, matching the other four bindings
We've been going back and forth on naming; this consolidates on arm64 over aarch64 everywhere we choose a name.
🔧 Implementation Notes
arm64 over aarch64: NuGet's runtimes/linux-arm64/ is a shipped path we cannot rename, so aarch64 would guarantee two spellings in published artifacts while arm64 allows one. This also matches our telemetry which consolidated on arm64. aarch64 remains only in values we read.
Binaries move to linux-x86_64/ and linux-arm64/; macos/ and windows/ stay unqualified because each ships a single binary. .NET uses runtimes/linux-x64/ and runtimes/linux-arm64/ — NuGet Runtime Identifiers, and linux-musl-x64 resolves through them.
Verified on an ubuntu-24.04-arm runner: the driver_finder specs resolve bin/linux-arm64/selenium-manager, execute it, and download working drivers for Firefox, and for Chrome with [rust] Add support for Chrome arm64 on Linux #17915 applied.
CI display setup was gated on inputs.os == 'ubuntu', which skipped ubuntu-24.04-arm; it now uses contains.
🤖 AI assistance
AI assisted (complete below)
Tool(s): Claude Code (Opus 5)
What was generated: the build wiring, binding changes, the arm64 CI verification, and this description
I reviewed all AI output and can explain the change
💡 Additional Considerations
common/selenium_manager.bzl still pins the old artifact names; I'll run ./go update_manager and commit the regenerated pins after ci-rust workflow runs from the trunk merge.
• Bundles native Linux arm64 Selenium Manager binaries across all language bindings.
• Selects architecture-specific Linux binaries while retaining Windows arm64 emulation.
• Standardizes artifact naming and enables Ubuntu ARM CI setup and verification.
The following are alternative approaches to this PR:
1. Download binaries on demand
➕ Reduces binding package sizes
➕ Allows architecture support without republishing every binding
➖ Introduces a network dependency before Selenium Manager can run
➖ Weakens offline operation and packaged-version reproducibility
➖ Adds download, verification, caching, and failure-handling logic to every binding
2. Publish architecture-specific binding packages
➕ Each installation contains only its required native binary
➕ Avoids runtime architecture selection
➖ Fragments releases and package coordinates across ecosystems
➖ Complicates dependency resolution and migration for users
➖ Is not consistently supported by all five binding package managers
Recommendation: Bundling both Linux binaries in each existing binding package is the best approach. It preserves offline and deterministic behavior, keeps package identities stable, and follows existing Selenium Manager distribution patterns; the package-size increase is preferable to cross-ecosystem package fragmentation or bootstrap downloads.
Files changed (26) +236 / -133
Enhancement (15) +116 / -46
BUILD.bazelExpose separate Linux manager aliases+11/-3
Expose separate Linux manager aliases
• Splits the generic Linux alias into x86_64 and arm64 targets, each selecting its corresponding pinned download or Rust build.
selenium_manager.pyResolve arm64 Linux and Windows binaries+8/-3
Resolve arm64 Linux and Windows binaries
• Maps Linux and BSD aarch64 hosts to the arm64 binary and x86_64 hosts to the renamed x86_64 directory. Windows and Cygwin arm64 now use the x86_64 Windows binary through emulation.
• Refactors repeated platform aliases into a generated list and adds separate Linux arm64 and x86_64 targets. Matching hosts use local builds while other hosts use pinned artifacts.
• Updates expected x86_64 paths and verifies Linux aarch64 resolves the native arm64 binary. Changes Windows arm64 coverage from expecting an error to expecting the emulated Windows binary.
ci-rust.ymlPublish architecture-qualified Linux artifacts+11/-11
Publish architecture-qualified Linux artifacts
• Renames Linux release and debug artifacts to explicit 'x86_64' and 'arm64' variants. Updates checksums, release metadata, and uploaded paths to use the standardized names.
• Adds a dedicated Linux arm64 download repository and renames the x86_64 repository. Refreshes Selenium Manager binary, SBOM, and notice URLs and checksums to a newer artifact release.
1. Linux ARM users remain unsupported✗ Dismissed🐞 Bug≡ Correctness⭐ New
Description
_get_binary() maps Linux ARM only when platform.machine().lower() is exactly aarch64, while
its exact lookup has no arm64 alias. A Linux ARM64 interpreter reporting arm64 therefore reaches
the unsupported platform/architecture exception instead of the packaged linux-arm64 manager,
despite that spelling already being accepted for Windows and Cygwin.
The selection table provides Linux ARM64 only for aarch64, and the normalization step aliases only
amd64; consequently an arm64 value cannot match the Linux entry and the absent lookup raises.
The same changed table demonstrates that arm64 is a recognized architecture spelling for other
platforms.
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution
## Issue description
Normalize `arm64` and `aarch64` to the same Python architecture before Selenium Manager binary lookup, so Linux ARM64 installations select the packaged ARM64 executable regardless of their reported spelling.
## Issue Context
The lookup is exact after lowercasing `platform.machine()`. The new Linux mapping contains only `aarch64`, while the same table explicitly accepts `arm64` for Windows and Cygwin.
## Fix Focus Areas
- py/selenium/webdriver/common/selenium_manager.py[93-101]
- py/test/unit/selenium/webdriver/common/selenium_manager_tests.py[77-82]
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
2. Maintainers miss binary routing bugs 📘 Rule violation☼ Reliability
Description
The .NET linuxRid selector and JavaScript getBinary() add architecture-dependent Linux paths
without focused tests for either route. Because the ARM runner only builds or tests Rust,
regressions in these binding-specific decisions can merge without exercising their native
architecture mappings.
PR Compliance ID 5 requires focused coverage for changed behavior. The cited production regions
introduce architecture-dependent binary routing, while repository searches found no .NET or
JavaScript tests for those mappings, and the ARM CI job cited below runs only Rust tests.
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution
## Issue description
Add focused tests for the new Linux architecture-to-directory selection in the .NET and JavaScript bindings.
## Issue Context
Python and Ruby have focused tests for both x86_64 and ARM64 routing, but repository searches found no equivalent coverage for these selectors. The ARM CI jobs only build or test Rust and therefore do not exercise these binding-specific decisions.
## Fix Focus Areas
- dotnet/src/webdriver/Manager/SeleniumManager.cs[135-143]
- javascript/selenium-webdriver/common/seleniumManager.js[38-43]
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
3. Linux .NET tests lose the manager✓ Resolved🐞 Bug≡ Correctness
Description
EnvironmentManager still looks up the removed manager/linux/selenium-manager runfile even though
the Bazel test data now stages only manager/linux-arm64/selenium-manager and
manager/linux-x86_64/selenium-manager; the resulting missing-runfile exception is caught, leaving
SE_MANAGER_PATH unset rather than pointing to the supplied manager. Every Bazel-driven .NET
WebDriver test that creates a local driver on Linux reaches this path, after which SeleniumManager
probes only application and assembly locations and never inspects the architecture-specific Bazel
test data paths.
The changed Bazel outputs replace the generic Linux manager runfile with architecture-qualified
targets, while the shared test bootstrap continues requesting the deleted generic path. That lookup
raises a missing-runfile exception which is swallowed, so no explicit SE_MANAGER_PATH override is
established; the production resolver then falls back to application- and assembly-directory probing,
neither of which covers the architecture-specific manager files staged as Bazel test data.
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution
## Issue description
Update the .NET test environment’s Selenium Manager runfile lookup because the Bazel test data now stages architecture-qualified Linux manager paths while `EnvironmentManager` still requests the deleted `manager/linux/selenium-manager` path. The resulting `FileNotFoundException` is swallowed, leaving `SE_MANAGER_PATH` unset and forcing unrelated fallback probing.
## Issue Context
Select `manager/linux-arm64/selenium-manager` or `manager/linux-x86_64/selenium-manager` according to the process architecture, matching the newly staged Bazel targets. Ensure Linux Bazel tests set `SE_MANAGER_PATH` to the supplied architecture-specific runfile rather than relying on application- or assembly-directory fallback locations.
## Fix Focus Areas
- dotnet/test/webdriver/BUILD.bazel[11-12]
- dotnet/src/webdriver/BUILD.bazel[153-162]
- dotnet/test/webdriver/Infrastructure/Environment/EnvironmentManager.cs[91-110]
- dotnet/test/webdriver/Infrastructure/Environment/EnvironmentManager.cs[101-115]
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
View high (1) 4. A redundant comment adds no rationale✓ Resolved📘 Rule violation⚙ Maintainability
Description
common/BUILD.bazel labels the generated settings with # Per-(OS, arch) host config_settings.,
which only paraphrases the comprehension immediately below it. Because the list and generated names
already expose both dimensions, later readers gain no rationale or constraint from the comment and
must maintain redundant prose.
Compliance rule 6 requires comments to explain rationale or non-obvious constraints rather than
paraphrase implementation. The added comment at line 44 merely names the operating-system and
architecture settings visibly generated by lines 45 onward.
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution
## Issue description
Remove the comment that merely restates the generated host configuration settings.
## Issue Context
The comprehension and its platform list already communicate that the settings combine operating system and architecture, so the comment supplies no rationale or non-obvious constraint.
## Fix Focus Areas
- common/BUILD.bazel[44-44]
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
5. Some Java ARM users get x86 code✓ Resolved🐞 Bug≡ Correctness
Description
getBinary() recognizes only an os.arch value containing aarch64 as ARM64 and sends every other
Linux architecture to linux-x86_64. Linux JVMs reporting an existing ARM identifier such as arm,
or the alternate arm64 spelling, therefore receive an incompatible executable instead of the ARM64
binary or the previous unsupported-platform error.
The new binary-selection ternary defaults every value except aarch64 to x86_64, while the
repository's Java architecture model explicitly includes arm as an ARM identifier. The package
contains separate x86_64 and ARM64 executables, so selecting the default is operational rather than
merely a naming discrepancy.
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution
## Issue description
Java's Linux manager selection treats only `aarch64` as ARM64 and defaults all other architecture strings to x86_64, including recognized or alternate ARM identifiers.
## Issue Context
Normalize supported 64-bit ARM spellings to `linux-arm64`, retain `linux-x86_64` for known x86_64 spellings, and reject unsupported architectures such as 32-bit ARM rather than executing an incompatible binary. Add tests for `aarch64`, `arm64`, x86_64, and 32-bit ARM values.
## Fix Focus Areas
- java/src/org/openqa/selenium/manager/SeleniumManager.java[211-226]
- java/src/org/openqa/selenium/Architecture.java[48-60]
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
Review mode: 🧠 Deep: This push changes platform selection and packaged binaries across multiple bindings, build systems, CI workflows, and tests, creating many independent cross-platform paths where redundant review could catch subtle omissions.
Tip of the day
💡 Did you know, you can tweak Display preferences with a live preview to see your comment before it ships
1. Linux .NET tests lose the manager✓ Resolved🐞 Bug≡ Correctness
Description
EnvironmentManager still looks up the removed manager/linux/selenium-manager runfile even though
the Bazel test data now stages only manager/linux-arm64/selenium-manager and
manager/linux-x86_64/selenium-manager; the resulting missing-runfile exception is caught, leaving
SE_MANAGER_PATH unset rather than pointing to the supplied manager. Every Bazel-driven .NET
WebDriver test that creates a local driver on Linux reaches this path, after which SeleniumManager
probes only application and assembly locations and never inspects the architecture-specific Bazel
test data paths.
The changed Bazel outputs replace the generic Linux manager runfile with architecture-qualified
targets, while the shared test bootstrap continues requesting the deleted generic path. That lookup
raises a missing-runfile exception which is swallowed, so no explicit SE_MANAGER_PATH override is
established; the production resolver then falls back to application- and assembly-directory probing,
neither of which covers the architecture-specific manager files staged as Bazel test data.
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution
## Issue description
Update the .NET test environment’s Selenium Manager runfile lookup because the Bazel test data now stages architecture-qualified Linux manager paths while `EnvironmentManager` still requests the deleted `manager/linux/selenium-manager` path. The resulting `FileNotFoundException` is swallowed, leaving `SE_MANAGER_PATH` unset and forcing unrelated fallback probing.
## Issue Context
Select `manager/linux-arm64/selenium-manager` or `manager/linux-x86_64/selenium-manager` according to the process architecture, matching the newly staged Bazel targets. Ensure Linux Bazel tests set `SE_MANAGER_PATH` to the supplied architecture-specific runfile rather than relying on application- or assembly-directory fallback locations.
## Fix Focus Areas
- dotnet/test/webdriver/BUILD.bazel[11-12]
- dotnet/src/webdriver/BUILD.bazel[153-162]
- dotnet/test/webdriver/Infrastructure/Environment/EnvironmentManager.cs[91-110]
- dotnet/test/webdriver/Infrastructure/Environment/EnvironmentManager.cs[101-115]
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
2. A redundant comment adds no rationale✓ Resolved📘 Rule violation⚙ Maintainability
Description
common/BUILD.bazel labels the generated settings with # Per-(OS, arch) host config_settings.,
which only paraphrases the comprehension immediately below it. Because the list and generated names
already expose both dimensions, later readers gain no rationale or constraint from the comment and
must maintain redundant prose.
Compliance rule 6 requires comments to explain rationale or non-obvious constraints rather than
paraphrase implementation. The added comment at line 44 merely names the operating-system and
architecture settings visibly generated by lines 45 onward.
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution
## Issue description
Remove the comment that merely restates the generated host configuration settings.
## Issue Context
The comprehension and its platform list already communicate that the settings combine operating system and architecture, so the comment supplies no rationale or non-obvious constraint.
## Fix Focus Areas
- common/BUILD.bazel[44-44]
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
3. Some Java ARM users get x86 code✓ Resolved🐞 Bug≡ Correctness
Description
getBinary() recognizes only an os.arch value containing aarch64 as ARM64 and sends every other
Linux architecture to linux-x86_64. Linux JVMs reporting an existing ARM identifier such as arm,
or the alternate arm64 spelling, therefore receive an incompatible executable instead of the ARM64
binary or the previous unsupported-platform error.
The new binary-selection ternary defaults every value except aarch64 to x86_64, while the
repository's Java architecture model explicitly includes arm as an ARM identifier. The package
contains separate x86_64 and ARM64 executables, so selecting the default is operational rather than
merely a naming discrepancy.
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution
## Issue description
Java's Linux manager selection treats only `aarch64` as ARM64 and defaults all other architecture strings to x86_64, including recognized or alternate ARM identifiers.
## Issue Context
Normalize supported 64-bit ARM spellings to `linux-arm64`, retain `linux-x86_64` for known x86_64 spellings, and reject unsupported architectures such as 32-bit ARM rather than executing an incompatible binary. Add tests for `aarch64`, `arm64`, x86_64, and 32-bit ARM values.
## Fix Focus Areas
- java/src/org/openqa/selenium/manager/SeleniumManager.java[211-226]
- java/src/org/openqa/selenium/Architecture.java[48-60]
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
1. Maintainers miss binary routing bugs 📘 Rule violation☼ Reliability
Description
The .NET linuxRid selector and JavaScript getBinary() add architecture-dependent Linux paths
without focused tests for either route. Because the ARM runner only builds or tests Rust,
regressions in these binding-specific decisions can merge without exercising their native
architecture mappings.
PR Compliance ID 5 requires focused coverage for changed behavior. The cited production regions
introduce architecture-dependent binary routing, while repository searches found no .NET or
JavaScript tests for those mappings, and the ARM CI job cited below runs only Rust tests.
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution
## Issue description
Add focused tests for the new Linux architecture-to-directory selection in the .NET and JavaScript bindings.
## Issue Context
Python and Ruby have focused tests for both x86_64 and ARM64 routing, but repository searches found no equivalent coverage for these selectors. The ARM CI jobs only build or test Rust and therefore do not exercise these binding-specific decisions.
## Fix Focus Areas
- dotnet/src/webdriver/Manager/SeleniumManager.cs[135-143]
- javascript/selenium-webdriver/common/seleniumManager.js[38-43]
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
B-buildIncludes scripting, bazel and CI integrationsB-managerSelenium ManagerC-dotnet.NET BindingsC-javaJava BindingsC-nodejsJavaScript BindingsC-pyPython BindingsC-rbRuby BindingsC-rustRust code is mostly Selenium Manager
2 participants
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
🔗 Related Issues
Ships the binary added in #16045
💥 What does this PR do?
arm64overaarch64everywhere we choose a name.🔧 Implementation Notes
arm64overaarch64: NuGet'sruntimes/linux-arm64/is a shipped path we cannot rename, soaarch64would guarantee two spellings in published artifacts whilearm64allows one. This also matches our telemetry which consolidated on arm64.aarch64remains only in values we read.linux-x86_64/andlinux-arm64/;macos/andwindows/stay unqualified because each ships a single binary. .NET usesruntimes/linux-x64/andruntimes/linux-arm64/— NuGet Runtime Identifiers, andlinux-musl-x64resolves through them.ubuntu-24.04-armrunner: thedriver_finderspecs resolvebin/linux-arm64/selenium-manager, execute it, and download working drivers for Firefox, and for Chrome with [rust] Add support for Chrome arm64 on Linux #17915 applied.inputs.os == 'ubuntu', which skippedubuntu-24.04-arm; it now usescontains.🤖 AI assistance
💡 Additional Considerations
common/selenium_manager.bzlstill pins the old artifact names; I'll run./go update_managerand commit the regenerated pins after ci-rust workflow runs from the trunk merge.🔄 Types of changes