Skip to content

Commit 94e9f56

Browse files
authored
Merge pull request #1473 from seleniumbase/add-ways-to-disable-beforeunload
Add ways to disable "beforeunload"
2 parents 13e689b + 5ab9b96 commit 94e9f56

File tree

11 files changed

+69
-4
lines changed

11 files changed

+69
-4
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -504,6 +504,7 @@ The code above will leave your browser window open in case there's a failure. (i
504504
--devtools # (Open Chrome's DevTools when the browser opens.)
505505
--reuse-session | --rs # (Reuse the browser session between tests.)
506506
--crumbs # (Delete all cookies between tests reusing a session.)
507+
--disable-beforeunload # (Disable the "beforeunload" event on Chrome.)
507508
--window-size=WIDTH,HEIGHT # (Set the browser's starting window size.)
508509
--maximize # (Start tests with the browser window maximized.)
509510
--screenshot # (Save a screenshot at the end of each test.)

examples/raw_parameter_script.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@
7272
sb.visual_baseline = False
7373
sb.window_size = None
7474
sb.maximize_option = False
75+
sb._disable_beforeunload = False
7576
sb.save_screenshot_after_test = False
7677
sb.timeout_multiplier = None
7778
sb.pytest_html_report = None

help_docs/customizing_test_runs.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ pytest my_first_test.py --settings-file=custom_settings.py
170170
--devtools # (Open Chrome's DevTools when the browser opens.)
171171
--reuse-session | --rs # (Reuse the browser session between tests.)
172172
--crumbs # (Delete all cookies between tests reusing a session.)
173+
--disable-beforeunload # (Disable the "beforeunload" event on Chrome.)
173174
--window-size=WIDTH,HEIGHT # (Set the browser's starting window size.)
174175
--maximize # (Start tests with the browser window maximized.)
175176
--screenshot # (Save a screenshot at the end of each test.)

help_docs/method_summary.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,8 @@ self.ad_block()
375375

376376
self.show_file_choosers()
377377

378+
self.disable_beforeunload()
379+
378380
self.get_domain_url(url)
379381

380382
self.get_beautiful_soup(source=None)

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ outcome==1.2.0;python_version>="3.7"
5050
trio==0.21.0;python_version>="3.7"
5151
trio-websocket==0.9.2;python_version>="3.7"
5252
pyopenssl==22.0.0;python_version>="3.7"
53-
wsproto==1.1.0;python_version>="3.7"
53+
wsproto==1.2.0;python_version>="3.7"
5454
selenium==3.141.0;python_version<"3.7"
5555
selenium==4.4.3;python_version>="3.7"
5656
msedge-selenium-tools==3.141.3;python_version<"3.7"

seleniumbase/__version__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
# seleniumbase package
2-
__version__ = "4.0.1"
2+
__version__ = "4.1.0"

