Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
f233b6b
[rust] Enable tests in GitHub Actions on Linux arm64
dennisameling Jul 12, 2025
ddc3c86
[rust] Selenium Manager: Update tests to work with Linux arm64
dennisameling Jul 12, 2025
4fa3120
Apply AI review suggestions
dennisameling Jul 12, 2025
a19edd8
Fix formatting
dennisameling Jul 14, 2025
eaa4a43
Add release logic for Linux arm64 binaries
dennisameling Jul 28, 2025
73ffdfc
Merged trunk and fixed conflicts
cgoldberg Dec 3, 2025
b2fa08d
Revert test fixes and fix formatting
cgoldberg Dec 3, 2025
747ec33
Merge branch 'trunk' into add-selenium-manager-linux-arm64
cgoldberg Dec 7, 2025
7c02d66
Merge branch 'trunk' into add-selenium-manager-linux-arm64
cgoldberg Dec 21, 2025
23781ac
Merge branch 'trunk' into add-selenium-manager-linux-arm64
cgoldberg Dec 21, 2025
1c62caf
Merge branch 'trunk' into add-selenium-manager-linux-arm64
cgoldberg Dec 29, 2025
a29bd0a
Merge branch 'trunk' into add-selenium-manager-linux-arm64
cgoldberg Jan 26, 2026
19f4e87
Merge branch 'trunk' into add-selenium-manager-linux-arm64
cgoldberg Jan 27, 2026
59727da
Fix Firefox Linux arm64 logic and fail early on Chrome/Edge Linux arm64
dennisameling Feb 2, 2026
a6d2f32
Merge remote-tracking branch 'upstream/trunk' into add-selenium-manag…
dennisameling Feb 2, 2026
7cddd19
Add missing debug tar to CI
dennisameling Feb 2, 2026
1384996
Enable cache tests
dennisameling Feb 2, 2026
efe4de7
Merge branch 'trunk' into add-selenium-manager-linux-arm64
cgoldberg Feb 2, 2026
28edf9b
Revert "Enable cache tests"
dennisameling Feb 2, 2026
bdd2748
Merge branch 'trunk' into add-selenium-manager-linux-arm64
cgoldberg Feb 13, 2026
6d73416
Merge remote-tracking branch 'upstream/trunk' into add-selenium-manag…
dennisameling Mar 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 31 additions & 4 deletions .github/workflows/ci-rust.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ jobs:
include:
- os: macos
- os: ubuntu
- os: ubuntu-24.04-arm
- os: windows
with:
name: Tests (${{ matrix.os }})
Expand Down Expand Up @@ -120,17 +121,28 @@ jobs:
- name: "Install cross"
run: |
cargo install cross --git https://github.com/cross-rs/cross
- name: "Build release binary"
- name: "Build release binary (x64)"
run: cross build --target x86_64-unknown-linux-musl --release
working-directory: rust
- name: "Build release binary (arm64)"
run: cross build --target aarch64-unknown-linux-musl --release
working-directory: rust
- name: "Rename binary"
run: mv rust/target/x86_64-unknown-linux-musl/release/selenium-manager selenium-manager-linux
run: |
mv rust/target/x86_64-unknown-linux-musl/release/selenium-manager selenium-manager-linux
mv rust/target/aarch64-unknown-linux-musl/release/selenium-manager selenium-manager-linux-arm64
- name: "Upload release binary"
uses: actions/upload-artifact@v5
with:
name: selenium-manager-linux
path: selenium-manager-linux
retention-days: 6
- name: "Upload release binary"
uses: actions/upload-artifact@v4
with:
name: selenium-manager-linux-arm64
path: selenium-manager-linux-arm64
retention-days: 6

