@@ -20,6 +20,7 @@ use crate::edge::EdgeManager;
20
20
use crate :: files:: compose_cache_folder;
21
21
use crate :: firefox:: FirefoxManager ;
22
22
use crate :: iexplorer:: IExplorerManager ;
23
+ use crate :: safari:: { SafariManager , SAFARI } ;
23
24
use std:: fs;
24
25
25
26
use crate :: config:: OS :: WINDOWS ;
@@ -37,6 +38,7 @@ use crate::logger::Logger;
37
38
use crate :: metadata:: {
38
39
create_browser_metadata, get_browser_version_from_metadata, get_metadata, write_metadata,
39
40
} ;
41
+ use crate :: safaritp:: SafariTPManager ;
40
42
41
43
pub mod chrome;
42
44
pub mod config;
@@ -47,6 +49,8 @@ pub mod firefox;
47
49
pub mod iexplorer;
48
50
pub mod logger;
49
51
pub mod metadata;
52
+ pub mod safari;
53
+ pub mod safaritp;
50
54
51
55
pub const REQUEST_TIMEOUT_SEC : u64 = 120 ; // The timeout is applied from when the request starts connecting until the response body has finished
52
56
pub const STABLE : & str = "stable" ;
@@ -57,6 +61,8 @@ pub const NIGHTLY: &str = "nightly";
57
61
pub const WMIC_COMMAND : & str = r#"wmic datafile where name='{}' get Version /value"# ;
58
62
pub const WMIC_COMMAND_ENV : & str = r#"wmic datafile where name='%{}:\=\\%{}' get Version /value"# ;
59
63
pub const REG_QUERY : & str = r#"REG QUERY {} /v version"# ;
64
+ pub const PLIST_COMMAND : & str =
65
+ r#"/usr/libexec/PlistBuddy -c "print :CFBundleShortVersionString" {}/Contents/Info.plist"# ;
60
66
pub const DASH_VERSION : & str = "{} -v" ;
61
67
pub const DASH_DASH_VERSION : & str = "{} --version" ;
62
68
pub const ENV_PROGRAM_FILES : & str = "PROGRAMFILES" ;
@@ -160,11 +166,12 @@ pub trait SeleniumManager {
160
166
}
161
167
break ;
162
168
}
163
-
164
- metadata
165
- . browsers
166
- . push ( create_browser_metadata ( browser_name, & browser_version) ) ;
167
- write_metadata ( & metadata, self . get_logger ( ) ) ;
169
+ if !self . is_safari ( ) {
170
+ metadata
171
+ . browsers
172
+ . push ( create_browser_metadata ( browser_name, & browser_version) ) ;
173
+ write_metadata ( & metadata, self . get_logger ( ) ) ;
174
+ }
168
175
if !browser_version. is_empty ( ) {
169
176
Some ( browser_version)
170
177
} else {
@@ -179,12 +186,14 @@ pub trait SeleniumManager {
179
186
if browser_version. is_empty ( ) || self . is_browser_version_unstable ( ) {
180
187
match self . discover_browser_version ( ) {
181
188
Some ( version) => {
182
- self . get_logger ( ) . debug ( format ! (
183
- "Detected browser: {} {}" ,
184
- self . get_browser_name( ) ,
185
- version
186
- ) ) ;
187
- self . set_browser_version ( version) ;
189
+ if !self . is_safari ( ) {
190
+ self . get_logger ( ) . debug ( format ! (
191
+ "Detected browser: {} {}" ,
192
+ self . get_browser_name( ) ,
193
+ version
194
+ ) ) ;
195
+ self . set_browser_version ( version) ;
196
+ }
188
197
}
189
198
None => {
190
199
if self . is_browser_version_unstable ( ) {
@@ -247,6 +256,10 @@ pub trait SeleniumManager {
247
256
}
248
257
}
249
258
259
+ fn is_safari ( & self ) -> bool {
260
+ self . get_browser_name ( ) . contains ( SAFARI )
261
+ }
262
+
250
263
fn is_browser_version_unstable ( & self ) -> bool {
251
264
let browser_version = self . get_browser_version ( ) ;
252
265
browser_version. eq_ignore_ascii_case ( BETA )
@@ -261,34 +274,38 @@ pub trait SeleniumManager {
261
274
self . set_driver_version ( driver_version) ;
262
275
}
263
276
264
- let ( in_path_driver_version, in_path_driver_path) = self . find_driver_in_path ( ) ;
265
- if let ( Some ( found_driver_version) , Some ( found_driver_path) ) =
266
- ( in_path_driver_version, in_path_driver_path)
267
- {
268
- if found_driver_version. eq ( self . get_driver_version ( ) ) {
269
- self . get_logger ( ) . debug ( format ! (
270
- "Found {} {} in PATH: {}" ,
271
- self . get_driver_name( ) ,
272
- found_driver_version,
273
- found_driver_path
274
- ) ) ;
275
- return Ok ( PathBuf :: from ( found_driver_path) ) ;
276
- } else {
277
- self . get_logger ( ) . warn ( format ! (
278
- "Incompatible release of {} (version {}) detected in PATH: {}" ,
279
- self . get_driver_name( ) ,
280
- found_driver_version,
281
- found_driver_path
282
- ) ) ;
277
+ if !self . is_safari ( ) {
278
+ let ( in_path_driver_version, in_path_driver_path) = self . find_driver_in_path ( ) ;
279
+ if let ( Some ( found_driver_version) , Some ( found_driver_path) ) =
280
+ ( in_path_driver_version, in_path_driver_path)
281
+ {
282
+ if found_driver_version. eq ( self . get_driver_version ( ) ) {
283
+ self . get_logger ( ) . debug ( format ! (
284
+ "Found {} {} in PATH: {}" ,
285
+ self . get_driver_name( ) ,
286
+ found_driver_version,
287
+ found_driver_path
288
+ ) ) ;
289
+ return Ok ( PathBuf :: from ( found_driver_path) ) ;
290
+ } else {
291
+ self . get_logger ( ) . warn ( format ! (
292
+ "Incompatible release of {} (version {}) detected in PATH: {}" ,
293
+ self . get_driver_name( ) ,
294
+ found_driver_version,
295
+ found_driver_path
296
+ ) ) ;
297
+ }
283
298
}
284
299
}
285
300
let driver_path = self . get_driver_path_in_cache ( ) ;
286
301
if driver_path. exists ( ) {
287
- self . get_logger ( ) . debug ( format ! (
288
- "{} {} already in the cache" ,
289
- self . get_driver_name( ) ,
290
- self . get_driver_version( )
291
- ) ) ;
302
+ if !self . is_safari ( ) {
303
+ self . get_logger ( ) . debug ( format ! (
304
+ "{} {} already in the cache" ,
305
+ self . get_driver_name( ) ,
306
+ self . get_driver_version( )
307
+ ) ) ;
308
+ }
292
309
} else {
293
310
self . download_driver ( ) ?;
294
311
}
@@ -434,6 +451,17 @@ pub fn get_manager_by_browser(browser_name: String) -> Result<Box<dyn SeleniumMa
434
451
. contains ( & browser_name_lower_case. as_str ( ) )
435
452
{
436
453
Ok ( IExplorerManager :: new ( ) )
454
+ } else if browser_name. eq ( "safari" ) {
455
+ Ok ( SafariManager :: new ( ) )
456
+ } else if vec ! [
457
+ "safari technology preview" ,
458
+ r#"safari\ technology\ preview"# ,
459
+ "safaritechnologypreview" ,
460
+ "safaritp" ,
461
+ ]
462
+ . contains ( & browser_name_lower_case. as_str ( ) )
463
+ {
464
+ Ok ( SafariTPManager :: new ( ) )
437
465
} else {
438
466
Err ( format ! ( "Invalid browser name: {browser_name}" ) )
439
467
}
@@ -448,6 +476,8 @@ pub fn get_manager_by_driver(driver_name: String) -> Result<Box<dyn SeleniumMana
448
476
Ok ( EdgeManager :: new ( ) )
449
477
} else if driver_name. eq_ignore_ascii_case ( "iedriverserver" ) {
450
478
Ok ( IExplorerManager :: new ( ) )
479
+ } else if driver_name. eq_ignore_ascii_case ( "safaridriver" ) {
480
+ Ok ( SafariManager :: new ( ) )
451
481
} else {
452
482
Err ( format ! ( "Invalid driver name: {driver_name}" ) )
453
483
}
0 commit comments