diff --git a/rust/src/grid.rs b/rust/src/grid.rs index fdd2742a93238..14eea056c9ff5 100644 --- a/rust/src/grid.rs +++ b/rust/src/grid.rs @@ -106,15 +106,16 @@ impl SeleniumManager for GridManager { } fn request_driver_version(&mut self) -> Result { - let major_browser_version_binding = self.get_major_browser_version(); - let major_browser_version = major_browser_version_binding.as_str(); + let is_nightly = self.is_nightly(self.get_driver_version()); + let major_driver_version_binding = self.get_major_driver_version(); + let major_driver_version = major_driver_version_binding.as_str(); let cache_path = self.get_cache_path()?; let mut metadata = get_metadata(self.get_logger(), &cache_path); match get_driver_version_from_metadata( &metadata.drivers, self.driver_name, - major_browser_version, + major_driver_version, ) { Some(driver_version) => { self.log.trace(format!( @@ -135,8 +136,12 @@ impl SeleniumManager for GridManager { .into_iter() .filter(|r| { r.assets.iter().any(|url| { - url.browser_download_url.contains(GRID_RELEASE) - && !url.browser_download_url.contains(SNAPSHOT) + if is_nightly { + url.browser_download_url.contains(SNAPSHOT) + } else { + url.browser_download_url.contains(GRID_RELEASE) + && !url.browser_download_url.contains(SNAPSHOT) + } }) }) .collect(); @@ -155,15 +160,20 @@ impl SeleniumManager for GridManager { let index_release = driver_url.rfind(GRID_RELEASE).unwrap() + GRID_RELEASE.len() + 1; - let driver_version = parse_version( - driver_url.as_str()[index_release..].to_string(), - self.get_logger(), - )?; + let driver_version = if is_nightly { + let index_jar = driver_url.rfind(GRID_EXTENSION).unwrap() - 1; + driver_url.as_str()[index_release..index_jar].to_string() + } else { + parse_version( + driver_url.as_str()[index_release..].to_string(), + self.get_logger(), + )? + }; let driver_ttl = self.get_ttl(); if driver_ttl > 0 { metadata.drivers.push(create_driver_metadata( - major_browser_version, + major_driver_version, self.driver_name, &driver_version, driver_ttl, diff --git a/rust/src/lib.rs b/rust/src/lib.rs index a2c2411bcb763..23726c2b33766 100644 --- a/rust/src/lib.rs +++ b/rust/src/lib.rs @@ -798,7 +798,9 @@ pub trait SeleniumManager { } // With the discovered browser version, discover the proper driver version using online endpoints - if self.get_driver_version().is_empty() { + if self.get_driver_version().is_empty() + || (self.is_grid() && self.is_nightly(self.get_driver_version())) + { match self.discover_driver_version() { Ok(driver_version) => { self.set_driver_version(driver_version); @@ -1030,7 +1032,7 @@ pub trait SeleniumManager { } let mut release_version = driver_version.to_string(); - if !driver_version.ends_with('0') { + if !driver_version.ends_with('0') && !self.is_nightly(driver_version) { // E.g.: version 4.8.1 is shipped within release 4.8.0 let error_message = format!( "Wrong {} version: '{}'", diff --git a/rust/tests/grid_tests.rs b/rust/tests/grid_tests.rs index 2d3f4d20901cb..1e3e6a73763b4 100644 --- a/rust/tests/grid_tests.rs +++ b/rust/tests/grid_tests.rs @@ -20,6 +20,7 @@ use crate::common::{assert_output, get_selenium_manager, get_stdout}; use exitcode::DATAERR; use rstest::rstest; use selenium_manager::logger::JsonOutput; +use selenium_manager::{NIGHTLY, SNAPSHOT}; use std::path::Path; use std::str; @@ -51,6 +52,7 @@ fn grid_latest_test() { #[case("4.8.0")] #[case("4.9.0")] #[case("4.10.0")] +#[case("nightly")] fn grid_version_test(#[case] grid_version: &str) { let mut cmd = get_selenium_manager(); cmd.args(["--grid", grid_version, "--output", "json"]) @@ -63,7 +65,12 @@ fn grid_version_test(#[case] grid_version: &str) { let json: JsonOutput = serde_json::from_str(&stdout).unwrap(); let jar = Path::new(&json.result.driver_path); let jar_name = jar.file_name().unwrap().to_str().unwrap(); - assert!(jar_name.contains(grid_version)); + let version_label = if grid_version.eq_ignore_ascii_case(NIGHTLY) { + SNAPSHOT + } else { + grid_version + }; + assert!(jar_name.contains(version_label)); } #[rstest]