Skip to content

Commit aa8d6cf

Browse files
authored
[rust] Support for beta/dev/canary browser version detection with Selenium Manager (#11239) (#11334)
[rust] Support for beta/dev/canary browser version detection with Selenium Manager
1 parent 104b7b9 commit aa8d6cf

File tree

8 files changed

+309
-86
lines changed

8 files changed

+309
-86
lines changed

rust/README.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,13 @@ Automated driver management for Selenium
2222
Usage: selenium-manager [OPTIONS]
2323
Options:
2424
-b, --browser <BROWSER>
25-
Browser name (chrome, firefox, or edge) [default: ]
25+
Browser name (chrome, firefox, edge, or iexplorer) [default: ]
2626
-d, --driver <DRIVER>
27-
Driver name (chromedriver, geckodriver, or msedgedriver) [default: ]
27+
Driver name (chromedriver, geckodriver, msedgedriver, or IEDriverServer) [default: ]
2828
-v, --driver-version <DRIVER_VERSION>
2929
Driver version (e.g., 106.0.5249.61, 0.31.0, etc.) [default: ]
3030
-B, --browser-version <BROWSER_VERSION>
31-
Major browser version (e.g., 105, 106, etc.) [default: ]
31+
Major browser version (e.g., 105, 106, etc. Also: beta, dev, canary -or nightly- is accepted) [default: ]
3232
-D, --debug
3333
Display DEBUG messages
3434
-T, --trace

rust/src/chrome.rs

+73-22
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,20 @@
1515
// specific language governing permissions and limitations
1616
// under the License.
1717

18+
use std::collections::HashMap;
1819
use std::error::Error;
1920
use std::path::PathBuf;
2021

2122
use crate::downloads::read_content_from_link;
2223
use crate::files::compose_driver_path_in_cache;
24+
use crate::is_unstable;
2325
use crate::manager::ARCH::ARM64;
24-
use crate::manager::OS::{MACOS, WINDOWS};
25-
use crate::manager::{detect_browser_version, get_major_version, BrowserManager};
26+
use crate::manager::OS::{LINUX, MACOS, WINDOWS};
27+
use crate::manager::{
28+
detect_browser_version, format_one_arg, format_two_args, get_major_version, BrowserManager,
29+
BrowserPath, BETA, DASH_DASH_VERSION, DEV, ENV_LOCALAPPDATA, ENV_PROGRAM_FILES,
30+
ENV_PROGRAM_FILES_X86, NIGHTLY, REG_QUERY, STABLE, WMIC_COMMAND,
31+
};
2632
use crate::metadata::{
2733
create_driver_metadata, get_driver_version_from_metadata, get_metadata, write_metadata,
2834
};
@@ -51,28 +57,73 @@ impl BrowserManager for ChromeManager {
5157
self.browser_name
5258
}
5359

54-
fn get_browser_version(&self, os: &str) -> Option<String> {
55-
let (shell, flag, args) = if WINDOWS.is(os) {
60+
fn get_browser_path_map(&self) -> HashMap<BrowserPath, &str> {
61+
HashMap::from([
5662
(
57-
"cmd",
58-
"/C",
59-
vec![
60-
r#"wmic datafile where name='%PROGRAMFILES:\=\\%\\Google\\Chrome\\Application\\chrome.exe' get Version /value"#,
61-
r#"wmic datafile where name='%PROGRAMFILES(X86):\=\\%\\Google\\Chrome\\Application\\chrome.exe' get Version /value"#,
62-
r#"wmic datafile where name='%LOCALAPPDATA:\=\\%\\Google\\Chrome\\Application\\chrome.exe' get Version /value"#,
63-
r#"REG QUERY HKCU\Software\Google\Chrome\BLBeacon /v version"#,
64-
],
65-
)
66-
} else if MACOS.is(os) {
63+
BrowserPath::new(WINDOWS, STABLE),
64+
r#"\\Google\\Chrome\\Application\\chrome.exe"#,
65+
),
6766
(
68-
"sh",
69-
"-c",
70-
vec![r#"/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --version"#],
71-
)
72-
} else {
73-
("sh", "-c", vec!["google-chrome --version"])
74-
};
75-
detect_browser_version(self.browser_name, shell, flag, args)
67+
BrowserPath::new(WINDOWS, BETA),
68+
r#"\\Google\\Chrome Beta\\Application\\chrome.exe"#,
69+
),
70+
(
71+
BrowserPath::new(WINDOWS, DEV),
72+
r#"\\Google\\Chrome Dev\\Application\\chrome.exe"#,
73+
),
74+
(
75+
BrowserPath::new(WINDOWS, NIGHTLY),
76+
r#"\\Google\\Chrome SxS\\Application\\chrome.exe"#,
77+
),
78+
(
79+
BrowserPath::new(MACOS, STABLE),
80+
r#"/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome"#,
81+
),
82+
(
83+
BrowserPath::new(MACOS, BETA),
84+
r#"/Applications/Google\ Chrome\ Beta.app/Contents/MacOS/Google\ Chrome\ Beta"#,
85+
),
86+
(
87+
BrowserPath::new(MACOS, DEV),
88+
r#"/Applications/Google\ Chrome\ Dev.app/Contents/MacOS/Google\ Chrome\ Dev"#,
89+
),
90+
(
91+
BrowserPath::new(MACOS, NIGHTLY),
92+
r#"/Applications/Google\ Chrome\ Canary.app/Contents/MacOS/Google\ Chrome\ Canary"#,
93+
),
94+
(BrowserPath::new(LINUX, STABLE), "google-chrome"),
95+
(BrowserPath::new(LINUX, BETA), "google-chrome-beta"),
96+
(BrowserPath::new(LINUX, DEV), "google-chrome-unstable"),
97+
])
98+
}
99+
100+
fn get_browser_version(&self, os: &str, browser_version: &str) -> Option<String> {
101+
match self.get_browser_path(os, browser_version) {
102+
Some(browser_path) => {
103+
let (shell, flag, args) = if WINDOWS.is(os) {
104+
let mut commands = vec![
105+
format_two_args(WMIC_COMMAND, ENV_PROGRAM_FILES, browser_path),
106+
format_two_args(WMIC_COMMAND, ENV_PROGRAM_FILES_X86, browser_path),
107+
format_two_args(WMIC_COMMAND, ENV_LOCALAPPDATA, browser_path),
108+
];
109+
if !is_unstable(browser_version) {
110+
commands.push(format_one_arg(
111+
REG_QUERY,
112+
r#"HKCU\Software\Google\Chrome\BLBeacon"#,
113+
));
114+
}
115+
("cmd", "/C", commands)
116+
} else {
117+
(
118+
"sh",
119+
"-c",
120+
vec![format_one_arg(DASH_DASH_VERSION, browser_path)],
121+
)
122+
};
123+
detect_browser_version(self.browser_name, shell, flag, args)
124+
}
125+
_ => None,
126+
}
76127
}
77128

78129
fn get_driver_name(&self) -> &str {

rust/src/edge.rs

+72-23
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,20 @@
1515
// specific language governing permissions and limitations
1616
// under the License.
1717

18+
use std::collections::HashMap;
1819
use std::error::Error;
1920
use std::path::PathBuf;
2021

2122
use crate::downloads::read_content_from_link;
2223
use crate::files::compose_driver_path_in_cache;
24+
use crate::is_unstable;
2325
use crate::manager::ARCH::{ARM64, X32};
24-
use crate::manager::OS::{MACOS, WINDOWS};
25-
use crate::manager::{detect_browser_version, BrowserManager};
26+
use crate::manager::OS::{LINUX, MACOS, WINDOWS};
27+
use crate::manager::{
28+
detect_browser_version, format_one_arg, format_two_args, BrowserManager, BrowserPath, BETA,
29+
DASH_DASH_VERSION, DEV, ENV_PROGRAM_FILES, ENV_PROGRAM_FILES_X86, NIGHTLY, REG_QUERY, STABLE,
30+
WMIC_COMMAND,
31+
};
2632
use crate::metadata::{
2733
create_driver_metadata, get_driver_version_from_metadata, get_metadata, write_metadata,
2834
};
@@ -52,29 +58,72 @@ impl BrowserManager for EdgeManager {
5258
self.browser_name
5359
}
5460

55-
fn get_browser_version(&self, os: &str) -> Option<String> {
56-
let (shell, flag, args) = if WINDOWS.is(os) {
61+
fn get_browser_path_map(&self) -> HashMap<BrowserPath, &str> {
62+
HashMap::from([
5763
(
58-
"cmd",
59-
"/C",
60-
vec![
61-
r#"wmic datafile where name='%PROGRAMFILES(X86):\=\\%\\Microsoft\\Edge\\Application\\msedge.exe' get Version /value"#,
62-
r#"wmic datafile where name='%PROGRAMFILES:\=\\%\\Microsoft\\Edge\\Application\\msedge.exe' get Version /value"#,
63-
r#"REG QUERY HKCU\Software\Microsoft\Edge\BLBeacon /v version"#,
64-
],
65-
)
66-
} else if MACOS.is(os) {
64+
BrowserPath::new(WINDOWS, STABLE),
65+
r#"\\Microsoft\\Edge\\Application\\msedge.exe"#,
66+
),
6767
(
68-
"sh",
69-
"-c",
70-
vec![
71-
r#"/Applications/Microsoft\ Edge.app/Contents/MacOS/Microsoft\ Edge -version"#,
72-
],
73-
)
74-
} else {
75-
("sh", "-c", vec!["microsoft-edge --version"])
76-
};
77-
detect_browser_version(self.browser_name, shell, flag, args)
68+
BrowserPath::new(WINDOWS, BETA),
69+
r#"\\Microsoft\\Edge Beta\\Application\\msedge.exe"#,
70+
),
71+
(
72+
BrowserPath::new(WINDOWS, DEV),
73+
r#"\\Microsoft\\Edge Dev\\Application\\msedge.exe"#,
74+
),
75+
(
76+
BrowserPath::new(WINDOWS, NIGHTLY),
77+
r#"\\Microsoft\\Edge SxS\\Application\\msedge.exe"#,
78+
),
79+
(
80+
BrowserPath::new(MACOS, STABLE),
81+
r#"/Applications/Microsoft\ Edge.app/Contents/MacOS/Microsoft\ Edge"#,
82+
),
83+
(
84+
BrowserPath::new(MACOS, BETA),
85+
r#"/Applications/Microsoft\ Edge\ Beta.app/Contents/MacOS/Microsoft\ Edge\ Beta"#,
86+
),
87+
(
88+
BrowserPath::new(MACOS, DEV),
89+
r#"/Applications/Microsoft\ Edge\ Dev.app/Contents/MacOS/Microsoft\ Edge\ Dev"#,
90+
),
91+
(
92+
BrowserPath::new(MACOS, NIGHTLY),
93+
r#"/Applications/Microsoft\ Edge\ Canary.app/Contents/MacOS/Microsoft\ Edge\ Canary"#,
94+
),
95+
(BrowserPath::new(LINUX, STABLE), "microsoft-edge"),
96+
(BrowserPath::new(LINUX, BETA), "microsoft-edge-beta"),
97+
(BrowserPath::new(LINUX, DEV), "microsoft-edge-dev"),
98+
])
99+
}
100+
101+
fn get_browser_version(&self, os: &str, browser_version: &str) -> Option<String> {
102+
match self.get_browser_path(os, browser_version) {
103+
Some(browser_path) => {
104+
let (shell, flag, args) = if WINDOWS.is(os) {
105+
let mut commands = vec![
106+
format_two_args(WMIC_COMMAND, ENV_PROGRAM_FILES_X86, browser_path),
107+
format_two_args(WMIC_COMMAND, ENV_PROGRAM_FILES, browser_path),
108+
];
109+
if !is_unstable(browser_version) {
110+
commands.push(format_one_arg(
111+
REG_QUERY,
112+
r#"REG QUERY HKCU\Software\Microsoft\Edge\BLBeacon"#,
113+
));
114+
}
115+
("cmd", "/C", commands)
116+
} else {
117+
(
118+
"sh",
119+
"-c",
120+
vec![format_one_arg(DASH_DASH_VERSION, browser_path)],
121+
)
122+
};
123+
detect_browser_version(self.browser_name, shell, flag, args)
124+
}
125+
_ => None,
126+
}
78127
}
79128

80129
fn get_driver_name(&self) -> &str {

rust/src/firefox.rs

+65-20
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,19 @@
1515
// specific language governing permissions and limitations
1616
// under the License.
1717

18+
use std::collections::HashMap;
1819
use std::error::Error;
1920
use std::path::PathBuf;
2021

2122
use crate::downloads::read_redirect_from_link;
2223
use crate::files::compose_driver_path_in_cache;
2324
use crate::manager::ARCH::{ARM64, X32};
24-
use crate::manager::OS::{MACOS, WINDOWS};
25-
use crate::manager::{detect_browser_version, get_minor_version, BrowserManager};
25+
use crate::manager::OS::{LINUX, MACOS, WINDOWS};
26+
use crate::manager::{
27+
detect_browser_version, format_one_arg, format_two_args, get_minor_version, BrowserManager,
28+
BrowserPath, BETA, DASH_VERSION, DEV, ENV_PROGRAM_FILES, ENV_PROGRAM_FILES_X86, NIGHTLY,
29+
STABLE, WMIC_COMMAND,
30+
};
2631
use crate::metadata::{
2732
create_driver_metadata, get_driver_version_from_metadata, get_metadata, write_metadata,
2833
};
@@ -51,26 +56,66 @@ impl BrowserManager for FirefoxManager {
5156
self.browser_name
5257
}
5358

54-
fn get_browser_version(&self, os: &str) -> Option<String> {
55-
let (shell, flag, args) = if WINDOWS.is(os) {
59+
fn get_browser_path_map(&self) -> HashMap<BrowserPath, &str> {
60+
HashMap::from([
5661
(
57-
"cmd",
58-
"/C",
59-
vec![
60-
r#"cmd.exe /C wmic datafile where name='%PROGRAMFILES:\=\\%\\Mozilla Firefox\\firefox.exe' get Version /value"#,
61-
r#"cmd.exe /C wmic datafile where name='%PROGRAMFILES(X86):\=\\%\\Mozilla Firefox\\firefox.exe' get Version /value' get Version /value"#,
62-
],
63-
)
64-
} else if MACOS.is(os) {
62+
BrowserPath::new(WINDOWS, STABLE),
63+
r#"\\Mozilla Firefox\\firefox.exe"#,
64+
),
6565
(
66-
"sh",
67-
"-c",
68-
vec![r#"/Applications/Firefox.app/Contents/MacOS/firefox -v"#],
69-
)
70-
} else {
71-
("sh", "-c", vec!["firefox -v"])
72-
};
73-
detect_browser_version(self.browser_name, shell, flag, args)
66+
BrowserPath::new(WINDOWS, BETA),
67+
r#"\\Mozilla Firefox\\firefox.exe"#,
68+
),
69+
(
70+
BrowserPath::new(WINDOWS, DEV),
71+
r#"\\Firefox Developer Edition\\firefox.exe"#,
72+
),
73+
(
74+
BrowserPath::new(WINDOWS, NIGHTLY),
75+
r#"\\Firefox Nightly\\firefox.exe"#,
76+
),
77+
(
78+
BrowserPath::new(MACOS, STABLE),
79+
r#"/Applications/Firefox.app/Contents/MacOS/firefox"#,
80+
),
81+
(
82+
BrowserPath::new(MACOS, BETA),
83+
r#"/Applications/Firefox.app/Contents/MacOS/firefox"#,
84+
),
85+
(
86+
BrowserPath::new(MACOS, DEV),
87+
r#"/Applications/Firefox\ Developer\ Edition.app/Contents/MacOS/firefox"#,
88+
),
89+
(
90+
BrowserPath::new(MACOS, NIGHTLY),
91+
r#"/Applications/Firefox\ Nightly.app/Contents/MacOS/firefox"#,
92+
),
93+
(BrowserPath::new(LINUX, STABLE), "firefox"),
94+
(BrowserPath::new(LINUX, BETA), "firefox"),
95+
(BrowserPath::new(LINUX, DEV), "firefox"),
96+
(BrowserPath::new(LINUX, NIGHTLY), "firefox-trunk"),
97+
])
98+
}
99+
100+
fn get_browser_version(&self, os: &str, browser_version: &str) -> Option<String> {
101+
match self.get_browser_path(os, browser_version) {
102+
Some(browser_path) => {
103+
let (shell, flag, args) = if WINDOWS.is(os) {
104+
(
105+
"cmd",
106+
"/C",
107+
vec![
108+
format_two_args(WMIC_COMMAND, ENV_PROGRAM_FILES, browser_path),
109+
format_two_args(WMIC_COMMAND, ENV_PROGRAM_FILES_X86, browser_path),
110+
],
111+
)
112+
} else {
113+
("sh", "-c", vec![format_one_arg(DASH_VERSION, browser_path)])
114+
};
115+
detect_browser_version(self.browser_name, shell, flag, args)
116+
}
117+
_ => None,
118+
}
74119
}
75120

76121
fn get_driver_name(&self) -> &str {

rust/src/iexplorer.rs

+7-2
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,14 @@
1515
// specific language governing permissions and limitations
1616
// under the License.
1717

18+
use std::collections::HashMap;
1819
use std::error::Error;
1920
use std::path::PathBuf;
2021

2122
use crate::downloads::read_redirect_from_link;
2223
use crate::files::compose_driver_path_in_cache;
2324

24-
use crate::manager::{get_minor_version, BrowserManager};
25+
use crate::manager::{get_minor_version, BrowserManager, BrowserPath};
2526

2627
use crate::metadata::{
2728
create_driver_metadata, get_driver_version_from_metadata, get_metadata, write_metadata,
@@ -51,7 +52,11 @@ impl BrowserManager for IExplorerManager {
5152
self.browser_name
5253
}
5354

54-
fn get_browser_version(&self, _os: &str) -> Option<String> {
55+
fn get_browser_path_map(&self) -> HashMap<BrowserPath, &str> {
56+
HashMap::new()
57+
}
58+
59+
fn get_browser_version(&self, _os: &str, _browser_version: &str) -> Option<String> {
5560
None
5661
}
5762

0 commit comments

Comments
 (0)