Skip to content

Commit 5abb012

Browse files
committed
Add "desired capabilities" options for BrowserStack and Sauce Labs
1 parent 5741f60 commit 5abb012

File tree

2 files changed

+91
-16
lines changed

2 files changed

+91
-16
lines changed

seleniumbase/core/browser_launcher.py

Lines changed: 62 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from seleniumbase.config import proxy_list
1212
from seleniumbase.core import download_helper
1313
from seleniumbase.core import proxy_helper
14+
from seleniumbase.core import capabilities_parser
1415
from seleniumbase.fixtures import constants
1516
from seleniumbase.fixtures import page_utils
1617
from seleniumbase import drivers # webdriver storage folder for SeleniumBase
@@ -187,7 +188,8 @@ def validate_proxy_string(proxy_string):
187188

188189

189190
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):
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,10 +227,13 @@ def get_driver(browser_name, headless=False, use_grid=False,
225227

226228
def 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(
@@ -239,6 +244,8 @@ def get_remote_driver(
239244
chrome_options.add_argument("--disable-gpu")
240245
chrome_options.add_argument("--no-sandbox")
241246
capabilities = chrome_options.to_capabilities()
247+
for key in desired_caps.keys():
248+
capabilities[key] = desired_caps[key]
242249
return webdriver.Remote(
243250
command_executor=address,
244251
desired_capabilities=capabilities)
@@ -251,6 +258,8 @@ def get_remote_driver(
251258
if headless:
252259
firefox_capabilities['moz:firefoxOptions'] = (
253260
{'args': ['-headless']})
261+
for key in desired_caps.keys():
262+
firefox_capabilities[key] = desired_caps[key]
254263
capabilities = firefox_capabilities
255264
address = "http://%s:%s/wd/hub" % (servername, port)
256265
return webdriver.Remote(
@@ -265,39 +274,76 @@ def get_remote_driver(
265274
if headless:
266275
firefox_capabilities['moz:firefoxOptions'] = (
267276
{'args': ['-headless']})
277+
for key in desired_caps.keys():
278+
firefox_capabilities[key] = desired_caps[key]
268279
capabilities = firefox_capabilities
269280
return webdriver.Remote(
270281
command_executor=address,
271282
desired_capabilities=capabilities,
272283
browser_profile=profile)
273284
elif browser_name == constants.Browser.INTERNET_EXPLORER:
285+
capabilities = webdriver.DesiredCapabilities.INTERNETEXPLORER
286+
for key in desired_caps.keys():
287+
capabilities[key] = desired_caps[key]
274288
return webdriver.Remote(
275289
command_executor=address,
276-
desired_capabilities=(
277-
webdriver.DesiredCapabilities.INTERNETEXPLORER))
290+
desired_capabilities=capabilities)
278291
elif browser_name == constants.Browser.EDGE:
292+
capabilities = webdriver.DesiredCapabilities.EDGE
293+
for key in desired_caps.keys():
294+
capabilities[key] = desired_caps[key]
279295
return webdriver.Remote(
280296
command_executor=address,
281-
desired_capabilities=(
282-
webdriver.DesiredCapabilities.EDGE))
297+
desired_capabilities=capabilities)
283298
elif browser_name == constants.Browser.SAFARI:
299+
capabilities = webdriver.DesiredCapabilities.SAFARI
300+
for key in desired_caps.keys():
301+
capabilities[key] = desired_caps[key]
284302
return webdriver.Remote(
285303
command_executor=address,
286-
desired_capabilities=(
287-
webdriver.DesiredCapabilities.SAFARI))
304+
desired_capabilities=capabilities)
288305
elif browser_name == constants.Browser.OPERA:
306+
capabilities = webdriver.DesiredCapabilities.OPERA
307+
for key in desired_caps.keys():
308+
capabilities[key] = desired_caps[key]
289309
return webdriver.Remote(
290310
command_executor=address,
291-
desired_capabilities=(
292-
webdriver.DesiredCapabilities.OPERA))
311+
desired_capabilities=capabilities)
293312
elif browser_name == constants.Browser.PHANTOM_JS:
313+
capabilities = webdriver.DesiredCapabilities.PHANTOMJS
314+
for key in desired_caps.keys():
315+
capabilities[key] = desired_caps[key]
294316
with warnings.catch_warnings():
295317
# Ignore "PhantomJS has been deprecated" UserWarning
296318
warnings.simplefilter("ignore", category=UserWarning)
297319
return webdriver.Remote(
298320
command_executor=address,
299-
desired_capabilities=(
300-
webdriver.DesiredCapabilities.PHANTOMJS))
321+
desired_capabilities=capabilities)
322+
elif browser_name == constants.Browser.ANDROID:
323+
capabilities = webdriver.DesiredCapabilities.ANDROID
324+
for key in desired_caps.keys():
325+
capabilities[key] = desired_caps[key]
326+
return webdriver.Remote(
327+
command_executor=address,
328+
desired_capabilities=capabilities)
329+
elif browser_name == constants.Browser.IPHONE:
330+
capabilities = webdriver.DesiredCapabilities.IPHONE
331+
for key in desired_caps.keys():
332+
capabilities[key] = desired_caps[key]
333+
return webdriver.Remote(
334+
command_executor=address,
335+
desired_capabilities=capabilities)
336+
elif browser_name == constants.Browser.IPAD:
337+
capabilities = webdriver.DesiredCapabilities.IPAD
338+
for key in desired_caps.keys():
339+
capabilities[key] = desired_caps[key]
340+
return webdriver.Remote(
341+
command_executor=address,
342+
desired_capabilities=capabilities)
343+
elif browser_name == constants.Browser.REMOTE:
344+
return webdriver.Remote(
345+
command_executor=address,
346+
desired_capabilities=desired_caps)
301347

302348

303349
def get_local_driver(
@@ -418,3 +464,6 @@ def get_local_driver(
418464
return webdriver.Chrome(executable_path=LOCAL_CHROMEDRIVER)
419465
else:
420466
return webdriver.Chrome()
467+
else:
468+
raise Exception(
469+
"%s is not a valid browser option for this system!" % browser_name)

seleniumbase/fixtures/base_case.py

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2191,7 +2191,8 @@ def save_screenshot(self, name, folder=None):
21912191
return page_actions.save_screenshot(self.driver, name, folder)
21922192

21932193
def get_new_driver(self, browser=None, headless=None,
2194-
servername=None, port=None, proxy=None, switch_to=True):
2194+
servername=None, port=None, proxy=None, switch_to=True,
2195+
cap_file=None):
21952196
""" This method spins up an extra browser for tests that require
21962197
more than one. The first browser is already provided by tests
21972198
that import base_case.BaseCase from seleniumbase. If parameters
@@ -2204,6 +2205,27 @@ def get_new_driver(self, browser=None, headless=None,
22042205
proxy - if using a proxy server, specify the "host:port" combo here
22052206
switch_to - the option to switch to the new driver (default = True)
22062207
"""
2208+
if self.browser == "remote" and self.servername == "localhost":
2209+
raise Exception('Cannot use "remote" browser driver on localhost!'
2210+
' Did you mean to connect to a remote Grid server'
2211+
' such as BrowserStack or Sauce Labs? In that'
2212+
' case, you must specify the "server" and "port"'
2213+
' parameters on the command line! '
2214+
'Example: '
2215+
'--server=user:[email protected] --port=80')
2216+
browserstack_ref = (
2217+
'https://browserstack.com/automate/capabilities')
2218+
sauce_labs_ref = (
2219+
'https://wiki.saucelabs.com/display/DOCS/Platform+Configurator#/')
2220+
if self.browser == "remote" and not self.cap_file:
2221+
raise Exception('Need to specify a desired capabilities file when '
2222+
'using "--browser=remote". Add "--cap_file=FILE". '
2223+
'File should be in the Python format used by: '
2224+
'%s OR '
2225+
'%s '
2226+
'See SeleniumBase/examples/sample_cap_file_BS.py '
2227+
'and SeleniumBase/examples/sample_cap_file_SL.py'
2228+
% (browserstack_ref, sauce_labs_ref))
22072229
if browser is None:
22082230
browser = self.browser
22092231
browser_name = browser
@@ -2220,6 +2242,8 @@ def get_new_driver(self, browser=None, headless=None,
22202242
proxy_string = proxy
22212243
if proxy_string is None:
22222244
proxy_string = self.proxy_string
2245+
if cap_file is None:
2246+
cap_file = self.cap_file
22232247
valid_browsers = constants.ValidBrowsers.valid_browsers
22242248
if browser_name not in valid_browsers:
22252249
raise Exception("Browser: {%s} is not a valid browser option. "
@@ -2231,7 +2255,8 @@ def get_new_driver(self, browser=None, headless=None,
22312255
use_grid=use_grid,
22322256
servername=servername,
22332257
port=port,
2234-
proxy_string=proxy_string)
2258+
proxy_string=proxy_string,
2259+
cap_file=cap_file)
22352260
self._drivers_list.append(new_driver)
22362261
if switch_to:
22372262
self.driver = new_driver
@@ -2677,7 +2702,8 @@ def setUp(self):
26772702
servername=self.servername,
26782703
port=self.port,
26792704
proxy=self.proxy_string,
2680-
switch_to=True)
2705+
switch_to=True,
2706+
cap_file=self.cap_file)
26812707
self._default_driver = self.driver
26822708

26832709
def __insert_test_result(self, state, err):

0 commit comments

Comments
 (0)