Skip to content

Commit b91df9a

Browse files
committed
Adding new methods for handling WebDriver control
1 parent 0f7b24d commit b91df9a

File tree

2 files changed

+74
-19
lines changed

2 files changed

+74
-19
lines changed

help_docs/method_summary.md

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -248,14 +248,22 @@ self.wait_for_and_switch_to_alert(timeout=settings.LARGE_TIMEOUT)
248248

249249
self.switch_to_frame(frame, timeout=settings.SMALL_TIMEOUT)
250250

251+
self.switch_to_default_content()
252+
253+
self.open_new_window(switch_to=True)
254+
251255
self.switch_to_window(window, timeout=settings.SMALL_TIMEOUT)
252256

253-
self.switch_to_default_content()
257+
self.switch_to_default_window()
254258

255259
self.save_screenshot(name, folder=None)
256260

257261
self.get_new_driver(browser=None, headless=None, servername=None, port=None,
258-
proxy_string=None)
262+
proxy=None, switch_to=True)
263+
264+
self.switch_to_driver(driver)
265+
266+
self.switch_to_default_driver()
259267

260268
########
261269

seleniumbase/fixtures/base_case.py

Lines changed: 64 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,8 @@ def __init__(self, *args, **kwargs):
7777
self._page_check_count = 0
7878
self._page_check_failures = []
7979
self._html_report_extra = []
80-
self._extra_drivers = []
80+
self._default_driver = None
81+
self._drivers_list = []
8182

8283
def open(self, url):
8384
self.driver.get(url)
@@ -1424,54 +1425,90 @@ def wait_for_and_switch_to_alert(self, timeout=settings.LARGE_TIMEOUT):
14241425
return page_actions.wait_for_and_switch_to_alert(self.driver, timeout)
14251426

14261427
def switch_to_frame(self, frame, timeout=settings.SMALL_TIMEOUT):
1428+
""" Sets driver control to the specified browser frame. """
14271429
if self.timeout_multiplier and timeout == settings.SMALL_TIMEOUT:
14281430
timeout = self._get_new_timeout(timeout)
14291431
page_actions.switch_to_frame(self.driver, frame, timeout)
14301432

1433+
def switch_to_default_content(self):
1434+
""" Brings driver control outside the current iframe.
1435+
(If driver control is inside an iframe, the driver control
1436+
will be set to one level above the current frame. If the driver
1437+
control is not currenly in an iframe, nothing will happen.) """
1438+
self.driver.switch_to.default_content()
1439+
1440+
def open_new_window(self, switch_to=True):
1441+
""" Opens a new browser tab/window and switches to it by default. """
1442+
self.driver.execute_script("window.open('');")
1443+
time.sleep(0.01)
1444+
if switch_to:
1445+
self.switch_to_window(len(self.driver.window_handles) - 1)
1446+
14311447
def switch_to_window(self, window, timeout=settings.SMALL_TIMEOUT):
14321448
if self.timeout_multiplier and timeout == settings.SMALL_TIMEOUT:
14331449
timeout = self._get_new_timeout(timeout)
14341450
page_actions.switch_to_window(self.driver, window, timeout)
14351451

1436-
def switch_to_default_content(self):
1437-
self.driver.switch_to.default_content()
1452+
def switch_to_default_window(self):
1453+
self.switch_to_window(0)
14381454

14391455
def save_screenshot(self, name, folder=None):
14401456
return page_actions.save_screenshot(self.driver, name, folder)
14411457

14421458
def get_new_driver(self, browser=None, headless=None,
1443-
servername=None, port=None,
1444-
proxy_string=None):
1459+
servername=None, port=None, proxy=None, switch_to=True):
14451460
""" This method spins up an extra browser for tests that require
14461461
more than one. The first browser is already provided by tests
1447-
that import base_case.BaseCase from seleniumbase. """
1462+
that import base_case.BaseCase from seleniumbase. If parameters
1463+
aren't specified, the method uses the same as the default driver.
1464+
@Params
1465+
browser - the browser to use. (Ex: "chrome", "firefox")
1466+
headless - the option to run webdriver in headless mode
1467+
servername - if using a Selenium Grid, set the host address here
1468+
port - if using a Selenium Grid, set the host port here
1469+
proxy - if using a proxy server, specify the "host:port" combo here
1470+
switch_to - the option to switch to the new driver (default = True)
1471+
"""
14481472
if browser is None:
14491473
browser = self.browser
1474+
browser_name = browser
14501475
if headless is None:
14511476
headless = self.headless
14521477
if servername is None:
14531478
servername = self.servername
14541479
if port is None:
14551480
port = self.port
1456-
if proxy_string is None:
1457-
proxy_string = self.proxy_string
14581481
use_grid = False
14591482
if servername != "localhost":
1460-
# Use Selenium Grid (Use --server=127.0.0.1 for localhost Grid)
1483+
# Use Selenium Grid (Use "127.0.0.1" for localhost Grid)
14611484
use_grid = True
1485+
proxy_string = proxy
1486+
if proxy_string is None:
1487+
proxy_string = self.proxy_string
14621488
valid_browsers = constants.ValidBrowsers.valid_browsers
1463-
if browser not in valid_browsers:
1489+
if browser_name not in valid_browsers:
14641490
raise Exception("Browser: {%s} is not a valid browser option. "
14651491
"Valid options = {%s}" % (browser, valid_browsers))
1466-
new_driver = browser_launcher.get_driver(browser,
1467-
headless,
1468-
use_grid,
1469-
servername,
1470-
port,
1471-
proxy_string)
1472-
self._extra_drivers.append(new_driver)
1492+
new_driver = browser_launcher.get_driver(browser_name=browser_name,
1493+
headless=headless,
1494+
use_grid=use_grid,
1495+
servername=servername,
1496+
port=port,
1497+
proxy_string=proxy_string)
1498+
self._drivers_list.append(new_driver)
1499+
if switch_to:
1500+
self.driver = new_driver
14731501
return new_driver
14741502

1503+
def switch_to_driver(self, driver):
1504+
""" Sets self.driver to the specified driver.
1505+
You may need this if using self.get_new_driver() in your code. """
1506+
self.driver = driver
1507+
1508+
def switch_to_default_driver(self):
1509+
""" Sets self.driver to the default/original driver. """
1510+
self.driver = self._default_driver
1511+
14751512
############
14761513

14771514
def _get_new_timeout(self, timeout):
@@ -1850,6 +1887,16 @@ def setUp(self):
18501887
self.servername,
18511888
self.port,
18521889
self.proxy_string)
1890+
self._default_driver = self.driver
1891+
self._drivers_list.append(self.driver)
1892+
if self.headless:
1893+
# Make sure the invisible browser window is big enough
1894+
try:
1895+
self.set_window_size(1920, 1200)
1896+
except Exception:
1897+
# This shouldn't fail, but in case it does, get safely through
1898+
# setUp() so that WebDrivers can get closed during tearDown().
1899+
pass
18531900

18541901
def __insert_test_result(self, state, err):
18551902
data_payload = TestcaseDataPayload()

0 commit comments

Comments
 (0)