Skip to content

Commit 04e71ca

Browse files
authored
Merge pull request #674 from seleniumbase/enable-ws-command-line-option
Add option: "--enable-ws" to enable Chrome's Web Security
2 parents 6a50ba5 + f8f6dca commit 04e71ca

File tree

12 files changed

+75
-37
lines changed

12 files changed

+75
-37
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,7 @@ SeleniumBase provides additional ``pytest`` command-line options for tests:
338338
--block-images # (Block images from loading during tests.)
339339
--verify-delay=SECONDS # (The delay before MasterQA verification checks.)
340340
--disable-csp # (This disables the Content Security Policy of websites.)
341+
--enable-ws # (Enable Web Security on Chrome.)
341342
--enable-sync # (Enable "Chrome Sync".)
342343
--use-auto-ext # (Use Chrome's automation extension.)
343344
--swiftshader # (Use Chrome's "--use-gl=swiftshader" feature.)

docs/requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
livereload==2.6.3;python_version>="3.6"
22
pymdown-extensions==8.0
33
mkdocs==1.1.2
4-
mkdocs-material==5.5.10
4+
mkdocs-material==5.5.11
55
mkdocs-simple-hooks==0.1.1
66
mkdocs-material-extensions==1.0
77
mkdocs-minify-plugin==0.3.0

examples/raw_parameter_script.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
sb.log_path = "latest_logs/"
4848
sb.archive_logs = False
4949
sb.disable_csp = False
50+
sb.enable_ws = False
5051
sb.enable_sync = False
5152
sb.use_auto_ext = False
5253
sb.no_sandbox = False

help_docs/customizing_test_runs.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ SeleniumBase provides additional ``pytest`` command-line options for tests:
127127
--block-images # (Block images from loading during tests.)
128128
--verify-delay=SECONDS # (The delay before MasterQA verification checks.)
129129
--disable-csp # (This disables the Content Security Policy of websites.)
130+
--enable-ws # (Enable Web Security on Chrome.)
130131
--enable-sync # (Enable "Chrome Sync".)
131132
--use-auto-ext # (Use Chrome's automation extension.)
132133
--swiftshader # (Use Chrome's "--use-gl=swiftshader" feature.)

integrations/brython/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
padding: 8px;
2222
}
2323
</style>
24-
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/brython/3.8.8/brython.js"></script>
24+
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/brython/3.8.10/brython.js"></script>
2525
</head>
2626
<body onload="brython()">
2727
<table>

integrations/brython/library.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
padding: 4px;
2222
}
2323
</style>
24-
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/brython/3.8.8/brython.js"></script>
24+
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/brython/3.8.10/brython.js"></script>
2525
</head>
2626
<body onload="brython(1)">
2727
<script id="ascript" type="text/python">

requirements.txt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ urllib3==1.25.10
1515
requests==2.24.0
1616
selenium==3.141.0
1717
msedge-selenium-tools==3.141.2
18+
more-itertools==5.0.0;python_version<"3.5"
19+
more-itertools==8.5.0;python_version>="3.5"
1820
pluggy==0.13.1
1921
attrs>=20.1.0
2022
py==1.8.1;python_version<"3.5"
@@ -40,16 +42,16 @@ cryptography==3.0;python_version<"3.6"
4042
cryptography==3.1;python_version>="3.6"
4143
pyopenssl==19.1.0
4244
prompt-toolkit==1.0.18;python_version<"3.6.1"
43-
prompt-toolkit==3.0.6;python_version>="3.6.1"
45+
prompt-toolkit==3.0.7;python_version>="3.6.1"
4446
pygments==2.5.2;python_version<"3.5"
4547
pygments==2.6.1;python_version>="3.5"
4648
ipython==5.10.0;python_version<"3.5"
4749
ipython==6.5.0;python_version>="3.5" and python_version<"3.7"
48-
ipython==7.17.0;python_version>="3.7"
50+
ipython==7.18.1;python_version>="3.7"
4951
colorama==0.4.3
5052
pymysql==0.10.0
5153
coverage==5.2.1
52-
brython>=3.8.9
54+
brython==3.8.10
5355
pyotp==2.4.0
5456
boto==2.49.0
5557
cffi==1.14.2

