Skip to content

Commit 8e47dad

Browse files
authored
Merge pull request #437 from seleniumbase/add-option-to-reuse-session
Add option to reuse the browser session between tests
2 parents 306f984 + 6971e2b commit 8e47dad

File tree

10 files changed

+93
-25
lines changed

10 files changed

+93
-25
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

requirements.txt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
pip>=19.3.1
2-
setuptools>=42.0.1
2+
setuptools>=42.0.2
33
setuptools-scm>=3.3.3
44
wheel>=0.33.6
55
six>=1.13.0
@@ -30,12 +30,13 @@ portalocker>=1.5.2
3030
cryptography>=2.8
3131
asn1crypto>=1.2.0
3232
pyopenssl>=19.1.0
33+
pygments>=2.5.2
3334
colorama>=0.4.1
3435
pymysql>=0.9.3
3536
pyotp>=2.3.0
3637
boto>=2.49.0
3738
cffi>=1.13.2
38-
tqdm>=4.39.0
39+
tqdm>=4.40.0
3940
flake8>=3.7.9
40-
certifi>=2019.9.11
41+
certifi>=2019.11.28
4142
pdfminer.six==20191110

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

seleniumbase/utilities/selenium_grid/grid-hub

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ if [ "$GRID_HUB_VERBOSE_LOGS" == "True" ]; then
3434
fi
3535

3636
WEBDRIVER_SERVER_JAR=${DIR}/selenium-server-standalone.jar
37-
WEBDRIVER_HUB_PARAMS="-role hub -timeout 30 -browserTimeout 60 -port 4444"
37+
WEBDRIVER_HUB_PARAMS="-role hub -timeout 180 -browserTimeout 75 -port 4444"
3838
WEBDRIVER_HUB_PIDFILE="/tmp/webdriver_hub.pid"
3939

4040
if [ ! -f $WEBDRIVER_SERVER_JAR ]; then

seleniumbase/utilities/selenium_grid/grid_hub.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ def main():
7979
if grid_hub_command == "start" or grid_hub_command == "restart":
8080
shell_command = (
8181
"""java -jar %s/selenium-server-standalone.jar -role hub """
82-
"""-timeout 30 -browserTimeout 60 -port 4444""" % dir_path)
82+
"""-timeout 180 -browserTimeout 75 -port 4444""" % dir_path)
8383
print("\nStarting Selenium-WebDriver Grid Hub...\n")
8484
print(shell_command)
8585
print("")
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
java -jar selenium-server-standalone.jar -role hub -timeout 30 -browserTimeout 60 -port 4444
1+
java -jar selenium-server-standalone.jar -role hub -timeout 180 -browserTimeout 75 -port 4444
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
#!/bin/bash
2-
java -jar selenium-server-standalone.jar -role hub -timeout 30 -browserTimeout 60 -port 4444
2+
java -jar selenium-server-standalone.jar -role hub -timeout 180 -browserTimeout 75 -port 4444

setup.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545

4646
setup(
4747
name='seleniumbase',
48-
version='1.33.8',
48+
version='1.33.9',
4949
description='Fast, Easy, and Reliable Browser Automation & Testing.',
5050
long_description=long_description,
5151
long_description_content_type='text/markdown',
@@ -113,14 +113,15 @@
113113
'cryptography>=2.8',
114114
'asn1crypto>=1.2.0',
115115
'pyopenssl>=19.1.0',
116+
'pygments>=2.5.2',
116117
'colorama>=0.4.1',
117118
'pymysql>=0.9.3',
118119
'pyotp>=2.3.0',
119120
'boto>=2.49.0',
120121
'cffi>=1.13.2',
121-
'tqdm>=4.39.0',
122+
'tqdm>=4.40.0',
122123
'flake8>=3.7.9',
123-
'certifi>=2019.9.11',
124+
'certifi>=2019.11.28',
124125
'pdfminer.six==20191110',
125126
],
126127
packages=[

0 commit comments

Comments
 (0)