Skip to content

Commit c0af5b4

Browse files
authored
Merge pull request #2441 from seleniumbase/options-for-disabling-chromium-features
Add options for disabling chromium features, and more
2 parents 31020e4 + 713dc6d commit c0af5b4

File tree

18 files changed

+200
-42
lines changed

18 files changed

+200
-42
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -662,6 +662,7 @@ pytest test_coffee_cart.py --trace
662662
--firefox-pref=SET # (Set a Firefox preference:value set, comma-separated.)
663663
--extension-zip=ZIP # (Load a Chrome Extension .zip|.crx, comma-separated.)
664664
--extension-dir=DIR # (Load a Chrome Extension directory, comma-separated.)
665+
--disable-features="F1,F2" # (Disable features, comma-separated, no spaces.)
665666
--binary-location=PATH # (Set path of the Chromium browser binary to use.)
666667
--driver-version=VER # (Set the chromedriver or uc_driver version to use.)
667668
--sjw # (Skip JS Waits for readyState to be "complete" or Angular to load.)

examples/boilerplates/boilerplate_test.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
1-
from .base_test_case import BaseTestCase
2-
from .page_objects import Page
1+
try: # Run with "pytest" (relative imports are valid)
2+
from .base_test_case import BaseTestCase
3+
from .page_objects import Page
4+
except (ImportError, ValueError): # Run with "python"
5+
from base_test_case import BaseTestCase
6+
from page_objects import Page
7+
BaseTestCase.main(__name__, __file__)
38

49

510
class MyTestClass(BaseTestCase):

examples/raw_parameter_script.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@
8181
sb.window_size = None
8282
sb.maximize_option = False
8383
sb.visual_baseline = False
84+
sb.disable_features = None
8485
sb._disable_beforeunload = False
8586
sb.save_screenshot_after_test = False
8687
sb.no_screenshot_after_test = False

examples/test_todomvc.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ class TodoMVC(BaseCase):
88
def test_todomvc(self, framework):
99
self.open("https://todomvc.com/")
1010
self.clear_local_storage()
11-
self.click('a[href="examples/%s"]' % framework)
11+
self.click('a[href*="examples/%s/dist"]' % framework)
1212
self.assert_element("section.todoapp")
1313
self.assert_text("todos", "header h1")
1414
self.wait_for_ready_state_complete()
@@ -25,5 +25,5 @@ def test_todomvc(self, framework):
2525
self.check_if_unchecked("ul.todo-list li:nth-of-type(2) input")
2626
self.check_if_unchecked("ul.todo-list li:nth-of-type(3) input")
2727
self.assert_text("0 items left", todo_count_span)
28-
self.click('label[for="toggle-all"]')
29-
self.assert_text("3 items left", todo_count_span)
28+
self.click("button.clear-completed")
29+
self.assert_element_not_visible(todo_count_span)

examples/translations/russian_test_1.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ class МойТестовыйКласс(ТестНаСелен):
77
def test_пример_1(self):
88
self.открыть("https://ru.wikipedia.org/wiki/")
99
self.подтвердить_элемент('[title="Русский язык"]')
10-
self.подтвердить_текст("Википедия", "h2.main-wikimedia-header")
10+
self.подтвердить_текст("Википедия", "div.main-wikimedia-header")
1111
self.введите("#searchInput", "МГУ")
1212
self.нажмите("#searchButton")
1313
self.подтвердить_текст("университет", "#firstHeading")

help_docs/customizing_test_runs.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ pytest my_first_test.py --settings-file=custom_settings.py
138138
--firefox-pref=SET # (Set a Firefox preference:value set, comma-separated.)
139139
--extension-zip=ZIP # (Load a Chrome Extension .zip|.crx, comma-separated.)
140140
--extension-dir=DIR # (Load a Chrome Extension directory, comma-separated.)
141+
--disable-features="F1,F2" # (Disable features, comma-separated, no spaces.)
141142
--binary-location=PATH # (Set path of the Chromium browser binary to use.)
142143
--driver-version=VER # (Set the chromedriver or uc_driver version to use.)
143144
--sjw # (Skip JS Waits for readyState to be "complete" or Angular to load.)