seleniumbase/core/browser_launcher.py

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ def _add_chrome_disable_csp_extension(chrome_options):
131131
def _set_chrome_options(
132132
browser_name, downloads_path, headless, locale_code,
133133
proxy_string, proxy_auth, proxy_user, proxy_pass,
134-
user_agent, disable_csp, enable_sync, use_auto_ext,
134+
user_agent, disable_csp, enable_ws, enable_sync, use_auto_ext,
135135
no_sandbox, disable_gpu, incognito, guest_mode, devtools, swiftshader,
136136
block_images, user_data_dir, extension_zip, extension_dir, servername,
137137
mobile_emulator, device_width, device_height, device_pixel_ratio):
@@ -267,7 +267,8 @@ def _set_chrome_options(
267267
if browser_name != constants.Browser.OPERA:
268268
# Opera Chromium doesn't support these switches
269269
chrome_options.add_argument("--ignore-certificate-errors")
270-
chrome_options.add_argument("--disable-web-security")
270+
if not enable_ws:
271+
chrome_options.add_argument("--disable-web-security")
271272
chrome_options.add_argument("--no-sandbox")
272273
else:
273274
# Opera Chromium only!
@@ -401,8 +402,8 @@ def get_driver(browser_name, headless=False, locale_code=None,
401402
use_grid=False, servername='localhost', port=4444,
402403
proxy_string=None, user_agent=None,
403404
cap_file=None, cap_string=None,
404-
disable_csp=None, enable_sync=None, use_auto_ext=None,
405-
no_sandbox=None, disable_gpu=None,
405+
disable_csp=None, enable_ws=None, enable_sync=None,
406+
use_auto_ext=None, no_sandbox=None, disable_gpu=None,
406407
incognito=None, guest_mode=None, devtools=None,
407408
swiftshader=None, block_images=None, user_data_dir=None,
408409
extension_zip=None, extension_dir=None,
@@ -441,26 +442,26 @@ def get_driver(browser_name, headless=False, locale_code=None,
441442
return get_remote_driver(
442443
browser_name, headless, locale_code, servername, port,
443444
proxy_string, proxy_auth, proxy_user, proxy_pass, user_agent,
444-
cap_file, cap_string, disable_csp, enable_sync, use_auto_ext,
445-
no_sandbox, disable_gpu, incognito, guest_mode, devtools,
446-
swiftshader, block_images, user_data_dir,
445+
cap_file, cap_string, disable_csp, enable_ws, enable_sync,
446+
use_auto_ext, no_sandbox, disable_gpu, incognito, guest_mode,
447+
devtools, swiftshader, block_images, user_data_dir,
447448
extension_zip, extension_dir, test_id,
448449
mobile_emulator, device_width, device_height, device_pixel_ratio)
449450
else:
450451
return get_local_driver(
451452
browser_name, headless, locale_code, servername,
452453
proxy_string, proxy_auth, proxy_user, proxy_pass, user_agent,
453-
disable_csp, enable_sync, use_auto_ext, no_sandbox, disable_gpu,
454-
incognito, guest_mode, devtools, swiftshader, block_images,
455-
user_data_dir, extension_zip, extension_dir,
454+
disable_csp, enable_ws, enable_sync, use_auto_ext, no_sandbox,
455+
disable_gpu, incognito, guest_mode, devtools, swiftshader,
456+
block_images, user_data_dir, extension_zip, extension_dir,
456457
mobile_emulator, device_width, device_height, device_pixel_ratio)
457458

458459

459460
def get_remote_driver(
460461
browser_name, headless, locale_code, servername, port,
461462
proxy_string, proxy_auth, proxy_user, proxy_pass, user_agent,
462-
cap_file, cap_string, disable_csp, enable_sync, use_auto_ext,
463-
no_sandbox, disable_gpu, incognito, guest_mode,
463+
cap_file, cap_string, disable_csp, enable_ws, enable_sync,
464+
use_auto_ext, no_sandbox, disable_gpu, incognito, guest_mode,
464465
devtools, swiftshader, block_images,
465466
user_data_dir, extension_zip, extension_dir, test_id,
466467
mobile_emulator, device_width, device_height, device_pixel_ratio):
@@ -492,10 +493,11 @@ def get_remote_driver(
492493
chrome_options = _set_chrome_options(
493494
browser_name, downloads_path, headless, locale_code,
494495
proxy_string, proxy_auth, proxy_user, proxy_pass, user_agent,
495-
disable_csp, enable_sync, use_auto_ext, no_sandbox, disable_gpu,
496-
incognito, guest_mode, devtools, swiftshader, block_images,
497-
user_data_dir, extension_zip, extension_dir, servername,
498-
mobile_emulator, device_width, device_height, device_pixel_ratio)
496+
disable_csp, enable_ws, enable_sync, use_auto_ext, no_sandbox,
497+
disable_gpu, incognito, guest_mode, devtools, swiftshader,
498+
block_images, user_data_dir, extension_zip, extension_dir,
499+
servername, mobile_emulator,
500+
device_width, device_height, device_pixel_ratio)
499501
capabilities = chrome_options.to_capabilities()
500502
for key in desired_caps.keys():
501503
capabilities[key] = desired_caps[key]
@@ -618,9 +620,9 @@ def get_remote_driver(
618620
def get_local_driver(
619621
browser_name, headless, locale_code, servername,
620622
proxy_string, proxy_auth, proxy_user, proxy_pass, user_agent,
621-
disable_csp, enable_sync, use_auto_ext, no_sandbox, disable_gpu,
622-
incognito, guest_mode, devtools, swiftshader, block_images,
623-
user_data_dir, extension_zip, extension_dir,
623+
disable_csp, enable_ws, enable_sync, use_auto_ext, no_sandbox,
624+
disable_gpu, incognito, guest_mode, devtools, swiftshader,
625+
block_images, user_data_dir, extension_zip, extension_dir,
624626
mobile_emulator, device_width, device_height, device_pixel_ratio):
625627
'''
626628
Spins up a new web browser and returns the driver.
@@ -710,7 +712,7 @@ def get_local_driver(
710712
chrome_options = _set_chrome_options(
711713
browser_name, downloads_path, headless, locale_code,
712714
proxy_string, proxy_auth, proxy_user, proxy_pass, user_agent,
713-
disable_csp, enable_sync, use_auto_ext,
715+
disable_csp, enable_ws, enable_sync, use_auto_ext,
714716
no_sandbox, disable_gpu, incognito, guest_mode, devtools,
715717
swiftshader, block_images, user_data_dir,
716718
extension_zip, extension_dir, servername,
@@ -794,7 +796,8 @@ def get_local_driver(
794796
edge_options.add_argument("--disable-save-password-bubble")
795797
edge_options.add_argument("--disable-single-click-autofill")
796798
edge_options.add_argument("--disable-translate")
797-
edge_options.add_argument("--disable-web-security")
799+
if not enable_ws:
800+
edge_options.add_argument("--disable-web-security")
798801
edge_options.add_argument("--homepage=about:blank")
799802
edge_options.add_argument("--dns-prefetch-disable")
800803
edge_options.add_argument("--dom-automation")
@@ -842,7 +845,7 @@ def get_local_driver(
842845
opera_options = _set_chrome_options(
843846
browser_name, downloads_path, headless, locale_code,
844847
proxy_string, proxy_auth, proxy_user, proxy_pass, user_agent,
845-
disable_csp, enable_sync, use_auto_ext,
848+
disable_csp, enable_ws, enable_sync, use_auto_ext,
846849
no_sandbox, disable_gpu, incognito, guest_mode, devtools,
847850
swiftshader, block_images, user_data_dir, extension_zip,
848851
extension_dir, servername, mobile_emulator,
@@ -861,7 +864,7 @@ def get_local_driver(
861864
chrome_options = _set_chrome_options(
862865
browser_name, downloads_path, headless, locale_code,
863866
proxy_string, proxy_auth, proxy_user, proxy_pass, user_agent,
864-
disable_csp, enable_sync, use_auto_ext,
867+
disable_csp, enable_ws, enable_sync, use_auto_ext,
865868
no_sandbox, disable_gpu, incognito, guest_mode, devtools,
866869
swiftshader, block_images, user_data_dir, extension_zip,
867870
extension_dir, servername, mobile_emulator,

seleniumbase/fixtures/base_case.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1687,6 +1687,11 @@ def switch_to_frame(self, frame, timeout=None):
16871687
timeout = settings.SMALL_TIMEOUT
16881688
if self.timeout_multiplier and timeout == settings.SMALL_TIMEOUT:
16891689
timeout = self.__get_new_timeout(timeout)
1690+
if self.is_element_visible(frame):
1691+
try:
1692+
self.scroll_to(frame, timeout=1)
1693+
except Exception:
1694+
pass
16901695
page_actions.switch_to_frame(self.driver, frame, timeout)
16911696

16921697
def switch_to_default_content(self):
@@ -1716,8 +1721,8 @@ def switch_to_default_window(self):
17161721
def get_new_driver(self, browser=None, headless=None, locale_code=None,
17171722
servername=None, port=None, proxy=None, agent=None,
17181723
switch_to=True, cap_file=None, cap_string=None,
1719-
disable_csp=None, enable_sync=None, use_auto_ext=None,
1720-
no_sandbox=None, disable_gpu=None,
1724+
disable_csp=None, enable_ws=None, enable_sync=None,
1725+
use_auto_ext=None, no_sandbox=None, disable_gpu=None,
17211726
incognito=None, guest_mode=None, devtools=None,
17221727
swiftshader=None, block_images=None, user_data_dir=None,
17231728
extension_zip=None, extension_dir=None, is_mobile=False,
@@ -1737,6 +1742,7 @@ def get_new_driver(self, browser=None, headless=None, locale_code=None,
17371742
cap_file - the file containing desired capabilities for the browser
17381743
cap_string - the string with desired capabilities for the browser
17391744
disable_csp - an option to disable Chrome's Content Security Policy
1745+
enable_ws - the option to enable the Web Security feature (Chrome)
17401746
enable_sync - the option to enable the Chrome Sync feature (Chrome)
17411747
use_auto_ext - the option to enable Chrome's Automation Extension
17421748
no_sandbox - the option to enable the "No-Sandbox" feature (Chrome)
@@ -1798,6 +1804,8 @@ def get_new_driver(self, browser=None, headless=None, locale_code=None,
17981804
user_agent = self.user_agent
17991805
if disable_csp is None:
18001806
disable_csp = self.disable_csp
1807+
if enable_ws is None:
1808+
enable_ws = self.enable_ws
18011809
if enable_sync is None:
18021810
enable_sync = self.enable_sync
18031811
if use_auto_ext is None:
@@ -1852,6 +1860,7 @@ def get_new_driver(self, browser=None, headless=None, locale_code=None,
18521860
cap_file=cap_file,
18531861
cap_string=cap_string,
18541862
disable_csp=disable_csp,
1863+
enable_ws=enable_ws,
18551864
enable_sync=enable_sync,
18561865
use_auto_ext=use_auto_ext,
18571866
no_sandbox=no_sandbox,
@@ -6103,6 +6112,7 @@ def setUp(self, masterqa_mode=False):
61036112
self.block_images = sb_config.block_images
61046113
self.verify_delay = sb_config.verify_delay
61056114
self.disable_csp = sb_config.disable_csp
6115+
self.enable_ws = sb_config.enable_ws
61066116
self.enable_sync = sb_config.enable_sync
61076117
self.use_auto_ext = sb_config.use_auto_ext
61086118
self.no_sandbox = sb_config.no_sandbox
@@ -6269,6 +6279,7 @@ def setUp(self, masterqa_mode=False):
62696279
cap_file=self.cap_file,
62706280
cap_string=self.cap_string,
62716281
disable_csp=self.disable_csp,
6282+
enable_ws=self.enable_ws,
62726283
enable_sync=self.enable_sync,
62736284
use_auto_ext=self.use_auto_ext,
62746285
no_sandbox=self.no_sandbox,

seleniumbase/plugins/pytest_plugin.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ def pytest_addoption(parser):
4848
--block-images (Block images from loading during tests.)
4949
--verify-delay=SECONDS (The delay before MasterQA verification checks.)
5050
--disable-csp (Disable the Content Security Policy of websites.)
51+
--enable-ws (Enable Web Security on Chrome.)
5152
--enable-sync (Enable "Chrome Sync".)
5253
--use-auto-ext (Use Chrome's automation extension.)
5354
--swiftshader (Use Chrome's "--use-gl=swiftshader" feature.)
@@ -372,8 +373,14 @@ def pytest_addoption(parser):
372373
websites, which may interfere with some features of
373374
SeleniumBase, such as loading custom JavaScript
374375
libraries for various testing actions.
375-
Setting this to True (--disable_csp) overrides the
376+
Setting this to True (--disable-csp) overrides the
376377
value set in seleniumbase/config/settings.py""")
378+
parser.addoption('--enable_ws', '--enable-ws', '--enable-web-security',
379+
action="store_true",
380+
dest='enable_ws',
381+
default=False,
382+
help="""Using this enables the "Web Security" feature of
383+
Chrome and Chromium-based browsers such as Edge.""")
377384
parser.addoption('--enable_sync', '--enable-sync',
378385
action="store_true",
379386
dest='enable_sync',
@@ -515,6 +522,7 @@ def pytest_configure(config):
515522
sb_config.block_images = config.getoption('block_images')
516523
sb_config.verify_delay = config.getoption('verify_delay')
517524
sb_config.disable_csp = config.getoption('disable_csp')
525+
sb_config.enable_ws = config.getoption('enable_ws')
518526
sb_config.enable_sync = config.getoption('enable_sync')
519527
sb_config.use_auto_ext = config.getoption('use_auto_ext')
520528
sb_config.no_sandbox = config.getoption('no_sandbox')

0 commit comments

Comments
 (0)