seleniumbase/behave/behave_sb.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,8 @@
7979
-D devtools (Open Chrome's DevTools when the browser opens.)
8080
-D reuse-session | -D rs (Reuse browser session between tests.)
8181
-D crumbs (Delete all cookies between tests reusing a session.)
82-
-D window-size (Set the browser window size: "Width,Height".)
82+
-D disable-beforeunload (Disable the "beforeunload" event on Chrome.)
83+
-D window-size=WIDTH,HEIGHT (Set the browser's starting window size.)
8384
-D maximize (Start tests with the browser window maximized.)
8485
-D screenshot (Save a screenshot at the end of each test.)
8586
-D visual-baseline (Set the visual baseline for Visual/Layout tests.)
@@ -165,6 +166,7 @@ def get_configured_sb(context):
165166
sb._multithreaded = False
166167
sb._reuse_session = False
167168
sb._crumbs = False
169+
sb._disable_beforeunload = False
168170
sb.visual_baseline = False
169171
sb.window_size = None
170172
sb.maximize_option = False
@@ -475,6 +477,10 @@ def get_configured_sb(context):
475477
if low_key == "crumbs":
476478
sb._crumbs = True
477479
continue
480+
# Handle: -D disable-beforeunload / disable_beforeunload
481+
if low_key in ["disable-beforeunload", "disable_beforeunload"]:
482+
sb._disable_beforeunload = True
483+
continue
478484
# Handle: -D visual-baseline / visual_baseline
479485
if low_key in ["visual-baseline", "visual_baseline"]:
480486
sb.visual_baseline = True

seleniumbase/fixtures/base_case.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -445,6 +445,7 @@ def click(
445445
try:
446446
if self.driver.current_url != pre_action_url:
447447
self.__ad_block_as_needed()
448+
self.__disable_beforeunload_as_needed()
448449
except Exception:
449450
try:
450451
self.wait_for_ready_state_complete()
@@ -544,6 +545,7 @@ def double_click(self, selector, by="css selector", timeout=None):
544545
self.wait_for_angularjs(timeout=settings.MINI_TIMEOUT)
545546
if self.driver.current_url != pre_action_url:
546547
self.__ad_block_as_needed()
548+
self.__disable_beforeunload_as_needed()
547549
if self.demo_mode:
548550
if self.driver.current_url != pre_action_url:
549551
self.__demo_mode_pause_if_active()
@@ -1915,6 +1917,7 @@ def click_active_element(self):
19151917
self.wait_for_angularjs(timeout=settings.MINI_TIMEOUT)
19161918
if self.driver.current_url != pre_action_url:
19171919
self.__ad_block_as_needed()
1920+
self.__disable_beforeunload_as_needed()
19181921
if self.demo_mode:
19191922
if self.driver.current_url != pre_action_url:
19201923
self.__demo_mode_pause_if_active()
@@ -2505,6 +2508,9 @@ def __select_option(
25052508
else:
25062509
# A smaller subset of self.wait_for_ready_state_complete()
25072510
self.wait_for_angularjs(timeout=settings.MINI_TIMEOUT)
2511+
if self.driver.current_url != pre_action_url:
2512+
self.__ad_block_as_needed()
2513+
self.__disable_beforeunload_as_needed()
25082514
if self.demo_mode:
25092515
if self.driver.current_url != pre_action_url:
25102516
self.__demo_mode_pause_if_active()
@@ -3646,6 +3652,7 @@ def wait_for_ready_state_complete(self, timeout=None):
36463652
if self.js_checking_on:
36473653
self.assert_no_js_errors()
36483654
self.__ad_block_as_needed()
3655+
self.__disable_beforeunload_as_needed()
36493656
return True
36503657

36513658
def wait_for_angularjs(self, timeout=None, **kwargs):
@@ -5434,6 +5441,28 @@ def show_file_choosers(self):
54345441
action = ["sh_fc", "", origin, time_stamp]
54355442
self.__extra_actions.append(action)
54365443

5444+
def disable_beforeunload(self):
5445+
"""This prevents: "Leave Site? Changes you made may not be saved."
5446+
on Chromium browsers (Chrome or Edge).
5447+
SB already sets "dom.disable_beforeunload" for Firefox options."""
5448+
self.__check_scope()
5449+
self.__check_browser()
5450+
if (
5451+
self.is_chromium()
5452+
and self.driver.current_url.startswith("http")
5453+
):
5454+
try:
5455+
self.driver.execute_script("window.onbeforeunload=null;")
5456+
except Exception:
5457+
pass
5458+
5459+
def __disable_beforeunload_as_needed(self):
5460+
if (
5461+
hasattr(self, "_disable_beforeunload")
5462+
and self._disable_beforeunload
5463+
):
5464+
self.disable_beforeunload()
5465+
54375466
def get_domain_url(self, url):
54385467
self.__check_scope()
54395468
return page_utils.get_domain_url(url)
@@ -12454,6 +12483,7 @@ def setUp(self, masterqa_mode=False):
1245412483
self._multithreaded = sb_config._multithreaded
1245512484
self._reuse_session = sb_config.reuse_session
1245612485
self._crumbs = sb_config.crumbs
12486+
self._disable_beforeunload = sb_config._disable_beforeunload
1245712487
self.dashboard = sb_config.dashboard
1245812488
self._dash_initialized = sb_config._dashboard_initialized
1245912489
if self.dashboard and self._multithreaded:

seleniumbase/plugins/pytest_plugin.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ def pytest_addoption(parser):
9292
--devtools (Open Chrome's DevTools when the browser opens.)
9393
--reuse-session | --rs (Reuse browser session between tests.)
9494
--crumbs (Delete all cookies between tests reusing a session.)
95+
--disable-beforeunload (Disable the "beforeunload" event on Chrome.)
9596
--window-size=WIDTH,HEIGHT (Set the browser's starting window size.)
9697
--maximize (Start tests with the browser window maximized.)
9798
--screenshot (Save a screenshot at the end of each test.)
@@ -952,6 +953,16 @@ def pytest_addoption(parser):
952953
that reuse the same browser session. This option
953954
is only needed when using "--reuse-session".""",
954955
)
956+
parser.addoption(
957+
"--disable-beforeunload",
958+
"--disable_beforeunload",
959+
action="store_true",
960+
dest="_disable_beforeunload",
961+
default=False,
962+
help="""The option to disable the "beforeunload" event
963+
on Chromium browsers (Chrome or Edge).
964+
This is already the default Firefox option.""",
965+
)
955966
parser.addoption(
956967
"--window-size",
957968
"--window_size",
@@ -1279,6 +1290,7 @@ def pytest_configure(config):
12791290
sb_config.devtools = config.getoption("devtools")
12801291
sb_config.reuse_session = config.getoption("reuse_session")
12811292
sb_config.crumbs = config.getoption("crumbs")
1293+
sb_config._disable_beforeunload = config.getoption("_disable_beforeunload")
12821294
sb_config.shared_driver = None # The default driver for session reuse
12831295
sb_config.window_size = config.getoption("window_size")
12841296
sb_config.maximize_option = config.getoption("maximize_option")

seleniumbase/plugins/selenium_plugin.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ class SeleniumBrowser(Plugin):
6868
--incognito (Enable Chrome's Incognito mode.)
6969
--guest (Enable Chrome's Guest mode.)
7070
--devtools (Open Chrome's DevTools when the browser opens.)
71+
--disable-beforeunload (Disable the "beforeunload" event on Chrome.)
7172
--window-size=WIDTH,HEIGHT (Set the browser's starting window size.)
7273
--maximize (Start tests with the browser window maximized.)
7374
--screenshot (Save a screenshot at the end of each test.)
@@ -644,6 +645,16 @@ def options(self, parser, env):
644645
default=False,
645646
help="""Using this opens Chrome's DevTools.""",
646647
)
648+
parser.add_option(
649+
"--disable-beforeunload",
650+
"--disable_beforeunload",
651+
action="store_true",
652+
dest="_disable_beforeunload",
653+
default=False,
654+
help="""The option to disable the "beforeunload" event
655+
on Chromium browsers (Chrome or Edge).
656+
This is already the default Firefox option.""",
657+
)
647658
parser.add_option(
648659
"--window-size",
649660
"--window_size",
@@ -814,6 +825,7 @@ def beforeTest(self, test):
814825
test.test.incognito = self.options.incognito
815826
test.test.guest_mode = self.options.guest_mode
816827
test.test.devtools = self.options.devtools
828+
test.test._disable_beforeunload = self.options._disable_beforeunload
817829
test.test.window_size = self.options.window_size
818830
test.test.maximize_option = self.options.maximize_option
819831
test.test.save_screenshot_after_test = self.options.save_screenshot

0 commit comments

Comments
 (0)