diff --git a/rust/src/electron.rs b/rust/src/electron.rs index 8f285a2c3dc68..bfc8fd3b2745c 100644 --- a/rust/src/electron.rs +++ b/rust/src/electron.rs @@ -119,17 +119,30 @@ impl SeleniumManager for ElectronManager { Ok(driver_version) } _ => { - self.assert_online_or_err(OFFLINE_REQUEST_ERR_MSG)?; - - let latest_url = format!( - "{}{}", - self.get_driver_mirror_url_or_default(DRIVER_URL), - LATEST_RELEASE - ); - let driver_version = - read_redirect_from_link(self.get_http_client(), latest_url, self.get_logger())?; + // Electron releases are tagged by Electron version, and the + // chromedriver asset shipped in each release matches that tag. + // When the user pins a concrete browser version (e.g. + // `--browser-version 36.2.1`), that version is the driver + // version we want; resolving via `/releases/latest` would + // discard the user's request and return the latest tag instead. + let browser_version = self.get_browser_version().to_string(); + let driver_version = if !browser_version.is_empty() + && !self.is_browser_version_stable() + && !self.is_browser_version_unstable() + { + browser_version + } else { + self.assert_online_or_err(OFFLINE_REQUEST_ERR_MSG)?; + let latest_url = format!( + "{}{}", + self.get_driver_mirror_url_or_default(DRIVER_URL), + LATEST_RELEASE + ); + read_redirect_from_link(self.get_http_client(), latest_url, self.get_logger())? + }; let driver_ttl = self.get_ttl(); - if driver_ttl > 0 { + if driver_ttl > 0 && !major_browser_version.is_empty() && !driver_version.is_empty() + { metadata.drivers.push(create_driver_metadata( major_browser_version, self.driver_name, diff --git a/rust/tests/electron_tests.rs b/rust/tests/electron_tests.rs index c0e6e48cf92e0..05529be7dcd56 100644 --- a/rust/tests/electron_tests.rs +++ b/rust/tests/electron_tests.rs @@ -15,7 +15,7 @@ // specific language governing permissions and limitations // under the License. -use crate::common::get_selenium_manager; +use crate::common::{get_driver_path, get_selenium_manager}; use rstest::rstest; @@ -37,3 +37,29 @@ fn electron_version_test(#[case] driver_version: String) { .assert(); cmd_assert.success(); } + +#[rstest] +#[case("36.2.1")] +fn electron_browser_version_test(#[case] browser_version: String) { + // Regression for issue #17549: when the user pins --browser-version, the + // resolved driver version must be derived from the requested version, not + // from the /releases/latest redirect. Asserting that the resolved driver + // path contains the requested version protects against silently falling + // back to the latest tag. + let mut cmd = get_selenium_manager(); + cmd.args([ + "--browser", + "electron", + "--browser-version", + &browser_version, + "--output", + "json", + ]); + let driver_path = get_driver_path(&mut cmd); + assert!( + driver_path.contains(&browser_version), + "expected resolved driver path to contain requested version {}, got: {}", + browser_version, + driver_path + ); +}