mkdocs_build/requirements.txt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,24 @@
33

44
regex>=2023.12.25
55
pymdown-extensions>=10.7
6-
pipdeptree>=2.13.1
6+
pipdeptree>=2.13.2
77
python-dateutil>=2.8.2
8-
Markdown==3.5.1
8+
Markdown==3.5.2
99
markdown2==2.4.12
1010
MarkupSafe==2.1.3
11-
Jinja2==3.1.2
11+
Jinja2==3.1.3
1212
click==8.1.7
1313
ghp-import==2.1.0
1414
watchdog==3.0.0
1515
cairocffi==1.6.1
1616
pathspec==0.12.1
1717
Babel==2.14.0
1818
paginate==0.5.6
19-
lxml==5.0.0
19+
lxml==5.1.0
2020
pyquery==2.0.0
2121
readtime==3.0.0
2222
mkdocs==1.5.3
23-
mkdocs-material==9.5.3
23+
mkdocs-material==9.5.4
2424
mkdocs-exclude-search==0.6.6
2525
mkdocs-simple-hooks==0.1.5
2626
mkdocs-material-extensions==1.3.1

requirements.txt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ sniffio==1.3.0
2424
h11==0.14.0
2525
outcome==1.3.0.post0
2626
trio==0.22.2;python_version<"3.8"
27-
trio==0.23.2;python_version>="3.8"
27+
trio==0.24.0;python_version>="3.8"
2828
trio-websocket==0.11.1
2929
wsproto==1.2.0
3030
selenium==4.11.2;python_version<"3.8"
@@ -48,7 +48,7 @@ sbvirtualdisplay==1.3.0
4848
behave==1.2.6
4949
soupsieve==2.4.1;python_version<"3.8"
5050
soupsieve==2.5;python_version>="3.8"
51-
beautifulsoup4==4.12.2
51+
beautifulsoup4==4.12.3
5252
pygments==2.17.2
5353
pyreadline3==3.4.1;platform_system=="Windows"
5454
tabcompleter==1.3.0
@@ -70,9 +70,9 @@ coverage==7.4.0;python_version>="3.8"
7070
pytest-cov==4.0.0;python_version<"3.7"
7171
pytest-cov==4.1.0;python_version>="3.7"
7272
flake8==5.0.4;python_version<"3.9"
73-
flake8==6.1.0;python_version>="3.9"
73+
flake8==7.0.0;python_version>="3.9"
7474
mccabe==0.7.0
7575
pyflakes==2.5.0;python_version<"3.9"
76-
pyflakes==3.1.0;python_version>="3.9"
76+
pyflakes==3.2.0;python_version>="3.9"
7777
pycodestyle==2.9.1;python_version<"3.9"
7878
pycodestyle==2.11.1;python_version>="3.9"

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.22.5"
2+
__version__ = "4.22.6"

seleniumbase/behave/behave_sb.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,7 @@ def get_configured_sb(context):
226226
sb.chromium_arg = None
227227
sb.firefox_arg = None
228228
sb.firefox_pref = None
229+
sb.disable_features = None
229230
sb.proxy_string = None
230231
sb.proxy_bypass_list = None
231232
sb.proxy_pac_url = None
@@ -748,6 +749,13 @@ def get_configured_sb(context):
748749
firefox_pref = sb.firefox_pref # revert to default
749750
sb.firefox_pref = firefox_pref
750751
continue
752+
# Handle: -D disable-features="F1,F2" / disable_features="F1,F2"
753+
if low_key in ["disable-features", "disable_features"]:
754+
disable_features = userdata[key]
755+
if disable_features == "true":
756+
disable_features = sb.disable_features # revert to default
757+
sb.disable_features = disable_features
758+
continue
751759
# Handle: -D proxy=SERVER:PORT / proxy=USERNAME:PASSWORD@SERVER:PORT
752760
if low_key in ["proxy", "proxy-server", "proxy-string"]:
753761
proxy_string = userdata[key]