linux-debug:
name: "Linux Debug"
Expand All @@ -149,18 +161,30 @@ jobs:
- name: "Install cross"
run: |
cargo install cross --git https://github.com/cross-rs/cross
- name: "Build release binary"
- name: "Build release binary (x64)"
run: |
cross build --target x86_64-unknown-linux-musl --profile dev
cd target/x86_64-unknown-linux-musl/debug
tar -cvf ../../../../selenium-manager-linux-debug.tar selenium-manager
working-directory: rust
- name: "Build release binary (arm64)"
run: |
cross build --target aarch64-unknown-linux-musl --profile dev
cd target/aarch64-unknown-linux-musl/debug
tar -cvf ../../../../selenium-manager-linux-arm64-debug.tar selenium-manager
working-directory: rust
- name: "Upload release binary"
uses: actions/upload-artifact@v5
with:
name: selenium-manager-linux-debug
path: selenium-manager-linux-debug.tar
retention-days: 6
- name: "Upload release binary"
uses: actions/upload-artifact@v4
with:
name: selenium-manager-linux-arm64-debug
path: selenium-manager-linux-arm64-debug.tar
retention-days: 6

macos-stable:
name: "MacOS Stable"
Expand Down Expand Up @@ -248,9 +272,10 @@ jobs:
- name: "Prepare and Commit"
run: |
linux_sha=$(shasum -a 256 artifacts/selenium-manager-linux/selenium-manager-linux | awk '{print $1}')
linux_arm64_sha=$(shasum -a 256 artifacts/selenium-manager-linux-arm64/selenium-manager-linux-arm64 | awk '{print $1}')
macos_sha=$(shasum -a 256 artifacts/selenium-manager-macos/selenium-manager-macos | awk '{print $1}')
windows_sha=$(shasum -a 256 artifacts/selenium-manager-windows/selenium-manager-windows.exe | awk '{print $1}')
echo "{\"macos\": \"$macos_sha\", \"windows\": \"$windows_sha\", \"linux\": \"$linux_sha\"}" > latest.json
echo "{\"macos\": \"$macos_sha\", \"windows\": \"$windows_sha\", \"linux\": \"$linux_sha\", \"linux-arm64\": \"$linux_arm64_sha\" }" > latest.json
git config --local user.email "selenium-ci@users.noreply.github.com"
git config --local user.name "Selenium CI Bot"
git add latest.json
Expand All @@ -269,8 +294,10 @@ jobs:
prerelease: false
files: |
artifacts/selenium-manager-linux/selenium-manager-linux
artifacts/selenium-manager-linux-arm64/selenium-manager-linux-arm64
Comment thread
dennisameling marked this conversation as resolved.
artifacts/selenium-manager-macos/selenium-manager-macos
artifacts/selenium-manager-windows/selenium-manager-windows.exe
artifacts/selenium-manager-linux-debug/selenium-manager-linux-debug.tar
artifacts/selenium-manager-linux-arm64-debug/selenium-manager-linux-arm64-debug.tar
artifacts/selenium-manager-macos-debug/selenium-manager-macos-debug.tar
artifacts/selenium-manager-windows-debug/selenium-manager-windows-debug.exe
12 changes: 12 additions & 0 deletions rust/src/chrome.rs
Original file line number Diff line number Diff line change
Expand Up @@ -383,6 +383,10 @@ impl SeleniumManager for ChromeManager {
} else {
"mac64"
}
} else if LINUX.is(os) && ARM64.is(arch) {
return Err(anyhow!(
"Linux arm64 is not supported yet by Google Chrome. Please try another browser."
));
} else {
"linux64"
};
Expand Down Expand Up @@ -454,6 +458,14 @@ impl SeleniumManager for ChromeManager {
_browser_version: &str,
) -> Result<String, Error> {
let browser_name = self.browser_name;
let os = self.get_os();
let arch = self.get_arch();
if LINUX.is(os) && ARM64.is(arch) {
return Err(anyhow!(format!(
"Linux arm64 is not supported yet by {}. Please try another browser.",
browser_name
)));
}
self.get_logger().trace(format!(
"Using Chrome for Testing (CfT) endpoints to find out latest stable {} version",
browser_name
Expand Down
13 changes: 13 additions & 0 deletions rust/src/edge.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ use crate::{
create_http_client, get_binary_extension, path_to_string,
};
use anyhow::Error;
use anyhow::anyhow;
use reqwest::Client;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
Expand Down Expand Up @@ -284,6 +285,10 @@ impl SeleniumManager for EdgeManager {
}
} else if MACOS.is(os) {
if ARM64.is(arch) { "mac64_m1" } else { "mac64" }
} else if LINUX.is(os) && ARM64.is(arch) {
return Err(anyhow!(
"Linux arm64 is not supported yet by Microsoft Edge. Please try another browser."
));
} else {
"linux64"
};
Expand Down Expand Up @@ -356,6 +361,14 @@ impl SeleniumManager for EdgeManager {
browser_version: &str,
) -> Result<String, Error> {
let browser_name = self.browser_name;
let os = self.get_os();
let arch = self.get_arch();
if LINUX.is(os) && ARM64.is(arch) {
return Err(anyhow!(format!(
"Linux arm64 is not supported yet by {}. Please try another browser.",
browser_name
)));
}
let is_fixed_browser_version = !self.is_empty(browser_version)
&& !self.is_stable(browser_version)
&& !self.is_unstable(browser_version);
Expand Down
19 changes: 11 additions & 8 deletions rust/src/firefox.rs
Original file line number Diff line number Diff line change
Expand Up @@ -381,18 +381,12 @@ impl SeleniumManager for FirefoxManager {
}

fn get_platform_label(&self) -> &str {
let driver_version = self.get_driver_version();
let os = self.get_os();
let arch = self.get_arch();
let minor_driver_version = self
.get_minor_version(driver_version)
.unwrap_or_default()
.parse::<i32>()
.unwrap_or_default();
if WINDOWS.is(os) {
if X32.is(arch) {
"win32"
} else if ARM64.is(arch) && minor_driver_version > 31 {
} else if ARM64.is(arch) {
"win-arm64"
} else {
"win64"
Expand All @@ -401,7 +395,7 @@ impl SeleniumManager for FirefoxManager {
if ARM64.is(arch) { "mac-arm64" } else { "mac64" }
} else if X32.is(arch) {
"linux32"
} else if ARM64.is(arch) && minor_driver_version > 31 {
} else if ARM64.is(arch) {
"linux-arm64"
} else {
"linux64"
Expand Down Expand Up @@ -583,6 +577,15 @@ impl SeleniumManager for FirefoxManager {
} else {
platform_label = "linux64";
}
} else if ARM64.is(arch) {
if major_browser_version < 136 {
return Err(anyhow!(
"Firefox arm64 for Linux is only available from version 136 onwards. \
You requested version {}. Please use version 136 or later.",
self.get_browser_version()
));
}
platform_label = "linux-aarch64";
} else {
platform_label = "linux-x86_64";
}
Expand Down
49 changes: 33 additions & 16 deletions rust/tests/browser_download_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
use crate::common::{assert_browser, assert_driver, get_selenium_manager};

use rstest::rstest;
use std::env::consts::ARCH;
use std::env::consts::OS;

mod common;
Expand All @@ -27,23 +28,27 @@ mod common;
#[case("firefox")]
#[case("edge")]
fn browser_latest_download_test(#[case] browser: String) {
if !browser.eq("edge") || !OS.eq("windows") {
let mut cmd = get_selenium_manager();
cmd.args([
"--browser",
&browser,
"--force-browser-download",
"--output",
"json",
"--debug",
])
.assert()
.success()
.code(0);

assert_driver(&mut cmd);
assert_browser(&mut cmd);
if browser.eq("edge") && OS.eq("windows") {
return;
} else if OS.eq("linux") && ARCH.eq("aarch64") && !browser.eq("firefox") {
return;
}

let mut cmd = get_selenium_manager();
cmd.args([
"--browser",
&browser,
"--force-browser-download",
"--output",
"json",
"--debug",
])
.assert()
.success()
.code(0);

assert_driver(&mut cmd);
assert_browser(&mut cmd);
}

#[rstest]
Expand All @@ -61,6 +66,18 @@ fn browser_version_download_test(#[case] browser: String, #[case] browser_versio
println!(
"Skipping Edge download test on Windows since the installation requires admin privileges"
);
} else if OS.eq("linux") && ARCH.eq("aarch64") && !browser.eq("firefox") {
println!(
"Skipping non-Firefox download test on Linux arm64 since no other browsers are supported yet"
);
} else if OS.eq("linux")
&& ARCH.eq("aarch64")
&& browser.eq("firefox")
&& browser_version.starts_with("121")
{
println!(
"Skipping Firefox 121 download test on Linux arm64 since arm64 builds are only available from version 136 onwards"
);
} else {
let mut cmd = get_selenium_manager();
cmd.args([
Expand Down
9 changes: 9 additions & 0 deletions rust/tests/browser_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ use crate::common::{assert_output, get_selenium_manager, get_stdout};

use exitcode::DATAERR;
use rstest::rstest;
use std::env::consts::ARCH;
use std::env::consts::OS;
use std::path::Path;

Expand All @@ -39,6 +40,10 @@ fn browser_version_test(
#[case] browser_version: String,
#[case] driver_version: String,
) {
if OS.eq("linux") && ARCH.eq("aarch64") && !browser.eq("firefox") {
return;
}

let mut cmd = get_selenium_manager();
cmd.args([
"--browser",
Expand Down Expand Up @@ -77,6 +82,10 @@ fn wrong_parameters_test(
#[case] driver_version: String,
#[case] error_code: i32,
) {
if OS.eq("linux") && ARCH.eq("aarch64") && !browser.eq("firefox") {
return;
}

let mut cmd = get_selenium_manager();
let result = cmd
.args([
Expand Down
1 change: 1 addition & 0 deletions rust/tests/cache_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ use std::path::Path;

mod common;

#[cfg(not(all(target_os = "linux", target_arch = "aarch64")))]
#[rstest]
#[case("../tmp")]
#[case("../áèîö")]
Expand Down
6 changes: 6 additions & 0 deletions rust/tests/common.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ use selenium_manager::logger::JsonOutput;
use selenium_manager::shell;
use selenium_manager::shell::run_shell_command_by_os;
use std::borrow::BorrowMut;
use std::env::consts::ARCH;
use std::env::consts::OS;
use std::path::{Path, PathBuf};

Expand Down Expand Up @@ -121,3 +122,8 @@ pub fn assert_output(
);
}
}

#[allow(dead_code)]
pub fn is_linux_arm64() -> bool {
OS == "linux" && ARCH == "aarch64"
}
5 changes: 5 additions & 0 deletions rust/tests/config_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ use crate::common::{assert_browser, assert_driver, get_selenium_manager, get_std

use rstest::rstest;

use std::env::consts::ARCH;
use std::env::consts::OS;
use std::fs::File;
use std::io::{BufWriter, Write};
use tempfile::Builder;
Expand All @@ -30,6 +32,9 @@ mod common;
#[case("firefox")]
#[case("edge")]
fn config_test(#[case] browser_name: String) {
if OS.eq("linux") && ARCH.eq("aarch64") && !browser_name.eq("firefox") {
return;
}
let tmp_dir = Builder::new().prefix("sm-config-test").tempdir().unwrap();
let config_path = tmp_dir.path().join("se-config.toml");
let config_file = File::create(config_path.as_path()).unwrap();
Expand Down
5 changes: 5 additions & 0 deletions rust/tests/exec_driver_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
use crate::common::{assert_browser, assert_driver, exec_driver, get_selenium_manager};

use rstest::rstest;
use std::env::consts::ARCH;
use std::env::consts::OS;

mod common;
Expand All @@ -28,6 +29,10 @@ mod common;
#[case("firefox", "geckodriver")]
#[case("iexplorer", "IEDriverServer")]
fn exec_driver_test(#[case] browser_name: String, #[case] driver_name: String) {
if OS.eq("linux") && ARCH.eq("aarch64") && !browser_name.eq("firefox") {
return;
}

let mut cmd = get_selenium_manager();
cmd.args(["--browser", &browser_name, "--output", "json"])
.assert()
Expand Down
8 changes: 6 additions & 2 deletions rust/tests/mirror_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
// specific language governing permissions and limitations
// under the License.

use crate::common::{assert_driver, get_selenium_manager};
use crate::common::{assert_driver, get_selenium_manager, is_linux_arm64};

mod common;

Expand All @@ -24,7 +24,11 @@ fn mirror_test() {
let mut cmd = get_selenium_manager();
cmd.args([
"--browser",
"chrome",
if is_linux_arm64() {
"firefox"
} else {
"chrome"
},
"--driver-mirror-url",
"https://registry.npmmirror.com/-/binary/chromedriver/",
"--browser-version",
Expand Down
Loading