Skip to content

Commit d86b1d4

Browse files
committed
[rust] Download older and unstable version of Chrome for Testing (#11678)
1 parent deeedb1 commit d86b1d4

9 files changed

Lines changed: 295 additions & 118 deletions

File tree

rust/src/chrome.rs

Lines changed: 169 additions & 59 deletions
Large diffs are not rendered by default.

rust/src/edge.rs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -160,13 +160,13 @@ impl SeleniumManager for EdgeManager {
160160
}
161161

162162
fn request_driver_version(&mut self) -> Result<String, Box<dyn Error>> {
163-
let mut browser_version = self.get_major_browser_version();
163+
let mut major_browser_version = self.get_major_browser_version();
164164
let mut metadata = get_metadata(self.get_logger());
165165

166166
match get_driver_version_from_metadata(
167167
&metadata.drivers,
168168
self.driver_name,
169-
browser_version.as_str(),
169+
major_browser_version.as_str(),
170170
) {
171171
Some(driver_version) => {
172172
self.log.trace(format!(
@@ -178,7 +178,7 @@ impl SeleniumManager for EdgeManager {
178178
_ => {
179179
self.assert_online_or_err(OFFLINE_REQUEST_ERR_MSG)?;
180180

181-
if browser_version.is_empty() {
181+
if major_browser_version.is_empty() {
182182
let latest_stable_url = format!("{}{}", DRIVER_URL, LATEST_STABLE);
183183
self.log.debug(format!(
184184
"Reading {} latest version from {}",
@@ -189,17 +189,18 @@ impl SeleniumManager for EdgeManager {
189189
latest_stable_url,
190190
self.get_logger(),
191191
)?;
192-
browser_version = self.get_major_version(latest_driver_version.as_str())?;
192+
major_browser_version =
193+
self.get_major_version(latest_driver_version.as_str())?;
193194
self.log.debug(format!(
194195
"Latest {} major version is {}",
195-
&self.driver_name, browser_version
196+
&self.driver_name, major_browser_version
196197
));
197198
}
198199
let driver_url = format!(
199200
"{}{}_{}_{}",
200201
DRIVER_URL,
201202
LATEST_RELEASE,
202-
browser_version,
203+
major_browser_version,
203204
self.get_os().to_uppercase()
204205
);
205206
self.log.debug(format!(
@@ -210,9 +211,9 @@ impl SeleniumManager for EdgeManager {
210211
read_version_from_link(self.get_http_client(), driver_url, self.get_logger())?;
211212

212213
let driver_ttl = self.get_driver_ttl();
213-
if driver_ttl > 0 && !browser_version.is_empty() {
214+
if driver_ttl > 0 && !major_browser_version.is_empty() {
214215
metadata.drivers.push(create_driver_metadata(
215-
browser_version.as_str(),
216+
major_browser_version.as_str(),
216217
self.driver_name,
217218
&driver_version,
218219
driver_ttl,

rust/src/firefox.rs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -158,12 +158,15 @@ impl SeleniumManager for FirefoxManager {
158158
}
159159

160160
fn request_driver_version(&mut self) -> Result<String, Box<dyn Error>> {
161-
let browser_version_binding = self.get_major_browser_version();
162-
let browser_version = browser_version_binding.as_str();
161+
let major_browser_version_binding = self.get_major_browser_version();
162+
let major_browser_version = major_browser_version_binding.as_str();
163163
let mut metadata = get_metadata(self.get_logger());
164164

165-
match get_driver_version_from_metadata(&metadata.drivers, self.driver_name, browser_version)
166-
{
165+
match get_driver_version_from_metadata(
166+
&metadata.drivers,
167+
self.driver_name,
168+
major_browser_version,
169+
) {
167170
Some(driver_version) => {
168171
self.log.trace(format!(
169172
"Driver TTL is valid. Getting {} version from metadata",
@@ -179,9 +182,9 @@ impl SeleniumManager for FirefoxManager {
179182
read_redirect_from_link(self.get_http_client(), latest_url, self.get_logger())?;
180183

181184
let driver_ttl = self.get_driver_ttl();
182-
if driver_ttl > 0 && !browser_version.is_empty() {
185+
if driver_ttl > 0 && !major_browser_version.is_empty() {
183186
metadata.drivers.push(create_driver_metadata(
184-
browser_version,
187+
major_browser_version,
185188
self.driver_name,
186189
&driver_version,
187190
driver_ttl,

rust/src/grid.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -95,12 +95,15 @@ impl SeleniumManager for GridManager {
9595
}
9696

9797
fn request_driver_version(&mut self) -> Result<String, Box<dyn Error>> {
98-
let browser_version_binding = self.get_major_browser_version();
99-
let browser_version = browser_version_binding.as_str();
98+
let major_browser_version_binding = self.get_major_browser_version();
99+
let major_browser_version = major_browser_version_binding.as_str();
100100
let mut metadata = get_metadata(self.get_logger());
101101

102-
match get_driver_version_from_metadata(&metadata.drivers, self.driver_name, browser_version)
103-
{
102+
match get_driver_version_from_metadata(
103+
&metadata.drivers,
104+
self.driver_name,
105+
major_browser_version,
106+
) {
104107
Some(driver_version) => {
105108
self.log.trace(format!(
106109
"Driver TTL is valid. Getting {} version from metadata",
@@ -148,7 +151,7 @@ impl SeleniumManager for GridManager {
148151
let driver_ttl = self.get_driver_ttl();
149152
if driver_ttl > 0 {
150153
metadata.drivers.push(create_driver_metadata(
151-
browser_version,
154+
major_browser_version,
152155
self.driver_name,
153156
&driver_version,
154157
driver_ttl,

rust/src/iexplorer.rs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -99,12 +99,15 @@ impl SeleniumManager for IExplorerManager {
9999
}
100100

101101
fn request_driver_version(&mut self) -> Result<String, Box<dyn Error>> {
102-
let browser_version_binding = self.get_major_browser_version();
103-
let browser_version = browser_version_binding.as_str();
102+
let major_browser_version_binding = self.get_major_browser_version();
103+
let major_browser_version = major_browser_version_binding.as_str();
104104
let mut metadata = get_metadata(self.get_logger());
105105

106-
match get_driver_version_from_metadata(&metadata.drivers, self.driver_name, browser_version)
107-
{
106+
match get_driver_version_from_metadata(
107+
&metadata.drivers,
108+
self.driver_name,
109+
major_browser_version,
110+
) {
108111
Some(driver_version) => {
109112
self.log.trace(format!(
110113
"Driver TTL is valid. Getting {} version from metadata",
@@ -146,9 +149,9 @@ impl SeleniumManager for IExplorerManager {
146149
)?;
147150

148151
let driver_ttl = self.get_driver_ttl();
149-
if driver_ttl > 0 && !browser_version.is_empty() {
152+
if driver_ttl > 0 && !major_browser_version.is_empty() {
150153
metadata.drivers.push(create_driver_metadata(
151-
browser_version,
154+
major_browser_version,
152155
self.driver_name,
153156
&driver_version,
154157
driver_ttl,

rust/src/lib.rs

Lines changed: 50 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ pub trait SeleniumManager {
133133
// ----------------------------------------------------------
134134

135135
fn download_driver(&mut self) -> Result<(), Box<dyn Error>> {
136-
let driver_url = Self::get_driver_url(self)?;
136+
let driver_url = self.get_driver_url()?;
137137
self.get_logger()
138138
.debug(format!("Driver URL: {}", driver_url));
139139
let (_tmp_folder, driver_zip_file) =
@@ -159,9 +159,10 @@ pub trait SeleniumManager {
159159
let mut browser_version = self.get_browser_version();
160160
if browser_version.eq_ignore_ascii_case(CANARY) {
161161
browser_version = NIGHTLY;
162-
} else if browser_version.is_empty() {
162+
} else if !self.is_browser_version_unstable() {
163163
browser_version = STABLE;
164164
}
165+
165166
let browser_path = self
166167
.get_browser_path_map()
167168
.get(&BrowserPath::new(str_to_os(self.get_os()), browser_version))
@@ -247,11 +248,11 @@ pub trait SeleniumManager {
247248
}
248249

249250
fn discover_driver_version(&mut self) -> Result<String, Box<dyn Error>> {
250-
if self.is_force_browser_download() {
251-
self.download_browser()?;
252-
}
253-
let browser_version = self.get_major_browser_version();
254-
if browser_version.is_empty() || self.is_browser_version_unstable() {
251+
let mut download_browser = self.is_force_browser_download();
252+
let major_browser_version = self.get_major_browser_version();
253+
254+
// First, we try to discover the browser version
255+
if !download_browser {
255256
match self.discover_browser_version() {
256257
Some(version) => {
257258
if !self.is_safari() {
@@ -260,6 +261,20 @@ pub trait SeleniumManager {
260261
self.get_browser_name(),
261262
version
262263
));
264+
}
265+
let discovered_major_browser_version =
266+
self.get_major_version(&version).unwrap_or_default();
267+
if !major_browser_version.is_empty()
268+
&& !self.is_browser_version_unstable()
269+
&& !major_browser_version.eq(&discovered_major_browser_version)
270+
{
271+
self.get_logger().debug(format!(
272+
"Discovered browser version ({}) different to specified browser version ({})",
273+
discovered_major_browser_version,
274+
major_browser_version,
275+
));
276+
download_browser = true;
277+
} else {
263278
self.set_browser_version(version);
264279
}
265280
}
@@ -268,25 +283,31 @@ pub trait SeleniumManager {
268283
"{} has not been discovered in the system",
269284
self.get_browser_name()
270285
));
271-
let browser_path = self.download_browser()?;
272-
if browser_path.is_some() {
273-
self.get_logger().debug(format!(
274-
"{} {} has been downloaded at {}",
275-
self.get_browser_name(),
276-
self.get_browser_version(),
277-
browser_path.unwrap().display()
278-
));
279-
} else if self.is_browser_version_unstable() {
280-
return Err(format!("Browser version '{browser_version}' not found").into());
281-
} else if !self.is_iexplorer() && !self.is_grid() {
282-
self.get_logger().warn(format!(
283-
"The version of {} cannot be detected. Trying with latest driver version",
284-
self.get_browser_name()
285-
));
286-
}
286+
download_browser = true;
287287
}
288288
}
289289
}
290+
291+
if download_browser {
292+
let browser_path = self.download_browser()?;
293+
if browser_path.is_some() {
294+
self.get_logger().debug(format!(
295+
"{} {} has been downloaded at {}",
296+
self.get_browser_name(),
297+
self.get_browser_version(),
298+
browser_path.unwrap().display()
299+
));
300+
} else if self.is_browser_version_unstable() {
301+
return Err(format!("Browser version '{major_browser_version}' not found").into());
302+
} else if !self.is_iexplorer() && !self.is_grid() {
303+
self.get_logger().warn(format!(
304+
"The version of {} cannot be detected. Trying with latest driver version",
305+
self.get_browser_name()
306+
));
307+
}
308+
}
309+
310+
// Second, we request the driver version using online metadata
290311
let driver_version = self.request_driver_version()?;
291312
if driver_version.is_empty() {
292313
Err(format!(
@@ -557,8 +578,12 @@ pub trait SeleniumManager {
557578
}
558579

559580
fn get_major_browser_version(&self) -> String {
560-
self.get_major_version(self.get_browser_version())
561-
.unwrap_or_default()
581+
if self.is_browser_version_unstable() {
582+
self.get_browser_version().to_string()
583+
} else {
584+
self.get_major_version(self.get_browser_version())
585+
.unwrap_or_default()
586+
}
562587
}
563588

564589
fn set_browser_version(&mut self, browser_version: String) {

rust/src/metadata.rs

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,14 @@ const METADATA_FILE: &str = "selenium-manager.json";
3131
#[derive(Serialize, Deserialize)]
3232
pub struct Browser {
3333
pub browser_name: String,
34+
pub major_browser_version: String,
3435
pub browser_version: String,
3536
pub browser_ttl: u64,
3637
}
3738

3839
#[derive(Serialize, Deserialize)]
3940
pub struct Driver {
40-
pub browser_version: String,
41+
pub major_browser_version: String,
4142
pub driver_name: String,
4243
pub driver_version: String,
4344
pub driver_ttl: u64,
@@ -92,10 +93,13 @@ pub fn get_metadata(log: &Logger) -> Metadata {
9293
pub fn get_browser_version_from_metadata(
9394
browsers_metadata: &[Browser],
9495
browser_name: &str,
96+
major_browser_version: &str,
9597
) -> Option<String> {
9698
let browser: Vec<&Browser> = browsers_metadata
9799
.iter()
98-
.filter(|b| b.browser_name.eq(browser_name))
100+
.filter(|b| {
101+
b.browser_name.eq(browser_name) && b.major_browser_version.eq(major_browser_version)
102+
})
99103
.collect();
100104
if browser.is_empty() {
101105
None
@@ -107,11 +111,13 @@ pub fn get_browser_version_from_metadata(
107111
pub fn get_driver_version_from_metadata(
108112
drivers_metadata: &[Driver],
109113
driver_name: &str,
110-
browser_version: &str,
114+
major_browser_version: &str,
111115
) -> Option<String> {
112116
let driver: Vec<&Driver> = drivers_metadata
113117
.iter()
114-
.filter(|d| d.driver_name.eq(driver_name) && d.browser_version.eq(browser_version))
118+
.filter(|d| {
119+
d.driver_name.eq(driver_name) && d.major_browser_version.eq(major_browser_version)
120+
})
115121
.collect();
116122
if driver.is_empty() {
117123
None
@@ -122,24 +128,26 @@ pub fn get_driver_version_from_metadata(
122128

123129
pub fn create_browser_metadata(
124130
browser_name: &str,
125-
browser_version: &String,
131+
major_browser_version: &str,
132+
browser_version: &str,
126133
browser_ttl: u64,
127134
) -> Browser {
128135
Browser {
129136
browser_name: browser_name.to_string(),
137+
major_browser_version: major_browser_version.to_string(),
130138
browser_version: browser_version.to_string(),
131139
browser_ttl: now_unix_timestamp() + browser_ttl,
132140
}
133141
}
134142

135143
pub fn create_driver_metadata(
136-
browser_version: &str,
144+
major_browser_version: &str,
137145
driver_name: &str,
138146
driver_version: &str,
139147
driver_ttl: u64,
140148
) -> Driver {
141149
Driver {
142-
browser_version: browser_version.to_string(),
150+
major_browser_version: major_browser_version.to_string(),
143151
driver_name: driver_name.to_string(),
144152
driver_version: driver_version.to_string(),
145153
driver_ttl: now_unix_timestamp() + driver_ttl,

rust/tests/chrome_download_tests.rs

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,12 @@ use assert_cmd::Command;
1919
use std::path::Path;
2020

2121
use is_executable::is_executable;
22+
use rstest::rstest;
2223
use selenium_manager::logger::JsonOutput;
2324
use std::str;
2425

2526
#[test]
26-
fn chrome_download_test() {
27+
fn chrome_latest_download_test() {
2728
let mut cmd = Command::new(env!("CARGO_BIN_EXE_selenium-manager"));
2829
cmd.args([
2930
"--browser",
@@ -36,6 +37,30 @@ fn chrome_download_test() {
3637
.success()
3738
.code(0);
3839

40+
assert_driver_and_browser(&mut cmd);
41+
}
42+
43+
#[rstest]
44+
#[case("113")]
45+
#[case("beta")]
46+
fn chrome_version_download_test(#[case] browser_version: String) {
47+
let mut cmd = Command::new(env!("CARGO_BIN_EXE_selenium-manager"));
48+
cmd.args([
49+
"--browser",
50+
"chrome",
51+
"--browser-version",
52+
&browser_version,
53+
"--output",
54+
"json",
55+
])
56+
.assert()
57+
.success()
58+
.code(0);
59+
60+
assert_driver_and_browser(&mut cmd);
61+
}
62+
63+
fn assert_driver_and_browser(cmd: &mut Command) {
3964
let stdout = &cmd.unwrap().stdout;
4065
let output = str::from_utf8(stdout).unwrap();
4166
println!("{}", output);

0 commit comments

Comments
 (0)