Skip to content

Commit beaccc9

Browse files
committed
Add option to reuse the browser session between tests
1 parent 306f984 commit beaccc9

File tree

4 files changed

+81
-15
lines changed

4 files changed

+81
-15
lines changed

examples/raw_parameter_script.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
sb.archive_logs = False
4343
sb.disable_csp = False
4444
sb.enable_sync = False
45+
sb._reuse_session = False
4546
sb.visual_baseline = False
4647
sb.maximize_option = False
4748
sb.save_screenshot_after_test = False

seleniumbase/fixtures/base_case.py

Lines changed: 56 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4122,6 +4122,7 @@ def setUp(self, masterqa_mode=False):
41224122
self.extension_zip = sb_config.extension_zip
41234123
self.extension_dir = sb_config.extension_dir
41244124
self.maximize_option = sb_config.maximize_option
4125+
self._reuse_session = sb_config.reuse_session
41254126
self.save_screenshot_after_test = sb_config.save_screenshot
41264127
self.visual_baseline = sb_config.visual_baseline
41274128
self.timeout_multiplier = sb_config.timeout_multiplier
@@ -4192,21 +4193,50 @@ def setUp(self, masterqa_mode=False):
41924193
if self.settings_file:
41934194
settings_parser.set_settings(self.settings_file)
41944195

4195-
# Launch WebDriver for both Pytest and Nosetests
4196-
self.driver = self.get_new_driver(browser=self.browser,
4197-
headless=self.headless,
4198-
servername=self.servername,
4199-
port=self.port,
4200-
proxy=self.proxy_string,
4201-
agent=self.user_agent,
4202-
switch_to=True,
4203-
cap_file=self.cap_file,
4204-
disable_csp=self.disable_csp,
4205-
enable_sync=self.enable_sync,
4206-
user_data_dir=self.user_data_dir,
4207-
extension_zip=self.extension_zip,
4208-
extension_dir=self.extension_dir)
4209-
self._default_driver = self.driver
4196+
has_url = False
4197+
if self._reuse_session:
4198+
if not hasattr(sb_config, 'shared_driver'):
4199+
sb_config.shared_driver = None
4200+
if sb_config.shared_driver:
4201+
try:
4202+
self._default_driver = sb_config.shared_driver
4203+
self.driver = sb_config.shared_driver
4204+
self._drivers_list = [sb_config.shared_driver]
4205+
url = self.get_current_url()
4206+
if len(url) > 3:
4207+
has_url = True
4208+
except Exception:
4209+
pass
4210+
4211+
if self._reuse_session and sb_config.shared_driver and has_url:
4212+
if self.start_page and len(self.start_page) >= 4:
4213+
if page_utils.is_valid_url(self.start_page):
4214+
self.open(self.start_page)
4215+
else:
4216+
new_start_page = "http://" + self.start_page
4217+
if page_utils.is_valid_url(new_start_page):
4218+
self.open(new_start_page)
4219+
else:
4220+
if self.get_current_url() != "data:,":
4221+
self.open("data:,")
4222+
else:
4223+
# Launch WebDriver for both Pytest and Nosetests
4224+
self.driver = self.get_new_driver(browser=self.browser,
4225+
headless=self.headless,
4226+
servername=self.servername,
4227+
port=self.port,
4228+
proxy=self.proxy_string,
4229+
agent=self.user_agent,
4230+
switch_to=True,
4231+
cap_file=self.cap_file,
4232+
disable_csp=self.disable_csp,
4233+
enable_sync=self.enable_sync,
4234+
user_data_dir=self.user_data_dir,
4235+
extension_zip=self.extension_zip,
4236+
extension_dir=self.extension_dir)
4237+
self._default_driver = self.driver
4238+
if self._reuse_session:
4239+
sb_config.shared_driver = self.driver
42104240