seleniumbase/console_scripts/run.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,10 +75,11 @@ def show_basic_usage():
7575
seleniumbase_logo = logo_helper.get_seleniumbase_logo()
7676
print(seleniumbase_logo)
7777
print("")
78-
time.sleep(0.25) # Enough time to see the logo
78+
time.sleep(0.28) # Enough time to see the logo
7979
show_package_location()
8080
show_version_info()
8181
print("")
82+
time.sleep(0.72) # Enough time to see the version
8283
sc = ""
8384
sc += ' * USAGE: "seleniumbase [COMMAND] [PARAMETERS]"\n'
8485
sc += ' * OR: "sbase [COMMAND] [PARAMETERS]"\n'

seleniumbase/core/browser_launcher.py

Lines changed: 75 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -763,6 +763,7 @@ def _set_chrome_options(
763763
user_data_dir,
764764
extension_zip,
765765
extension_dir,
766+
disable_features,
766767
binary_location,
767768
driver_version,
768769
page_load_strategy,
@@ -1044,6 +1045,7 @@ def _set_chrome_options(
10441045
binary_loc = detect_b_ver.get_binary_location(br_app, True)
10451046
if os.path.exists(binary_loc):
10461047
binary_location = binary_loc
1048+
extra_disabled_features = []
10471049
if chromium_arg:
10481050
# Can be a comma-separated list of Chromium args
10491051
chromium_arg_list = chromium_arg.split(",")
@@ -1069,8 +1071,13 @@ def _set_chrome_options(
10691071
)
10701072
if os.path.exists(binary_loc):
10711073
binary_location = binary_loc
1074+
elif "disable-features=" in chromium_arg_item:
1075+
d_f = chromium_arg_item.split("disable-features=")[-1]
1076+
extra_disabled_features.append(d_f)
10721077
elif len(chromium_arg_item) >= 3:
10731078
chrome_options.add_argument(chromium_arg_item)
1079+
if disable_features:
1080+
extra_disabled_features.extend(disable_features.split(","))
10741081
if devtools and not headless:
10751082
chrome_options.add_argument("--auto-open-devtools-for-tabs")
10761083
if user_agent:
@@ -1089,19 +1096,36 @@ def _set_chrome_options(
10891096
if headless or headless2 or is_using_uc(undetectable, browser_name):
10901097
chrome_options.add_argument("--disable-renderer-backgrounding")
10911098
chrome_options.add_argument("--disable-backgrounding-occluded-windows")
1099+
chrome_options.add_argument("--disable-client-side-phishing-detection")
1100+
chrome_options.add_argument("--disable-oopr-debug-crash-dump")
1101+
chrome_options.add_argument("--disable-top-sites")
10921102
chrome_options.add_argument("--ash-no-nudges")
1103+
chrome_options.add_argument("--no-crash-upload")
10931104
chrome_options.add_argument("--deny-permission-prompts")
1105+
included_disabled_features = []
10941106
if user_data_dir:
1095-
chrome_options.add_argument(
1096-
"--disable-features=OptimizationHintsFetching,Translate,"
1097-
"OptimizationTargetPrediction,PrivacySandboxSettings4,"
1098-
"DownloadBubble,DownloadBubbleV2"
1099-
)
1107+
included_disabled_features.append("OptimizationHintsFetching")
1108+
included_disabled_features.append("Translate")
1109+
included_disabled_features.append("OptimizationTargetPrediction")
1110+
included_disabled_features.append("PrivacySandboxSettings4")
1111+
included_disabled_features.append("DownloadBubble")
1112+
included_disabled_features.append("DownloadBubbleV2")
1113+
for item in extra_disabled_features:
1114+
if item not in included_disabled_features:
1115+
included_disabled_features.append(item)
1116+
d_f_string = ",".join(included_disabled_features)
1117+
chrome_options.add_argument("--disable-features=%s" % d_f_string)
11001118
else:
1101-
chrome_options.add_argument(
1102-
"--disable-features=OptimizationHintsFetching,Translate,"
1103-
"OptimizationTargetPrediction,DownloadBubble,DownloadBubbleV2"
1104-
)
1119+
included_disabled_features.append("OptimizationHintsFetching")
1120+
included_disabled_features.append("Translate")
1121+
included_disabled_features.append("OptimizationTargetPrediction")
1122+
included_disabled_features.append("DownloadBubble")
1123+
included_disabled_features.append("DownloadBubbleV2")
1124+
for item in extra_disabled_features:
1125+
if item not in included_disabled_features:
1126+
included_disabled_features.append(item)
1127+
d_f_string = ",".join(included_disabled_features)
1128+
chrome_options.add_argument("--disable-features=%s" % d_f_string)
11051129
if (
11061130
is_using_uc(undetectable, browser_name)
11071131
and (
@@ -1338,6 +1362,7 @@ def get_driver(
13381362
user_data_dir=None,
13391363
extension_zip=None,
13401364
extension_dir=None,
1365+
disable_features=None,
13411366
binary_location=None,
13421367
driver_version=None,
13431368
page_load_strategy=None,
@@ -1550,6 +1575,7 @@ def get_driver(
15501575
user_data_dir,
15511576
extension_zip,
15521577
extension_dir,
1578+
disable_features,
15531579
binary_location,
15541580
driver_version,
15551581
page_load_strategy,
@@ -1605,6 +1631,7 @@ def get_driver(
16051631
user_data_dir,
16061632
extension_zip,
16071633
extension_dir,
1634+
disable_features,
16081635
binary_location,
16091636
driver_version,
16101637
page_load_strategy,
@@ -1664,6 +1691,7 @@ def get_remote_driver(
16641691
user_data_dir,
16651692
extension_zip,
16661693
extension_dir,
1694+
disable_features,
16671695
binary_location,
16681696
driver_version,
16691697
page_load_strategy,
@@ -1784,6 +1812,7 @@ def get_remote_driver(
17841812
user_data_dir,
17851813
extension_zip,
17861814
extension_dir,
1815+
disable_features,
17871816
binary_location,
17881817
driver_version,
17891818
page_load_strategy,
@@ -1955,6 +1984,7 @@ def get_remote_driver(
19551984
user_data_dir,
19561985
extension_zip,
19571986
extension_dir,
1987+
disable_features,
19581988
binary_location,
19591989
driver_version,
19601990
page_load_strategy,
@@ -2075,6 +2105,7 @@ def get_local_driver(
20752105
user_data_dir,
20762106
extension_zip,
20772107
extension_dir,
2108+
disable_features,
20782109
binary_location,
20792110
driver_version,
20802111
page_load_strategy,
@@ -2570,18 +2601,6 @@ def get_local_driver(
25702601
edge_options.add_argument(
25712602
"--disable-autofill-keyboard-accessory-view[8]"
25722603
)
2573-
edge_options.add_argument("--ash-no-nudges")
2574-
edge_options.add_argument("--deny-permission-prompts")
2575-
if user_data_dir:
2576-
edge_options.add_argument(
2577-
"--disable-features=OptimizationHintsFetching,Translate,"
2578-
"OptimizationTargetPrediction,PrivacySandboxSettings4"
2579-
)
2580-
else:
2581-
edge_options.add_argument(
2582-
"--disable-features=OptimizationHintsFetching,Translate,"
2583-
"OptimizationTargetPrediction"
2584-
)
25852604
edge_options.add_argument("--disable-browser-side-navigation")
25862605
edge_options.add_argument("--disable-translate")
25872606
if not enable_ws:
@@ -2596,6 +2615,12 @@ def get_local_driver(
25962615
if headless or headless2 or is_using_uc(undetectable, browser_name):
25972616
edge_options.add_argument("--disable-renderer-backgrounding")
25982617
edge_options.add_argument("--disable-backgrounding-occluded-windows")
2618+
edge_options.add_argument("--disable-client-side-phishing-detection")
2619+
edge_options.add_argument("--disable-oopr-debug-crash-dump")
2620+
edge_options.add_argument("--disable-top-sites")
2621+
edge_options.add_argument("--ash-no-nudges")
2622+
edge_options.add_argument("--no-crash-upload")
2623+
edge_options.add_argument("--deny-permission-prompts")
25992624
if (
26002625
page_load_strategy
26012626
and page_load_strategy.lower() in ["eager", "none"]
@@ -2677,6 +2702,7 @@ def get_local_driver(
26772702
edge_options.add_argument("--disable-gpu")
26782703
if IS_LINUX:
26792704
edge_options.add_argument("--disable-dev-shm-usage")
2705+
extra_disabled_features = []
26802706
set_binary = False
26812707
if chromium_arg:
26822708
# Can be a comma-separated list of Chromium args
@@ -2690,8 +2716,33 @@ def get_local_driver(
26902716
chromium_arg_item = "--" + chromium_arg_item
26912717
if "set-binary" in chromium_arg_item:
26922718
set_binary = True
2719+
elif "disable-features=" in chromium_arg_item:
2720+
d_f = chromium_arg_item.split("disable-features=")[-1]
2721+
extra_disabled_features.append(d_f)
26932722
elif len(chromium_arg_item) >= 3:
26942723
edge_options.add_argument(chromium_arg_item)
2724+
if disable_features:
2725+
extra_disabled_features.extend(disable_features.split(","))
2726+
included_disabled_features = []
2727+
if user_data_dir:
2728+
included_disabled_features.append("OptimizationHintsFetching")
2729+
included_disabled_features.append("Translate")
2730+
included_disabled_features.append("OptimizationTargetPrediction")
2731+
included_disabled_features.append("PrivacySandboxSettings4")
2732+
for item in extra_disabled_features:
2733+
if item not in included_disabled_features:
2734+
included_disabled_features.append(item)
2735+
d_f_string = ",".join(included_disabled_features)
2736+
edge_options.add_argument("--disable-features=%s" % d_f_string)
2737+
else:
2738+
included_disabled_features.append("OptimizationHintsFetching")
2739+
included_disabled_features.append("Translate")
2740+
included_disabled_features.append("OptimizationTargetPrediction")
2741+
for item in extra_disabled_features:
2742+
if item not in included_disabled_features:
2743+
included_disabled_features.append(item)
2744+
d_f_string = ",".join(included_disabled_features)
2745+
edge_options.add_argument("--disable-features=%s" % d_f_string)
26952746
if (set_binary or IS_LINUX) and not binary_location:
26962747
br_app = "edge"
26972748
binary_loc = detect_b_ver.get_binary_location(br_app)
@@ -2831,6 +2882,7 @@ def get_local_driver(
28312882
user_data_dir,
28322883
extension_zip,
28332884
extension_dir,
2885+
disable_features,
28342886
binary_location,
28352887
driver_version,
28362888
page_load_strategy,
@@ -3348,6 +3400,7 @@ def get_local_driver(
33483400
None, # user_data_dir
33493401
None, # extension_zip
33503402
None, # extension_dir
3403+
None, # disable_features
33513404
binary_location,
33523405
driver_version,
33533406
page_load_strategy,
@@ -3565,6 +3618,7 @@ def get_local_driver(
35653618
None, # user_data_dir
35663619
None, # extension_zip
35673620
None, # extension_dir
3621+
None, # disable_features
35683622
binary_location,
35693623
driver_version,
35703624
page_load_strategy,

0 commit comments

Comments
 (0)