@@ -22,6 +22,7 @@ use crate::firefox::FirefoxManager;
2222use crate :: iexplorer:: IExplorerManager ;
2323use std:: fs;
2424
25+ use crate :: config:: OS :: WINDOWS ;
2526use crate :: config:: { str_to_os, ManagerConfig } ;
2627use reqwest:: { Client , ClientBuilder , Proxy } ;
2728use std:: collections:: HashMap ;
@@ -62,6 +63,8 @@ pub const ENV_PROGRAM_FILES: &str = "PROGRAMFILES";
6263pub const ENV_PROGRAM_FILES_X86 : & str = "PROGRAMFILES(X86)" ;
6364pub const ENV_LOCALAPPDATA : & str = "LOCALAPPDATA" ;
6465pub const FALLBACK_RETRIES : u32 = 5 ;
66+ pub const WHERE_COMMAND : & str = "where {}" ;
67+ pub const WHICH_COMMAND : & str = "which {}" ;
6568
6669pub trait SeleniumManager {
6770 // ----------------------------------------------------------
@@ -217,6 +220,45 @@ pub trait SeleniumManager {
217220 Ok ( driver_version)
218221 }
219222
223+ fn find_driver_in_path ( & self ) -> ( Option < String > , Option < String > ) {
224+ let ( shell, flag) = self . get_shell_command ( ) ;
225+ match self . run_shell_command (
226+ shell,
227+ flag,
228+ self . format_one_arg ( DASH_DASH_VERSION , self . get_driver_name ( ) ) ,
229+ ) {
230+ Ok ( output) => {
231+ let parsed_version = parse_version ( output) . unwrap_or_default ( ) ;
232+ if !parsed_version. is_empty ( ) {
233+ let which_command = if WINDOWS . is ( self . get_os ( ) ) {
234+ WHERE_COMMAND
235+ } else {
236+ WHICH_COMMAND
237+ } ;
238+ let driver_path = match self . run_shell_command (
239+ shell,
240+ flag,
241+ self . format_one_arg ( which_command, self . get_driver_name ( ) ) ,
242+ ) {
243+ Ok ( path) => Some ( path) ,
244+ Err ( _) => None ,
245+ } ;
246+ return ( Some ( parsed_version) , driver_path) ;
247+ }
248+ ( None , None )
249+ }
250+ Err ( _) => ( None , None ) ,
251+ }
252+ }
253+
254+ fn get_shell_command ( & self ) -> ( & str , & str ) {
255+ if WINDOWS . is ( self . get_os ( ) ) {
256+ ( "cmd" , "/C" )
257+ } else {
258+ ( "sh" , "-c" )
259+ }
260+ }
261+
220262 fn is_browser_version_unstable ( & self ) -> bool {
221263 let browser_version = self . get_browser_version ( ) ;
222264 browser_version. eq_ignore_ascii_case ( BETA )
@@ -231,6 +273,27 @@ pub trait SeleniumManager {
231273 self . set_driver_version ( driver_version) ;
232274 }
233275
276+ let ( in_path_driver_version, in_path_driver_path) = self . find_driver_in_path ( ) ;
277+ if let ( Some ( found_driver_version) , Some ( found_driver_path) ) =
278+ ( in_path_driver_version, in_path_driver_path)
279+ {
280+ if found_driver_version. eq ( self . get_driver_version ( ) ) {
281+ self . get_logger ( ) . debug ( format ! (
282+ "Found {} {} in PATH: {}" ,
283+ self . get_driver_name( ) ,
284+ found_driver_version,
285+ found_driver_path
286+ ) ) ;
287+ return Ok ( PathBuf :: from ( found_driver_path) ) ;
288+ } else {
289+ self . get_logger ( ) . warn ( format ! (
290+ "Incompatible release of {} (version {}) detected in PATH: {}" ,
291+ self . get_driver_name( ) ,
292+ found_driver_version,
293+ found_driver_path
294+ ) ) ;
295+ }
296+ }
234297 let driver_path = self . get_driver_path_in_cache ( ) ;
235298 if driver_path. exists ( ) {
236299 self . get_logger ( ) . debug ( format ! (
@@ -255,7 +318,10 @@ pub trait SeleniumManager {
255318 let output = Command :: new ( command) . args ( [ flag, args. as_str ( ) ] ) . output ( ) ?;
256319 self . get_logger ( ) . debug ( format ! ( "{:?}" , output) ) ;
257320
258- Ok ( String :: from_utf8_lossy ( & output. stdout ) . to_string ( ) )
321+ Ok (
322+ strip_trailing_newline ( String :: from_utf8_lossy ( & output. stdout ) . to_string ( ) . as_str ( ) )
323+ . to_string ( ) ,
324+ )
259325 }
260326
261327 fn get_major_version ( & self , full_version : & str ) -> Result < String , Box < dyn Error > > {
@@ -454,3 +520,10 @@ pub fn http_client_builder() -> ClientBuilder {
454520 . danger_accept_invalid_certs ( true )
455521 . use_rustls_tls ( )
456522}
523+
524+ fn strip_trailing_newline ( input : & str ) -> & str {
525+ input
526+ . strip_suffix ( "\r \n " )
527+ . or_else ( || input. strip_suffix ( '\n' ) )
528+ . unwrap_or ( input)
529+ }
0 commit comments