42114241
def __set_last_page_screenshot(self):
42124242
""" self.__last_page_screenshot is only for pytest html report logs
@@ -4280,6 +4310,16 @@ def __add_pytest_html_extra(self):
42804310
pass
42814311

42824312
def __quit_all_drivers(self):
4313+
if self._reuse_session and sb_config.shared_driver:
4314+
if len(self._drivers_list) > 0:
4315+
sb_config.shared_driver = self._drivers_list[0]
4316+
self._default_driver = self._drivers_list[0]
4317+
self.switch_to_default_driver()
4318+
if len(self._drivers_list) > 1:
4319+
self._drivers_list = self._drivers_list[1:]
4320+
else:
4321+
self._drivers_list = []
4322+
42834323
# Close all open browser windows
42844324
self._drivers_list.reverse() # Last In, First Out
42854325
for driver in self._drivers_list:
@@ -4290,6 +4330,7 @@ def __quit_all_drivers(self):
42904330
except Exception:
42914331
pass
42924332
self.driver = None
4333+
self._default_driver = None
42934334
self._drivers_list = []
42944335

42954336
def tearDown(self):

seleniumbase/plugins/pytest_plugin.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ def pytest_addoption(parser):
3939
--verify_delay=SECONDS (The delay before MasterQA verification checks.)
4040
--disable_csp (This disables the Content Security Policy of websites.)
4141
--enable_sync (The option to enable "Chrome Sync".)
42+
--reuse_session (The option to reuse the browser session between tests.)
4243
--maximize_window (The option to start with the web browser maximized.)
4344
--save_screenshot (The option to save a screenshot after each test.)
4445
--visual_baseline (Set the visual baseline for Visual/Layout tests.)
@@ -292,6 +293,12 @@ def pytest_addoption(parser):
292293
dest='enable_sync',
293294
default=False,
294295
help="""Using this enables the "Chrome Sync" feature.""")
296+
parser.addoption('--reuse_session', '--reuse-session',
297+
action="store_true",
298+
dest='reuse_session',
299+
default=False,
300+
help="""The option to reuse the selenium browser window
301+
session between tests.""")
295302
parser.addoption('--maximize_window', '--maximize-window', '--maximize',
296303
'--fullscreen',
297304
action="store_true",
@@ -360,12 +367,18 @@ def pytest_configure(config):
360367
sb_config.verify_delay = config.getoption('verify_delay')
361368
sb_config.disable_csp = config.getoption('disable_csp')
362369
sb_config.enable_sync = config.getoption('enable_sync')
370+
sb_config.reuse_session = config.getoption('reuse_session')
371+
sb_config.shared_driver = None # The default driver for session reuse
363372
sb_config.maximize_option = config.getoption('maximize_option')
364373
sb_config.save_screenshot = config.getoption('save_screenshot')
365374
sb_config.visual_baseline = config.getoption('visual_baseline')
366375
sb_config.timeout_multiplier = config.getoption('timeout_multiplier')
367376
sb_config.pytest_html_report = config.getoption('htmlpath') # --html=FILE
368377

378+
if sb_config.reuse_session:
379+
if "".join(sys.argv) == "-c": # Can't "reuse_session" if multithreaded
380+
sb_config.reuse_session = False
381+
369382
if "linux" in sys.platform and (
370383
not sb_config.headed and not sb_config.headless):
371384
print(
@@ -383,6 +396,16 @@ def pytest_configure(config):
383396
def pytest_unconfigure():
384397
""" This runs after all tests have completed with pytest. """
385398
proxy_helper.remove_proxy_zip_if_present()
399+
if sb_config.reuse_session:
400+
# Close the shared browser session
401+
if sb_config.shared_driver:
402+
try:
403+
sb_config.shared_driver.quit()
404+
except AttributeError:
405+
pass
406+
except Exception:
407+
pass
408+
sb_config.shared_driver = None
386409

387410

388411
def pytest_runtest_setup():

seleniumbase/plugins/selenium_plugin.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,7 @@ def beforeTest(self, test):
287287
test.test.visual_baseline = self.options.visual_baseline
288288
test.test.timeout_multiplier = self.options.timeout_multiplier
289289
test.test.use_grid = False
290+
test.test._reuse_session = False
290291
if test.test.servername != "localhost":
291292
# Use Selenium Grid (Use --server=127.0.0.1 for localhost Grid)
292293
test.test.use_grid = True

0 commit comments

Comments
 (0)