25
25
from selenium .webdriver .remote .webdriver import (
26
26
WebDriver as RemoteWebDriver ,
27
27
)
28
+ from selenium .webdriver .chrome .options import Options as _ChromeOptions
29
+ from selenium .webdriver .chrome .service import Service as _ChromeService
30
+ from selenium .webdriver .firefox .options import Options as _FirefoxOptions
31
+ from selenium .webdriver .firefox .service import Service as _FirefoxService
28
32
except ImportError :
29
33
webdriver = None
30
34
@@ -117,33 +121,37 @@ def webdriver(self):
117
121
def driver (self ):
118
122
raise NotImplementedError ('driver property must be supplied' )
119
123
124
+ @property
125
+ def service_class (self ):
126
+ raise NotImplementedError ('service_class property must be supplied' )
127
+
128
+ @property
129
+ def options_class (self ):
130
+ raise NotImplementedError ('options_class property must be supplied' )
131
+
120
132
@property
121
133
def browser (self ) -> RemoteWebDriver :
122
134
return self ._browser
123
135
124
- def get_driver_arguments (self , ** kwargs ):
125
- """ Returns a dict ready for driver initialization, base locates the driver.
136
+ def get_driver_options (self ):
137
+ return self . options_class ()
126
138
127
- Args :
128
- **kwargs: other keyword params to pass
139
+ def get_driver_service ( self ) :
140
+ service = self . service_class ()
129
141
130
- Returns:
131
- dict
132
- """
142
+ if not WEBDRIVER_IN_PATH :
133
143
134
- if WEBDRIVER_IN_PATH :
135
- return kwargs
144
+ try :
145
+ binary = self .binary_location ()
146
+ except FileNotFoundError :
147
+ # If the binary file could not be found, run a version check
148
+ # which will download the latest by default.
149
+ self .check_driver_version ()
150
+ binary = self .binary_location ()
136
151
137
- try :
138
- binary = self .binary_location ()
139
- except FileNotFoundError :
140
- # If the binary file could not be found, run a version check
141
- # which will download the latest by default.
142
- self .check_driver_version ()
143
- binary = self .binary_location ()
152
+ service .path = binary
144
153
145
- kwargs .update ({'executable_path' : binary })
146
- return kwargs
154
+ return service
147
155
148
156
def start (self ):
149
157
""" Starts the driver and browser with all options. """
@@ -153,8 +161,10 @@ def start(self):
153
161
if self ._check_driver_version_allowed ():
154
162
self .check_driver_version ()
155
163
156
- options = self .get_driver_arguments ()
157
- self ._browser = self .webdriver (** options )
164
+ options = self .get_driver_options ()
165
+ service = self .get_driver_service ()
166
+
167
+ self ._browser = self .webdriver (options = options , service = service )
158
168
159
169
return self .browser
160
170
@@ -293,44 +303,25 @@ def get_driver_version(self):
293
303
log .debug (f'{ self .__class__ .__name__ } binary version: found { version } ' )
294
304
return version
295
305
296
- def _get_active_profile_data_directory (self ):
297
- raise NotImplementedError
298
-
299
306
300
307
class ChromeDriver (DriverBase ):
301
308
webdriver = webdriver .Chrome
302
309
driver = 'chromedriver.exe' if IS_WINDOWS_OS else 'chromedriver'
310
+ service_class = _ChromeService
311
+ options_class = _ChromeOptions
303
312
304
- def __init__ (self , user_data_directory = None , user_data_profile = None , ** kwargs ):
305
- self ._user_data_directory = user_data_directory
306
- self ._user_data_profile = user_data_profile
313
+ def __init__ (self , ** kwargs ):
307
314
super ().__init__ (** kwargs )
308
315
309
316
if self .headless and not self .user_agent :
310
317
# Headless Chrome sends a user agent telling the website its headless. Lets override that.
311
318
self .user_agent = f'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 ' \
312
319
f'(KHTML, like Gecko) Chrome/{ utils .chrome_version ()} Safari/537.36'
313
320
314
- def get_browser_user_data_directory (self ):
315
- # Where is the user data directory?
316
- return self ._user_data_directory
317
-
318
- def get_browser_user_data_profile (self ):
319
- # Which profile within the user_data_directory do we need to load?
320
- return self ._user_data_profile
321
-
322
- def get_browser_options (self ):
323
- options = webdriver .ChromeOptions ()
321
+ def get_driver_options (self ):
322
+ options = super ().get_driver_options ()
324
323
options .headless = self .headless
325
324
326
- uddir = self .get_browser_user_data_directory ()
327
- if uddir :
328
- options .add_argument (f"--user-data-dir={ uddir } " )
329
-
330
- uddprofile = self .get_browser_user_data_profile ()
331
- if uddprofile :
332
- options .add_argument (f'--profile-directory={ uddprofile } ' )
333
-
334
325
if self .download_directory :
335
326
options .add_experimental_option ('prefs' , {
336
327
'download.default_directory' : self .download_directory
@@ -341,11 +332,6 @@ def get_browser_options(self):
341
332
342
333
return options
343
334
344
- def get_driver_arguments (self ):
345
- return super ().get_driver_arguments (
346
- options = self .get_browser_options (),
347
- )
348
-
349
335
def get_browser_version (self ):
350
336
capabilities = self .get_capabilities ()
351
337
try :
@@ -435,50 +421,29 @@ def check_driver_version(self):
435
421
extracting_file = self .driver
436
422
)
437
423
438
- def _get_active_profile_data_directory (self ):
439
- capabilities = self .get_capabilities ()
440
- return capabilities ['chrome' ]['userDataDir' ]
441
-
442
424
443
425
class FirefoxDriver (DriverBase ):
444
426
driver = 'geckodriver.exe' if IS_WINDOWS_OS else 'geckodriver'
445
427
webdriver = webdriver .Firefox
428
+ service_class = _FirefoxService
429
+ options_class = _FirefoxOptions
446
430
447
- def __init__ (self , profile_directory = None , ** kwargs ):
448
- self ._profile_directory = profile_directory
449
- super ().__init__ (** kwargs )
450
-
451
- def get_browser_profile_directory (self ):
452
- return self ._profile_directory
453
-
454
- def get_browser_profile (self ):
455
- profile = webdriver .FirefoxProfile (
456
- profile_directory = self .get_browser_profile_directory ()
457
- )
431
+ def get_driver_options (self ):
432
+ options = super ().get_driver_options ()
433
+ options .headless = self .headless
458
434
459
435
if self .download_directory :
460
- profile .set_preference ('browser.download.folderList' , 2 )
461
- profile .set_preference ('pdfjs.disabled' , True )
462
- profile .set_preference ('browser.download.dir' , self .download_directory )
463
- profile .set_preference ("browser.helperApps.neverAsk.saveToDisk" , get_mime_types_as_str (joiner = ',' ))
464
- profile .set_preference ('browser.helperApps.alwaysAsk.force' , False )
436
+ options .set_preference ('browser.download.folderList' , 2 )
437
+ options .set_preference ('pdfjs.disabled' , True )
438
+ options .set_preference ('browser.download.dir' , self .download_directory )
439
+ options .set_preference ("browser.helperApps.neverAsk.saveToDisk" , get_mime_types_as_str (joiner = ',' ))
440
+ options .set_preference ('browser.helperApps.alwaysAsk.force' , False )
465
441
466
442
if self .user_agent :
467
- profile .set_preference ("general.useragent.override" , self .user_agent )
443
+ options .set_preference ("general.useragent.override" , self .user_agent )
468
444
469
- return profile
470
-
471
- def get_browser_options (self ):
472
- options = webdriver .FirefoxOptions ()
473
- options .headless = self .headless
474
445
return options
475
446
476
- def get_driver_arguments (self ):
477
- return super ().get_driver_arguments (
478
- options = self .get_browser_options (),
479
- firefox_profile = self .get_browser_profile ()
480
- )
481
-
482
447
def get_driver_version (self ):
483
448
try :
484
449
version = super ().get_driver_version ()
@@ -551,7 +516,3 @@ def check_driver_version(self):
551
516
local_zip_file = local_zip_file ,
552
517
extracting_file = self .driver
553
518
)
554
-
555
- def _get_active_profile_data_directory (self ):
556
- capabilities = self .get_capabilities ()
557
- return capabilities ["moz:profile" ]
0 commit comments