11
11
from seleniumbase .config import proxy_list
12
12
from seleniumbase .core import download_helper
13
13
from seleniumbase .core import proxy_helper
14
+ from seleniumbase .core import capabilities_parser
14
15
from seleniumbase .fixtures import constants
15
16
from seleniumbase .fixtures import page_utils
16
17
from seleniumbase import drivers # webdriver storage folder for SeleniumBase
@@ -187,7 +188,8 @@ def validate_proxy_string(proxy_string):
187
188
188
189
189
190
def get_driver (browser_name , headless = False , use_grid = False ,
190
- servername = 'localhost' , port = 4444 , proxy_string = None ):
191
+ servername = 'localhost' , port = 4444 , proxy_string = None ,
192
+ cap_file = None ):
191
193
proxy_auth = False
192
194
proxy_user = None
193
195
proxy_pass = None
@@ -216,7 +218,7 @@ def get_driver(browser_name, headless=False, use_grid=False,
216
218
if use_grid :
217
219
return get_remote_driver (
218
220
browser_name , headless , servername , port , proxy_string , proxy_auth ,
219
- proxy_user , proxy_pass )
221
+ proxy_user , proxy_pass , cap_file )
220
222
else :
221
223
return get_local_driver (
222
224
browser_name , headless , proxy_string , proxy_auth ,
@@ -225,20 +227,31 @@ def get_driver(browser_name, headless=False, use_grid=False,
225
227
226
228
def get_remote_driver (
227
229
browser_name , headless , servername , port , proxy_string , proxy_auth ,
228
- proxy_user , proxy_pass ):
230
+ proxy_user , proxy_pass , cap_file ):
229
231
downloads_path = download_helper .get_downloads_folder ()
230
232
download_helper .reset_downloads_folder ()
231
233
address = "http://%s:%s/wd/hub" % (servername , port )
234
+ desired_caps = {}
235
+ if cap_file :
236
+ desired_caps = capabilities_parser .get_desired_capabilities (cap_file )
232
237
233
238
if browser_name == constants .Browser .GOOGLE_CHROME :
234
239
chrome_options = _set_chrome_options (
235
240
downloads_path , proxy_string , proxy_auth ,
236
241
proxy_user , proxy_pass )
237
242
if headless :
238
- chrome_options .add_argument ("--headless" )
243
+ if not proxy_auth :
244
+ # Headless Chrome doesn't support extensions, which are
245
+ # required when using a proxy server that has authentication.
246
+ # Instead, base_case.py will use PyVirtualDisplay when not
247
+ # using Chrome's built-in headless mode. See link for details:
248
+ # https://bugs.chromium.org/p/chromium/issues/detail?id=706008
249
+ chrome_options .add_argument ("--headless" )
239
250
chrome_options .add_argument ("--disable-gpu" )
240
251
chrome_options .add_argument ("--no-sandbox" )
241
252
capabilities = chrome_options .to_capabilities ()
253
+ for key in desired_caps .keys ():
254
+ capabilities [key ] = desired_caps [key ]
242
255
return webdriver .Remote (
243
256
command_executor = address ,
244
257
desired_capabilities = capabilities )
@@ -251,6 +264,8 @@ def get_remote_driver(
251
264
if headless :
252
265
firefox_capabilities ['moz:firefoxOptions' ] = (
253
266
{'args' : ['-headless' ]})
267
+ for key in desired_caps .keys ():
268
+ firefox_capabilities [key ] = desired_caps [key ]
254
269
capabilities = firefox_capabilities
255
270
address = "http://%s:%s/wd/hub" % (servername , port )
256
271
return webdriver .Remote (
@@ -265,39 +280,76 @@ def get_remote_driver(
265
280
if headless :
266
281
firefox_capabilities ['moz:firefoxOptions' ] = (
267
282
{'args' : ['-headless' ]})
283
+ for key in desired_caps .keys ():
284
+ firefox_capabilities [key ] = desired_caps [key ]
268
285
capabilities = firefox_capabilities
269
286
return webdriver .Remote (
270
287
command_executor = address ,
271
288
desired_capabilities = capabilities ,
272
289
browser_profile = profile )
273
290
elif browser_name == constants .Browser .INTERNET_EXPLORER :
291
+ capabilities = webdriver .DesiredCapabilities .INTERNETEXPLORER
292
+ for key in desired_caps .keys ():
293
+ capabilities [key ] = desired_caps [key ]
274
294
return webdriver .Remote (
275
295
command_executor = address ,
276
- desired_capabilities = (
277
- webdriver .DesiredCapabilities .INTERNETEXPLORER ))
296
+ desired_capabilities = capabilities )
278
297
elif browser_name == constants .Browser .EDGE :
298
+ capabilities = webdriver .DesiredCapabilities .EDGE
299
+ for key in desired_caps .keys ():
300
+ capabilities [key ] = desired_caps [key ]
279
301
return webdriver .Remote (
280
302
command_executor = address ,
281
- desired_capabilities = (
282
- webdriver .DesiredCapabilities .EDGE ))
303
+ desired_capabilities = capabilities )
283
304
elif browser_name == constants .Browser .SAFARI :
305
+ capabilities = webdriver .DesiredCapabilities .SAFARI
306
+ for key in desired_caps .keys ():
307
+ capabilities [key ] = desired_caps [key ]
284
308
return webdriver .Remote (
285
309
command_executor = address ,
286
- desired_capabilities = (
287
- webdriver .DesiredCapabilities .SAFARI ))
310
+ desired_capabilities = capabilities )
288
311
elif browser_name == constants .Browser .OPERA :
312
+ capabilities = webdriver .DesiredCapabilities .OPERA
313
+ for key in desired_caps .keys ():
314
+ capabilities [key ] = desired_caps [key ]
289
315
return webdriver .Remote (
290
316
command_executor = address ,
291
- desired_capabilities = (
292
- webdriver .DesiredCapabilities .OPERA ))
317
+ desired_capabilities = capabilities )
293
318
elif browser_name == constants .Browser .PHANTOM_JS :
319
+ capabilities = webdriver .DesiredCapabilities .PHANTOMJS
320
+ for key in desired_caps .keys ():
321
+ capabilities [key ] = desired_caps [key ]
294
322
with warnings .catch_warnings ():
295
323
# Ignore "PhantomJS has been deprecated" UserWarning
296
324
warnings .simplefilter ("ignore" , category = UserWarning )
297
325
return webdriver .Remote (
298
326
command_executor = address ,
299
- desired_capabilities = (
300
- webdriver .DesiredCapabilities .PHANTOMJS ))
327
+ desired_capabilities = capabilities )
328
+ elif browser_name == constants .Browser .ANDROID :
329
+ capabilities = webdriver .DesiredCapabilities .ANDROID
330
+ for key in desired_caps .keys ():
331
+ capabilities [key ] = desired_caps [key ]
332
+ return webdriver .Remote (
333
+ command_executor = address ,
334
+ desired_capabilities = capabilities )
335
+ elif browser_name == constants .Browser .IPHONE :
336
+ capabilities = webdriver .DesiredCapabilities .IPHONE
337
+ for key in desired_caps .keys ():
338
+ capabilities [key ] = desired_caps [key ]
339
+ return webdriver .Remote (
340
+ command_executor = address ,
341
+ desired_capabilities = capabilities )
342
+ elif browser_name == constants .Browser .IPAD :
343
+ capabilities = webdriver .DesiredCapabilities .IPAD
344
+ for key in desired_caps .keys ():
345
+ capabilities [key ] = desired_caps [key ]
346
+ return webdriver .Remote (
347
+ command_executor = address ,
348
+ desired_capabilities = capabilities )
349
+ elif browser_name == constants .Browser .REMOTE :
350
+ return webdriver .Remote (
351
+ command_executor = address ,
352
+ desired_capabilities = desired_caps )
301
353
302
354
303
355
def get_local_driver (
@@ -418,3 +470,6 @@ def get_local_driver(
418
470
return webdriver .Chrome (executable_path = LOCAL_CHROMEDRIVER )
419
471
else :
420
472
return webdriver .Chrome ()
473
+ else :
474
+ raise Exception (
475
+ "%s is not a valid browser option for this system!" % browser_name )
0 commit comments