1111from seleniumbase .config import proxy_list
1212from seleniumbase .core import download_helper
1313from seleniumbase .core import proxy_helper
14+ from seleniumbase .core import capabilities_parser
1415from seleniumbase .fixtures import constants
1516from seleniumbase .fixtures import page_utils
1617from seleniumbase import drivers # webdriver storage folder for SeleniumBase
@@ -187,7 +188,8 @@ def validate_proxy_string(proxy_string):
187188
188189
189190def 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 ):
191193 proxy_auth = False
192194 proxy_user = None
193195 proxy_pass = None
@@ -216,7 +218,7 @@ def get_driver(browser_name, headless=False, use_grid=False,
216218 if use_grid :
217219 return get_remote_driver (
218220 browser_name , headless , servername , port , proxy_string , proxy_auth ,
219- proxy_user , proxy_pass )
221+ proxy_user , proxy_pass , cap_file )
220222 else :
221223 return get_local_driver (
222224 browser_name , headless , proxy_string , proxy_auth ,
@@ -225,20 +227,31 @@ def get_driver(browser_name, headless=False, use_grid=False,
225227
226228def get_remote_driver (
227229 browser_name , headless , servername , port , proxy_string , proxy_auth ,
228- proxy_user , proxy_pass ):
230+ proxy_user , proxy_pass , cap_file ):
229231 downloads_path = download_helper .get_downloads_folder ()
230232 download_helper .reset_downloads_folder ()
231233 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 )
232237
233238 if browser_name == constants .Browser .GOOGLE_CHROME :
234239 chrome_options = _set_chrome_options (
235240 downloads_path , proxy_string , proxy_auth ,
236241 proxy_user , proxy_pass )
237242 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" )
239250 chrome_options .add_argument ("--disable-gpu" )
240251 chrome_options .add_argument ("--no-sandbox" )
241252 capabilities = chrome_options .to_capabilities ()
253+ for key in desired_caps .keys ():
254+ capabilities [key ] = desired_caps [key ]
242255 return webdriver .Remote (
243256 command_executor = address ,
244257 desired_capabilities = capabilities )
@@ -251,6 +264,8 @@ def get_remote_driver(
251264 if headless :
252265 firefox_capabilities ['moz:firefoxOptions' ] = (
253266 {'args' : ['-headless' ]})
267+ for key in desired_caps .keys ():
268+ firefox_capabilities [key ] = desired_caps [key ]
254269 capabilities = firefox_capabilities
255270 address = "http://%s:%s/wd/hub" % (servername , port )
256271 return webdriver .Remote (
@@ -265,39 +280,76 @@ def get_remote_driver(
265280 if headless :
266281 firefox_capabilities ['moz:firefoxOptions' ] = (
267282 {'args' : ['-headless' ]})
283+ for key in desired_caps .keys ():
284+ firefox_capabilities [key ] = desired_caps [key ]
268285 capabilities = firefox_capabilities
269286 return webdriver .Remote (
270287 command_executor = address ,
271288 desired_capabilities = capabilities ,
272289 browser_profile = profile )
273290 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 ]
274294 return webdriver .Remote (
275295 command_executor = address ,
276- desired_capabilities = (
277- webdriver .DesiredCapabilities .INTERNETEXPLORER ))
296+ desired_capabilities = capabilities )
278297 elif browser_name == constants .Browser .EDGE :
298+ capabilities = webdriver .DesiredCapabilities .EDGE
299+ for key in desired_caps .keys ():
300+ capabilities [key ] = desired_caps [key ]
279301 return webdriver .Remote (
280302 command_executor = address ,
281- desired_capabilities = (
282- webdriver .DesiredCapabilities .EDGE ))
303+ desired_capabilities = capabilities )
283304 elif browser_name == constants .Browser .SAFARI :
305+ capabilities = webdriver .DesiredCapabilities .SAFARI
306+ for key in desired_caps .keys ():
307+ capabilities [key ] = desired_caps [key ]
284308 return webdriver .Remote (
285309 command_executor = address ,
286- desired_capabilities = (
287- webdriver .DesiredCapabilities .SAFARI ))
310+ desired_capabilities = capabilities )
288311 elif browser_name == constants .Browser .OPERA :
312+ capabilities = webdriver .DesiredCapabilities .OPERA
313+ for key in desired_caps .keys ():
314+ capabilities [key ] = desired_caps [key ]
289315 return webdriver .Remote (
290316 command_executor = address ,
291- desired_capabilities = (
292- webdriver .DesiredCapabilities .OPERA ))
317+ desired_capabilities = capabilities )
293318 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 ]
294322 with warnings .catch_warnings ():
295323 # Ignore "PhantomJS has been deprecated" UserWarning
296324 warnings .simplefilter ("ignore" , category = UserWarning )
297325 return webdriver .Remote (
298326 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 )
301353
302354
303355def get_local_driver (
@@ -418,3 +470,6 @@ def get_local_driver(
418470 return webdriver .Chrome (executable_path = LOCAL_CHROMEDRIVER )
419471 else :
420472 return webdriver .Chrome ()
473+ else :
474+ raise Exception (
475+ "%s is not a valid browser option for this system!" % browser_name )
0 commit comments