@@ -21,8 +21,9 @@ use crate::config::{str_to_os, ManagerConfig};
21
21
use crate :: downloads:: download_to_tmp_folder;
22
22
use crate :: edge:: { EdgeManager , EDGEDRIVER_NAME , EDGE_NAMES , WEBVIEW2_NAME } ;
23
23
use crate :: files:: {
24
- create_parent_path_if_not_exists, create_path_if_not_exists, default_cache_folder,
25
- get_binary_extension, path_to_string,
24
+ capitalize, collect_files_from_cache, create_parent_path_if_not_exists,
25
+ create_path_if_not_exists, default_cache_folder, find_latest_from_cache, get_binary_extension,
26
+ path_to_string,
26
27
} ;
27
28
use crate :: files:: { parse_version, uncompress, BrowserPath } ;
28
29
use crate :: firefox:: { FirefoxManager , FIREFOX_NAME , GECKODRIVER_NAME } ;
@@ -45,7 +46,7 @@ use std::collections::HashMap;
45
46
use std:: path:: { Path , PathBuf } ;
46
47
use std:: time:: Duration ;
47
48
use std:: { env, fs} ;
48
- use walkdir:: { DirEntry , WalkDir } ;
49
+ use walkdir:: DirEntry ;
49
50
50
51
pub mod chrome;
51
52
pub mod config;
@@ -842,13 +843,34 @@ pub trait SeleniumManager {
842
843
}
843
844
}
844
845
846
+ fn is_browser ( & self , entry : & DirEntry ) -> bool {
847
+ if MACOS . is ( self . get_os ( ) ) && !self . is_firefox ( ) {
848
+ let entry_path = path_to_string ( entry. path ( ) ) ;
849
+ self . is_in_cache ( entry, & capitalize ( self . get_browser_name ( ) ) )
850
+ && entry_path. contains ( ".app/Contents/MacOS" )
851
+ && !entry_path. contains ( "Framework" )
852
+ } else {
853
+ self . is_in_cache ( entry, & self . get_browser_name_with_extension ( ) )
854
+ }
855
+ }
856
+
845
857
fn is_driver ( & self , entry : & DirEntry ) -> bool {
858
+ self . is_in_cache ( entry, & self . get_driver_name_with_extension ( ) )
859
+ }
860
+
861
+ fn is_in_cache ( & self , entry : & DirEntry , file_name : & str ) -> bool {
846
862
let is_file = entry. path ( ) . is_file ( ) ;
847
863
848
- let is_driver = entry
864
+ let is_file_name = entry
849
865
. file_name ( )
850
866
. to_str ( )
851
- . map ( |s| s. contains ( & self . get_driver_name_with_extension ( ) ) )
867
+ . map ( |s| {
868
+ if MACOS . is ( self . get_os ( ) ) && !self . is_firefox ( ) {
869
+ s. contains ( file_name)
870
+ } else {
871
+ s. ends_with ( file_name)
872
+ }
873
+ } )
852
874
. unwrap_or ( false ) ;
853
875
854
876
let match_os = entry
@@ -857,7 +879,7 @@ pub trait SeleniumManager {
857
879
. map ( |s| s. contains ( self . get_platform_label ( ) ) )
858
880
. unwrap_or ( false ) ;
859
881
860
- is_file && is_driver && match_os
882
+ is_file && is_file_name && match_os
861
883
}
862
884
863
885
fn is_driver_and_matches_browser_version ( & self , entry : & DirEntry ) -> bool {
@@ -876,14 +898,34 @@ pub trait SeleniumManager {
876
898
self . is_driver ( entry) && match_driver_version
877
899
}
878
900
901
+ fn get_browser_path_or_latest_from_cache ( & self ) -> String {
902
+ let mut browser_path = self . get_browser_path ( ) . to_string ( ) ;
903
+ if browser_path. is_empty ( ) {
904
+ let best_browser_from_cache = & self
905
+ . find_best_browser_from_cache ( )
906
+ . unwrap_or_default ( )
907
+ . unwrap_or_default ( ) ;
908
+ if best_browser_from_cache. exists ( ) {
909
+ self . get_logger ( ) . warn ( format ! (
910
+ "There was an error managing {}; using browser found in the cache" ,
911
+ self . get_browser_name( )
912
+ ) ) ;
913
+ browser_path = path_to_string ( best_browser_from_cache) ;
914
+ }
915
+ }
916
+ browser_path
917
+ }
918
+
919
+ fn find_best_browser_from_cache ( & self ) -> Result < Option < PathBuf > , Error > {
920
+ let cache_path = self . get_cache_path ( ) ?. unwrap_or_default ( ) ;
921
+ find_latest_from_cache ( & cache_path, |entry| self . is_browser ( entry) )
922
+ }
923
+
879
924
fn find_best_driver_from_cache ( & self ) -> Result < Option < PathBuf > , Error > {
880
925
let cache_path = self . get_cache_path ( ) ?. unwrap_or_default ( ) ;
881
- let drivers_in_cache_matching_version: Vec < PathBuf > = WalkDir :: new ( & cache_path)
882
- . into_iter ( )
883
- . filter_map ( |entry| entry. ok ( ) )
884
- . filter ( |entry| self . is_driver_and_matches_browser_version ( entry) )
885
- . map ( |entry| entry. path ( ) . to_owned ( ) )
886
- . collect ( ) ;
926
+ let drivers_in_cache_matching_version = collect_files_from_cache ( & cache_path, |entry| {
927
+ self . is_driver_and_matches_browser_version ( entry)
928
+ } ) ;
887
929
888
930
// First we look for drivers in cache that matches browser version (should work for Chrome and Edge)
889
931
if !drivers_in_cache_matching_version. is_empty ( ) {
@@ -896,17 +938,7 @@ pub trait SeleniumManager {
896
938
) )
897
939
} else {
898
940
// If not available, we look for the latest available driver in the cache
899
- let drivers_in_cache: Vec < PathBuf > = WalkDir :: new ( & cache_path)
900
- . into_iter ( )
901
- . filter_map ( |entry| entry. ok ( ) )
902
- . filter ( |entry| self . is_driver ( entry) )
903
- . map ( |entry| entry. path ( ) . to_owned ( ) )
904
- . collect ( ) ;
905
- if !drivers_in_cache. is_empty ( ) {
906
- Ok ( Some ( drivers_in_cache. iter ( ) . last ( ) . unwrap ( ) . to_owned ( ) ) )
907
- } else {
908
- Ok ( None )
909
- }
941
+ find_latest_from_cache ( & cache_path, |entry| self . is_driver ( entry) )
910
942
}
911
943
}
912
944
0 commit comments