seleniumbase 4.44.2__tar.gz → 4.44.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {seleniumbase-4.44.2/seleniumbase.egg-info → seleniumbase-4.44.4}/PKG-INFO +4 -3
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/requirements.txt +3 -2
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/__version__.py +1 -1
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/core/browser_launcher.py +57 -28
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/core/sb_cdp.py +8 -1
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/fixtures/base_case.py +27 -24
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/undetected/cdp.py +1 -12
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/undetected/cdp_driver/browser.py +4 -6
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/undetected/cdp_driver/config.py +13 -4
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/undetected/cdp_driver/element.py +4 -1
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/undetected/cdp_driver/tab.py +4 -1
- {seleniumbase-4.44.2 → seleniumbase-4.44.4/seleniumbase.egg-info}/PKG-INFO +4 -3
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase.egg-info/requires.txt +3 -2
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/setup.py +3 -2
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/.gitignore +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/LICENSE +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/MANIFEST.in +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/README.md +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/install.sh +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/pyproject.toml +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/pytest.ini +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/sbase/__init__.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/sbase/__main__.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/sbase/steps.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/__init__.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/__main__.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/behave/__init__.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/behave/behave_helper.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/behave/behave_sb.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/behave/steps.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/common/__init__.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/common/decorators.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/common/encryption.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/common/exceptions.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/common/obfuscate.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/common/unobfuscate.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/config/__init__.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/config/ad_block_list.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/config/proxy_list.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/config/settings.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/console_scripts/__init__.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/console_scripts/logo_helper.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/console_scripts/rich_helper.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/console_scripts/run.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/console_scripts/sb_commander.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/console_scripts/sb_install.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/console_scripts/sb_objectify.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/console_scripts/sb_print.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/console_scripts/sb_recorder.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/core/__init__.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/core/application_manager.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/core/capabilities_parser.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/core/colored_traceback.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/core/create_db_tables.sql +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/core/detect_b_ver.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/core/download_helper.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/core/encoded_images.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/core/jqc_helper.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/core/log_helper.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/core/mysql.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/core/proxy_helper.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/core/recorder_helper.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/core/report_helper.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/core/s3_manager.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/core/sb_driver.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/core/session_helper.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/core/settings_parser.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/core/style_sheet.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/core/testcase_manager.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/core/tour_helper.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/core/visual_helper.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/drivers/__init__.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/drivers/atlas_drivers/__init__.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/drivers/brave_drivers/__init__.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/drivers/cft_drivers/__init__.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/drivers/chs_drivers/__init__.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/drivers/comet_drivers/__init__.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/drivers/opera_drivers/__init__.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/extensions/__init__.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/extensions/ad_block.zip +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/extensions/disable_csp.zip +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/extensions/recorder.zip +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/extensions/sbase_ext.zip +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/fixtures/__init__.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/fixtures/constants.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/fixtures/css_to_xpath.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/fixtures/errors.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/fixtures/js_utils.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/fixtures/page_actions.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/fixtures/page_utils.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/fixtures/shared_utils.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/fixtures/unittest_helper.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/fixtures/words.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/fixtures/xpath_to_css.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/js_code/__init__.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/js_code/active_css_js.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/js_code/live_js.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/js_code/recorder_js.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/masterqa/__init__.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/masterqa/master_qa.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/plugins/__init__.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/plugins/base_plugin.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/plugins/basic_test_info.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/plugins/driver_manager.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/plugins/page_source.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/plugins/pytest_plugin.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/plugins/sb_manager.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/plugins/screen_shots.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/plugins/selenium_plugin.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/resources/__init__.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/translate/__init__.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/translate/chinese.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/translate/dutch.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/translate/french.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/translate/italian.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/translate/japanese.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/translate/korean.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/translate/master_dict.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/translate/portuguese.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/translate/russian.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/translate/spanish.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/translate/translator.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/undetected/__init__.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/undetected/cdp_driver/__init__.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/undetected/cdp_driver/cdp_util.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/undetected/cdp_driver/connection.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/undetected/dprocess.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/undetected/options.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/undetected/patcher.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/undetected/reactor.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/undetected/webelement.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/utilities/__init__.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/utilities/selenium_grid/font_color +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase.egg-info/SOURCES.txt +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase.egg-info/dependency_links.txt +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase.egg-info/entry_points.txt +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/seleniumbase.egg-info/top_level.txt +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/setup.cfg +0 -0
- {seleniumbase-4.44.2 → seleniumbase-4.44.4}/virtualenv_install.sh +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: seleniumbase
|
|
3
|
-
Version: 4.44.
|
|
3
|
+
Version: 4.44.4
|
|
4
4
|
Summary: A complete web automation framework for end-to-end testing.
|
|
5
5
|
Home-page: https://github.com/seleniumbase/SeleniumBase
|
|
6
6
|
Author: Michael Mintz
|
|
@@ -75,7 +75,7 @@ Requires-Dist: filelock~=3.16.1; python_version < "3.9"
|
|
|
75
75
|
Requires-Dist: filelock~=3.19.1; python_version >= "3.9" and python_version < "3.10"
|
|
76
76
|
Requires-Dist: filelock>=3.20.0; python_version >= "3.10"
|
|
77
77
|
Requires-Dist: fasteners>=0.20
|
|
78
|
-
Requires-Dist: mycdp>=1.
|
|
78
|
+
Requires-Dist: mycdp>=1.3.0
|
|
79
79
|
Requires-Dist: pynose>=1.5.5
|
|
80
80
|
Requires-Dist: platformdirs~=4.3.6; python_version < "3.9"
|
|
81
81
|
Requires-Dist: platformdirs~=4.4.0; python_version >= "3.9" and python_version < "3.10"
|
|
@@ -106,7 +106,8 @@ Requires-Dist: sniffio==1.3.1
|
|
|
106
106
|
Requires-Dist: h11==0.16.0
|
|
107
107
|
Requires-Dist: outcome==1.3.0.post0
|
|
108
108
|
Requires-Dist: trio==0.27.0; python_version < "3.9"
|
|
109
|
-
Requires-Dist: trio<1,>=0.31.0; python_version >= "3.9"
|
|
109
|
+
Requires-Dist: trio<1,>=0.31.0; python_version >= "3.9" and python_version < "3.10"
|
|
110
|
+
Requires-Dist: trio<1,>=0.32.0; python_version >= "3.10"
|
|
110
111
|
Requires-Dist: trio-websocket~=0.12.2
|
|
111
112
|
Requires-Dist: wsproto==1.2.0
|
|
112
113
|
Requires-Dist: websocket-client~=1.8.0; python_version < "3.9"
|
|
@@ -14,7 +14,7 @@ filelock~=3.16.1;python_version<"3.9"
|
|
|
14
14
|
filelock~=3.19.1;python_version>="3.9" and python_version<"3.10"
|
|
15
15
|
filelock>=3.20.0;python_version>="3.10"
|
|
16
16
|
fasteners>=0.20
|
|
17
|
-
mycdp>=1.
|
|
17
|
+
mycdp>=1.3.0
|
|
18
18
|
pynose>=1.5.5
|
|
19
19
|
platformdirs~=4.3.6;python_version<"3.9"
|
|
20
20
|
platformdirs~=4.4.0;python_version>="3.9" and python_version<"3.10"
|
|
@@ -45,7 +45,8 @@ sniffio==1.3.1
|
|
|
45
45
|
h11==0.16.0
|
|
46
46
|
outcome==1.3.0.post0
|
|
47
47
|
trio==0.27.0;python_version<"3.9"
|
|
48
|
-
trio>=0.31.0,<1;python_version>="3.9"
|
|
48
|
+
trio>=0.31.0,<1;python_version>="3.9" and python_version<"3.10"
|
|
49
|
+
trio>=0.32.0,<1;python_version>="3.10"
|
|
49
50
|
trio-websocket~=0.12.2
|
|
50
51
|
wsproto==1.2.0
|
|
51
52
|
websocket-client~=1.8.0;python_version<"3.9"
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
# seleniumbase package
|
|
2
|
-
__version__ = "4.44.
|
|
2
|
+
__version__ = "4.44.4"
|
|
@@ -293,7 +293,17 @@ def extend_driver(
|
|
|
293
293
|
)
|
|
294
294
|
if hasattr(driver, "proxy"):
|
|
295
295
|
driver.set_wire_proxy = DM.set_wire_proxy
|
|
296
|
+
completed_loads = []
|
|
297
|
+
for ext_dir in sb_config._ext_dirs:
|
|
298
|
+
if ext_dir not in completed_loads:
|
|
299
|
+
completed_loads.append(ext_dir)
|
|
300
|
+
if not use_uc and os.path.exists(os.path.realpath(ext_dir)):
|
|
301
|
+
with suppress(Exception):
|
|
302
|
+
driver.webextension.install(os.path.realpath(ext_dir))
|
|
296
303
|
if proxy_auth:
|
|
304
|
+
if not use_uc and os.path.exists(proxy_helper.PROXY_DIR_PATH):
|
|
305
|
+
with suppress(Exception):
|
|
306
|
+
driver.webextension.install(proxy_helper.PROXY_DIR_PATH)
|
|
297
307
|
# Proxy needs a moment to load in Manifest V3
|
|
298
308
|
if use_uc:
|
|
299
309
|
time.sleep(0.14)
|
|
@@ -828,6 +838,7 @@ def uc_open_with_cdp_mode(driver, url=None, **kwargs):
|
|
|
828
838
|
cdp.get_element_position = CDPM.get_element_position
|
|
829
839
|
cdp.get_gui_element_rect = CDPM.get_gui_element_rect
|
|
830
840
|
cdp.get_gui_element_center = CDPM.get_gui_element_center
|
|
841
|
+
cdp.get_html = CDPM.get_html
|
|
831
842
|
cdp.get_page_source = CDPM.get_page_source
|
|
832
843
|
cdp.get_user_agent = CDPM.get_user_agent
|
|
833
844
|
cdp.get_cookie_string = CDPM.get_cookie_string
|
|
@@ -924,6 +935,7 @@ def uc_open_with_cdp_mode(driver, url=None, **kwargs):
|
|
|
924
935
|
cdp.core = core_items
|
|
925
936
|
cdp.loop = cdp.get_event_loop()
|
|
926
937
|
driver.cdp = cdp
|
|
938
|
+
driver.solve_captcha = CDPM.solve_captcha
|
|
927
939
|
driver._is_using_cdp = True
|
|
928
940
|
|
|
929
941
|
|
|
@@ -2087,6 +2099,7 @@ def _add_chrome_proxy_extension(
|
|
|
2087
2099
|
"""Implementation of https://stackoverflow.com/a/35293284/7058266
|
|
2088
2100
|
for https://stackoverflow.com/q/12848327/7058266
|
|
2089
2101
|
(Run Selenium on a proxy server that requires authentication.)"""
|
|
2102
|
+
zip_it = False
|
|
2090
2103
|
args = " ".join(sys.argv)
|
|
2091
2104
|
bypass_list = proxy_bypass_list
|
|
2092
2105
|
if (
|
|
@@ -2466,14 +2479,28 @@ def _set_chrome_options(
|
|
|
2466
2479
|
# Can be a comma-separated list of .ZIP or .CRX files
|
|
2467
2480
|
extension_zip_list = extension_zip.split(",")
|
|
2468
2481
|
for extension_zip_item in extension_zip_list:
|
|
2469
|
-
abs_path = os.path.
|
|
2470
|
-
|
|
2482
|
+
abs_path = os.path.realpath(extension_zip_item)
|
|
2483
|
+
if os.path.exists(abs_path):
|
|
2484
|
+
try:
|
|
2485
|
+
abs_path_dir = os.path.join(
|
|
2486
|
+
DOWNLOADS_FOLDER, abs_path.split(".")[0]
|
|
2487
|
+
)
|
|
2488
|
+
_unzip_to_new_folder(abs_path, abs_path_dir)
|
|
2489
|
+
chrome_options = add_chrome_ext_dir(
|
|
2490
|
+
chrome_options, abs_path_dir
|
|
2491
|
+
)
|
|
2492
|
+
sb_config._ext_dirs.append(abs_path_dir)
|
|
2493
|
+
except Exception:
|
|
2494
|
+
with suppress(Exception):
|
|
2495
|
+
chrome_options.add_extension(abs_path)
|
|
2471
2496
|
if extension_dir:
|
|
2472
2497
|
# load-extension input can be a comma-separated list
|
|
2473
2498
|
abs_path = (
|
|
2474
|
-
",".join(os.path.
|
|
2499
|
+
",".join(os.path.realpath(p) for p in extension_dir.split(","))
|
|
2475
2500
|
)
|
|
2476
2501
|
chrome_options = add_chrome_ext_dir(chrome_options, abs_path)
|
|
2502
|
+
for p in extension_dir.split(","):
|
|
2503
|
+
sb_config._ext_dirs.append(os.path.realpath(p))
|
|
2477
2504
|
if (
|
|
2478
2505
|
page_load_strategy
|
|
2479
2506
|
and page_load_strategy.lower() in ["eager", "none"]
|
|
@@ -2508,37 +2535,32 @@ def _set_chrome_options(
|
|
|
2508
2535
|
if (settings.DISABLE_CSP_ON_CHROME or disable_csp) and not headless:
|
|
2509
2536
|
# Headless Chrome does not support extensions, which are required
|
|
2510
2537
|
# for disabling the Content Security Policy on Chrome.
|
|
2511
|
-
|
|
2512
|
-
|
|
2513
|
-
|
|
2514
|
-
|
|
2515
|
-
chrome_options
|
|
2516
|
-
|
|
2517
|
-
|
|
2518
|
-
else:
|
|
2519
|
-
chrome_options = _add_chrome_disable_csp_extension(chrome_options)
|
|
2538
|
+
disable_csp_zip = DISABLE_CSP_ZIP_PATH
|
|
2539
|
+
disable_csp_dir = os.path.join(DOWNLOADS_FOLDER, "disable_csp")
|
|
2540
|
+
_unzip_to_new_folder(disable_csp_zip, disable_csp_dir)
|
|
2541
|
+
chrome_options = add_chrome_ext_dir(
|
|
2542
|
+
chrome_options, disable_csp_dir
|
|
2543
|
+
)
|
|
2544
|
+
sb_config._ext_dirs.append(disable_csp_dir)
|
|
2520
2545
|
if ad_block_on and not headless:
|
|
2521
2546
|
# Headless Chrome does not support extensions.
|
|
2522
|
-
|
|
2523
|
-
|
|
2524
|
-
|
|
2525
|
-
|
|
2526
|
-
|
|
2527
|
-
else:
|
|
2528
|
-
chrome_options = _add_chrome_ad_block_extension(chrome_options)
|
|
2547
|
+
ad_block_zip = AD_BLOCK_ZIP_PATH
|
|
2548
|
+
ad_block_dir = os.path.join(DOWNLOADS_FOLDER, "ad_block")
|
|
2549
|
+
_unzip_to_new_folder(ad_block_zip, ad_block_dir)
|
|
2550
|
+
chrome_options = add_chrome_ext_dir(chrome_options, ad_block_dir)
|
|
2551
|
+
sb_config._ext_dirs.append(ad_block_dir)
|
|
2529
2552
|
if recorder_ext and not headless:
|
|
2530
|
-
|
|
2531
|
-
|
|
2532
|
-
|
|
2533
|
-
|
|
2534
|
-
|
|
2535
|
-
else:
|
|
2536
|
-
chrome_options = _add_chrome_recorder_extension(chrome_options)
|
|
2553
|
+
recorder_zip = RECORDER_ZIP_PATH
|
|
2554
|
+
recorder_dir = os.path.join(DOWNLOADS_FOLDER, "recorder")
|
|
2555
|
+
_unzip_to_new_folder(recorder_zip, recorder_dir)
|
|
2556
|
+
chrome_options = add_chrome_ext_dir(chrome_options, recorder_dir)
|
|
2557
|
+
sb_config._ext_dirs.append(recorder_dir)
|
|
2537
2558
|
if chromium_arg and "sbase" in chromium_arg:
|
|
2538
2559
|
sbase_ext_zip = SBASE_EXT_ZIP_PATH
|
|
2539
2560
|
sbase_ext_dir = os.path.join(DOWNLOADS_FOLDER, "sbase_ext")
|
|
2540
2561
|
_unzip_to_new_folder(sbase_ext_zip, sbase_ext_dir)
|
|
2541
2562
|
chrome_options = add_chrome_ext_dir(chrome_options, sbase_ext_dir)
|
|
2563
|
+
sb_config._ext_dirs.append(sbase_ext_dir)
|
|
2542
2564
|
if proxy_string:
|
|
2543
2565
|
if proxy_auth:
|
|
2544
2566
|
zip_it = True
|
|
@@ -2722,8 +2744,14 @@ def _set_chrome_options(
|
|
|
2722
2744
|
included_disabled_features.append(item)
|
|
2723
2745
|
d_f_string = ",".join(included_disabled_features)
|
|
2724
2746
|
chrome_options.add_argument("--disable-features=%s" % d_f_string)
|
|
2747
|
+
chrome_options.add_argument("--enable-unsafe-extension-debugging")
|
|
2725
2748
|
if proxy_auth:
|
|
2726
2749
|
chrome_options.add_argument("--test-type")
|
|
2750
|
+
if proxy_auth or sb_config._ext_dirs:
|
|
2751
|
+
if not is_using_uc(undetectable, browser_name):
|
|
2752
|
+
chrome_options.add_argument("--remote-debugging-pipe")
|
|
2753
|
+
chrome_options.enable_webextensions = True
|
|
2754
|
+
chrome_options.enable_bidi = True
|
|
2727
2755
|
if (
|
|
2728
2756
|
is_using_uc(undetectable, browser_name)
|
|
2729
2757
|
and (
|
|
@@ -2988,6 +3016,7 @@ def get_driver(
|
|
|
2988
3016
|
device_pixel_ratio=None,
|
|
2989
3017
|
browser=None, # A duplicate of browser_name to avoid confusion
|
|
2990
3018
|
):
|
|
3019
|
+
sb_config._ext_dirs = []
|
|
2991
3020
|
driver_dir = DRIVER_DIR
|
|
2992
3021
|
if (
|
|
2993
3022
|
hasattr(sb_config, "binary_location")
|
|
@@ -4552,12 +4581,12 @@ def get_local_driver(
|
|
|
4552
4581
|
# Can be a comma-separated list of .ZIP or .CRX files
|
|
4553
4582
|
extension_zip_list = extension_zip.split(",")
|
|
4554
4583
|
for extension_zip_item in extension_zip_list:
|
|
4555
|
-
abs_path = os.path.
|
|
4584
|
+
abs_path = os.path.realpath(extension_zip_item)
|
|
4556
4585
|
edge_options.add_extension(abs_path)
|
|
4557
4586
|
if extension_dir:
|
|
4558
4587
|
# load-extension input can be a comma-separated list
|
|
4559
4588
|
abs_path = (
|
|
4560
|
-
",".join(os.path.
|
|
4589
|
+
",".join(os.path.realpath(p) for p in extension_dir.split(","))
|
|
4561
4590
|
)
|
|
4562
4591
|
edge_options = add_chrome_ext_dir(edge_options, abs_path)
|
|
4563
4592
|
edge_options.add_argument("--disable-infobars")
|
|
@@ -1185,7 +1185,14 @@ class CDPMethods():
|
|
|
1185
1185
|
self.page.evaluate("window.location.origin")
|
|
1186
1186
|
)
|
|
1187
1187
|
|
|
1188
|
-
def
|
|
1188
|
+
def get_html(self, include_shadow_dom=True):
|
|
1189
|
+
return self.get_page_source(
|
|
1190
|
+
include_shadow_dom=include_shadow_dom
|
|
1191
|
+
)
|
|
1192
|
+
|
|
1193
|
+
def get_page_source(self, include_shadow_dom=True):
|
|
1194
|
+
if include_shadow_dom:
|
|
1195
|
+
return self.find_element("html").get_html()
|
|
1189
1196
|
try:
|
|
1190
1197
|
source = self.loop.run_until_complete(
|
|
1191
1198
|
self.page.evaluate("document.documentElement.outerHTML")
|
|
@@ -1293,8 +1293,11 @@ class BaseCase(unittest.TestCase):
|
|
|
1293
1293
|
self.__check_scope()
|
|
1294
1294
|
return self.execute_script("return window.location.origin;")
|
|
1295
1295
|
|
|
1296
|
-
def
|
|
1297
|
-
|
|
1296
|
+
def get_html(self, *args, **kwargs):
|
|
1297
|
+
return self.get_page_source(*args, **kwargs)
|
|
1298
|
+
|
|
1299
|
+
def get_page_source(self, *args, **kwargs):
|
|
1300
|
+
if self.__is_cdp_swap_needed(*args, **kwargs):
|
|
1298
1301
|
return self.cdp.get_page_source()
|
|
1299
1302
|
self.wait_for_ready_state_complete()
|
|
1300
1303
|
if self.__needs_minimum_wait:
|
|
@@ -4694,7 +4697,7 @@ class BaseCase(unittest.TestCase):
|
|
|
4694
4697
|
if not os.path.exists(file_path):
|
|
4695
4698
|
os.makedirs(file_path)
|
|
4696
4699
|
cookies_file_path = os.path.join(file_path, name)
|
|
4697
|
-
cookies_file = open(cookies_file_path, "w+", encoding="utf-8")
|
|
4700
|
+
cookies_file = open(cookies_file_path, mode="w+", encoding="utf-8")
|
|
4698
4701
|
cookies_file.writelines(json_cookies)
|
|
4699
4702
|
cookies_file.close()
|
|
4700
4703
|
|
|
@@ -5751,7 +5754,7 @@ class BaseCase(unittest.TestCase):
|
|
|
5751
5754
|
extra_file_name = "__init__.py"
|
|
5752
5755
|
extra_file_path = os.path.join(recordings_folder, extra_file_name)
|
|
5753
5756
|
if not os.path.exists(extra_file_path):
|
|
5754
|
-
out_file = open(extra_file_path, "w+", "utf-8")
|
|
5757
|
+
out_file = open(extra_file_path, mode="w+", encoding="utf-8")
|
|
5755
5758
|
out_file.writelines("\r\n".join(data))
|
|
5756
5759
|
out_file.close()
|
|
5757
5760
|
sys.stdout.write("\nCreated recordings%s__init__.py" % os.sep)
|
|
@@ -5799,7 +5802,7 @@ class BaseCase(unittest.TestCase):
|
|
|
5799
5802
|
extra_file_name = "pytest.ini"
|
|
5800
5803
|
extra_file_path = os.path.join(recordings_folder, extra_file_name)
|
|
5801
5804
|
if not os.path.exists(extra_file_path):
|
|
5802
|
-
out_file = open(extra_file_path, "w+", "utf-8")
|
|
5805
|
+
out_file = open(extra_file_path, mode="w+", encoding="utf-8")
|
|
5803
5806
|
out_file.writelines("\r\n".join(data))
|
|
5804
5807
|
out_file.close()
|
|
5805
5808
|
sys.stdout.write("\nCreated recordings%spytest.ini" % os.sep)
|
|
@@ -5820,7 +5823,7 @@ class BaseCase(unittest.TestCase):
|
|
|
5820
5823
|
extra_file_name = "setup.cfg"
|
|
5821
5824
|
extra_file_path = os.path.join(recordings_folder, extra_file_name)
|
|
5822
5825
|
if not os.path.exists(extra_file_path):
|
|
5823
|
-
out_file = open(extra_file_path, "w+", "utf-8")
|
|
5826
|
+
out_file = open(extra_file_path, mode="w+", encoding="utf-8")
|
|
5824
5827
|
out_file.writelines("\r\n".join(data))
|
|
5825
5828
|
out_file.close()
|
|
5826
5829
|
sys.stdout.write("\nCreated recordings%ssetup.cfg" % os.sep)
|
|
@@ -5838,7 +5841,7 @@ class BaseCase(unittest.TestCase):
|
|
|
5838
5841
|
elif context_filename:
|
|
5839
5842
|
file_name = context_filename
|
|
5840
5843
|
file_path = os.path.join(recordings_folder, file_name)
|
|
5841
|
-
out_file = open(file_path, "w+", "utf-8")
|
|
5844
|
+
out_file = open(file_path, mode="w+", encoding="utf-8")
|
|
5842
5845
|
out_file.writelines("\r\n".join(data))
|
|
5843
5846
|
out_file.close()
|
|
5844
5847
|
rec_message = ">>> RECORDING SAVED as: "
|
|
@@ -5940,7 +5943,7 @@ class BaseCase(unittest.TestCase):
|
|
|
5940
5943
|
file_name = sb_config.behave_scenario.filename.replace(".", "_")
|
|
5941
5944
|
file_name = file_name.split("/")[-1].split("\\")[-1] + "_rec.feature"
|
|
5942
5945
|
file_path = os.path.join(features_folder, file_name)
|
|
5943
|
-
out_file = open(file_path, "w+", "utf-8")
|
|
5946
|
+
out_file = open(file_path, mode="w+", encoding="utf-8")
|
|
5944
5947
|
out_file.writelines("\r\n".join(data))
|
|
5945
5948
|
out_file.close()
|
|
5946
5949
|
|
|
@@ -5978,7 +5981,7 @@ class BaseCase(unittest.TestCase):
|
|
|
5978
5981
|
file_name = "__init__.py"
|
|
5979
5982
|
file_path = os.path.join(features_folder, file_name)
|
|
5980
5983
|
if not os.path.exists(file_path):
|
|
5981
|
-
out_file = open(file_path, "w+", "utf-8")
|
|
5984
|
+
out_file = open(file_path, mode="w+", encoding="utf-8")
|
|
5982
5985
|
out_file.writelines("\r\n".join(data))
|
|
5983
5986
|
out_file.close()
|
|
5984
5987
|
print("Created recordings/features/__init__.py")
|
|
@@ -5991,7 +5994,7 @@ class BaseCase(unittest.TestCase):
|
|
|
5991
5994
|
file_name = "behave.ini"
|
|
5992
5995
|
file_path = os.path.join(features_folder, file_name)
|
|
5993
5996
|
if not os.path.exists(file_path):
|
|
5994
|
-
out_file = open(file_path, "w+", "utf-8")
|
|
5997
|
+
out_file = open(file_path, mode="w+", encoding="utf-8")
|
|
5995
5998
|
out_file.writelines("\r\n".join(data))
|
|
5996
5999
|
out_file.close()
|
|
5997
6000
|
print("Created recordings/features/behave.ini")
|
|
@@ -6030,7 +6033,7 @@ class BaseCase(unittest.TestCase):
|
|
|
6030
6033
|
file_name = "environment.py"
|
|
6031
6034
|
file_path = os.path.join(features_folder, file_name)
|
|
6032
6035
|
if not os.path.exists(file_path):
|
|
6033
|
-
out_file = open(file_path, "w+", "utf-8")
|
|
6036
|
+
out_file = open(file_path, mode="w+", encoding="utf-8")
|
|
6034
6037
|
out_file.writelines("\r\n".join(data))
|
|
6035
6038
|
out_file.close()
|
|
6036
6039
|
print("Created recordings/features/environment.py")
|
|
@@ -6040,7 +6043,7 @@ class BaseCase(unittest.TestCase):
|
|
|
6040
6043
|
file_name = "__init__.py"
|
|
6041
6044
|
file_path = os.path.join(steps_folder, file_name)
|
|
6042
6045
|
if not os.path.exists(file_path):
|
|
6043
|
-
out_file = open(file_path, "w+", "utf-8")
|
|
6046
|
+
out_file = open(file_path, mode="w+", encoding="utf-8")
|
|
6044
6047
|
out_file.writelines("\r\n".join(data))
|
|
6045
6048
|
out_file.close()
|
|
6046
6049
|
print("Created recordings/features/steps/__init__.py")
|
|
@@ -6051,7 +6054,7 @@ class BaseCase(unittest.TestCase):
|
|
|
6051
6054
|
file_name = "imported.py"
|
|
6052
6055
|
file_path = os.path.join(steps_folder, file_name)
|
|
6053
6056
|
if not os.path.exists(file_path):
|
|
6054
|
-
out_file = open(file_path, "w+", "utf-8")
|
|
6057
|
+
out_file = open(file_path, mode="w+", encoding="utf-8")
|
|
6055
6058
|
out_file.writelines("\r\n".join(data))
|
|
6056
6059
|
out_file.close()
|
|
6057
6060
|
print("Created recordings/features/steps/imported.py")
|
|
@@ -11120,7 +11123,7 @@ class BaseCase(unittest.TestCase):
|
|
|
11120
11123
|
return # Skip the rest when deferred visual asserts are used
|
|
11121
11124
|
the_html = visual_helper.get_sbs_html()
|
|
11122
11125
|
file_path = os.path.join(test_logpath, constants.SideBySide.HTML_FILE)
|
|
11123
|
-
out_file = open(file_path, "w+", encoding="utf-8")
|
|
11126
|
+
out_file = open(file_path, mode="w+", encoding="utf-8")
|
|
11124
11127
|
out_file.writelines(the_html)
|
|
11125
11128
|
out_file.close()
|
|
11126
11129
|
|
|
@@ -11280,16 +11283,16 @@ class BaseCase(unittest.TestCase):
|
|
|
11280
11283
|
self.save_screenshot(
|
|
11281
11284
|
baseline_png, visual_baseline_path, selector="body"
|
|
11282
11285
|
)
|
|
11283
|
-
out_file = open(page_url_file, "w+", encoding="utf-8")
|
|
11286
|
+
out_file = open(page_url_file, mode="w+", encoding="utf-8")
|
|
11284
11287
|
out_file.writelines(page_url)
|
|
11285
11288
|
out_file.close()
|
|
11286
|
-
out_file = open(level_1_file, "w+", encoding="utf-8")
|
|
11289
|
+
out_file = open(level_1_file, mode="w+", encoding="utf-8")
|
|
11287
11290
|
out_file.writelines(json.dumps(level_1))
|
|
11288
11291
|
out_file.close()
|
|
11289
|
-
out_file = open(level_2_file, "w+", encoding="utf-8")
|
|
11292
|
+
out_file = open(level_2_file, mode="w+", encoding="utf-8")
|
|
11290
11293
|
out_file.writelines(json.dumps(level_2))
|
|
11291
11294
|
out_file.close()
|
|
11292
|
-
out_file = open(level_3_file, "w+", encoding="utf-8")
|
|
11295
|
+
out_file = open(level_3_file, mode="w+", encoding="utf-8")
|
|
11293
11296
|
out_file.writelines(json.dumps(level_3))
|
|
11294
11297
|
out_file.close()
|
|
11295
11298
|
|
|
@@ -11428,7 +11431,7 @@ class BaseCase(unittest.TestCase):
|
|
|
11428
11431
|
alpha_n_d_name = "".join([x if x.isalnum() else "_" for x in name])
|
|
11429
11432
|
side_by_side_name = "side_by_side_%s.html" % alpha_n_d_name
|
|
11430
11433
|
file_path = os.path.join(test_logpath, side_by_side_name)
|
|
11431
|
-
out_file = open(file_path, "w+", encoding="utf-8")
|
|
11434
|
+
out_file = open(file_path, mode="w+", encoding="utf-8")
|
|
11432
11435
|
out_file.writelines(the_html)
|
|
11433
11436
|
out_file.close()
|
|
11434
11437
|
|
|
@@ -12120,7 +12123,7 @@ class BaseCase(unittest.TestCase):
|
|
|
12120
12123
|
with suppress(Exception):
|
|
12121
12124
|
os.makedirs(saved_presentations_folder)
|
|
12122
12125
|
file_path = os.path.join(saved_presentations_folder, filename)
|
|
12123
|
-
out_file = open(file_path, "w+", encoding="utf-8")
|
|
12126
|
+
out_file = open(file_path, mode="w+", encoding="utf-8")
|
|
12124
12127
|
out_file.writelines(the_html)
|
|
12125
12128
|
out_file.close()
|
|
12126
12129
|
if self._output_file_saves:
|
|
@@ -12815,7 +12818,7 @@ class BaseCase(unittest.TestCase):
|
|
|
12815
12818
|
with suppress(Exception):
|
|
12816
12819
|
os.makedirs(saved_charts_folder)
|
|
12817
12820
|
file_path = os.path.join(saved_charts_folder, filename)
|
|
12818
|
-
out_file = open(file_path, "w+", encoding="utf-8")
|
|
12821
|
+
out_file = open(file_path, mode="w+", encoding="utf-8")
|
|
12819
12822
|
out_file.writelines(the_html)
|
|
12820
12823
|
out_file.close()
|
|
12821
12824
|
if self._output_file_saves:
|
|
@@ -16378,7 +16381,7 @@ class BaseCase(unittest.TestCase):
|
|
|
16378
16381
|
dash_pie = json.dumps(sb_config._saved_dashboard_pie)
|
|
16379
16382
|
dash_pie_loc = constants.Dashboard.DASH_PIE
|
|
16380
16383
|
pie_path = os.path.join(abs_path, dash_pie_loc)
|
|
16381
|
-
pie_file = open(pie_path, "w+", encoding="utf-8")
|
|
16384
|
+
pie_file = open(pie_path, mode="w+", encoding="utf-8")
|
|
16382
16385
|
pie_file.writelines(dash_pie)
|
|
16383
16386
|
pie_file.close()
|
|
16384
16387
|
DASH_PIE_PNG_1 = constants.Dashboard.get_dash_pie_1()
|
|
@@ -16538,7 +16541,7 @@ class BaseCase(unittest.TestCase):
|
|
|
16538
16541
|
)
|
|
16539
16542
|
abs_path = os.path.abspath(".")
|
|
16540
16543
|
file_path = os.path.join(abs_path, "dashboard.html")
|
|
16541
|
-
out_file = open(file_path, "w+", encoding="utf-8")
|
|
16544
|
+
out_file = open(file_path, mode="w+", encoding="utf-8")
|
|
16542
16545
|
out_file.writelines(the_html)
|
|
16543
16546
|
out_file.close()
|
|
16544
16547
|
sb_config._dash_html = the_html
|
|
@@ -16551,7 +16554,7 @@ class BaseCase(unittest.TestCase):
|
|
|
16551
16554
|
dash_json = json.dumps((_results, _display_id, _rt, _tlp, d_stats))
|
|
16552
16555
|
dash_json_loc = constants.Dashboard.DASH_JSON
|
|
16553
16556
|
dash_jsonpath = os.path.join(abs_path, dash_json_loc)
|
|
16554
|
-
dash_json_file = open(dash_jsonpath, "w+", encoding="utf-8")
|
|
16557
|
+
dash_json_file = open(dash_jsonpath, mode="w+", encoding="utf-8")
|
|
16555
16558
|
dash_json_file.writelines(dash_json)
|
|
16556
16559
|
dash_json_file.close()
|
|
16557
16560
|
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
import fasteners
|
|
2
1
|
import json
|
|
3
2
|
import logging
|
|
4
3
|
import requests
|
|
5
|
-
|
|
6
|
-
from seleniumbase.fixtures import shared_utils
|
|
4
|
+
import websockets
|
|
7
5
|
|
|
8
6
|
log = logging.getLogger(__name__)
|
|
9
7
|
|
|
@@ -107,15 +105,6 @@ class CDP:
|
|
|
107
105
|
return resp.json()
|
|
108
106
|
|
|
109
107
|
async def send(self, method, params):
|
|
110
|
-
pip_find_lock = fasteners.InterProcessLock(
|
|
111
|
-
constants.PipInstall.FINDLOCK
|
|
112
|
-
)
|
|
113
|
-
with pip_find_lock:
|
|
114
|
-
try:
|
|
115
|
-
import websockets
|
|
116
|
-
except Exception:
|
|
117
|
-
shared_utils.pip_install("websockets")
|
|
118
|
-
import websockets
|
|
119
108
|
self._reqid += 1
|
|
120
109
|
async with websockets.connect(self.wsurl) as ws:
|
|
121
110
|
await ws.send(
|
|
@@ -350,8 +350,7 @@ class Browser:
|
|
|
350
350
|
if _cdp_geolocation:
|
|
351
351
|
await connection.send(cdp.page.navigate("about:blank"))
|
|
352
352
|
await connection.set_geolocation(_cdp_geolocation)
|
|
353
|
-
#
|
|
354
|
-
"""
|
|
353
|
+
# (The code below is for the Chrome 142 extension fix)
|
|
355
354
|
if (
|
|
356
355
|
hasattr(sb_config, "_cdp_proxy")
|
|
357
356
|
and "@" in sb_config._cdp_proxy
|
|
@@ -363,7 +362,6 @@ class Browser:
|
|
|
363
362
|
proxy_pass = username_and_password.split(":")[1]
|
|
364
363
|
await connection.set_auth(proxy_user, proxy_pass, self.tabs[0])
|
|
365
364
|
time.sleep(0.25)
|
|
366
|
-
"""
|
|
367
365
|
if "auth" in kwargs and kwargs["auth"] and ":" in kwargs["auth"]:
|
|
368
366
|
username_and_password = kwargs["auth"]
|
|
369
367
|
proxy_user = username_and_password.split(":")[0]
|
|
@@ -375,12 +373,12 @@ class Browser:
|
|
|
375
373
|
cdp.page.navigate(url)
|
|
376
374
|
)
|
|
377
375
|
if _cdp_recorder:
|
|
378
|
-
|
|
379
|
-
|
|
376
|
+
# (The code below is for the Chrome 142 extension fix)
|
|
377
|
+
from seleniumbase.js_code.recorder_js import recorder_js
|
|
380
378
|
recorder_code = (
|
|
381
379
|
"""window.onload = function() { %s };""" % recorder_js
|
|
382
380
|
)
|
|
383
|
-
await connection.send(cdp.runtime.evaluate(recorder_code))
|
|
381
|
+
await connection.send(cdp.runtime.evaluate(recorder_code))
|
|
384
382
|
# Update the frame_id on the tab
|
|
385
383
|
connection.frame_id = frame_id
|
|
386
384
|
connection.browser = self
|
|
@@ -79,7 +79,8 @@ class Config:
|
|
|
79
79
|
if not browser_args:
|
|
80
80
|
browser_args = []
|
|
81
81
|
if not user_data_dir:
|
|
82
|
-
self.
|
|
82
|
+
self.user_data_dir = temp_profile_dir()
|
|
83
|
+
self._user_data_dir = self.user_data_dir
|
|
83
84
|
self._custom_data_dir = False
|
|
84
85
|
else:
|
|
85
86
|
self.user_data_dir = user_data_dir
|
|
@@ -129,6 +130,7 @@ class Config:
|
|
|
129
130
|
"--no-default-browser-check",
|
|
130
131
|
"--homepage=about:blank",
|
|
131
132
|
"--no-pings",
|
|
133
|
+
"--enable-unsafe-extension-debugging",
|
|
132
134
|
"--wm-window-animations-disabled",
|
|
133
135
|
"--animation-duration-scale=0",
|
|
134
136
|
"--enable-privacy-sandbox-ads-apis",
|
|
@@ -315,10 +317,13 @@ def find_chrome_executable(return_all=False):
|
|
|
315
317
|
for item in os.environ.get("PATH").split(os.pathsep):
|
|
316
318
|
for subitem in (
|
|
317
319
|
"google-chrome",
|
|
320
|
+
"google-chrome-stable",
|
|
321
|
+
"google-chrome-beta",
|
|
322
|
+
"google-chrome-dev",
|
|
323
|
+
"google-chrome-unstable",
|
|
324
|
+
"chrome",
|
|
318
325
|
"chromium",
|
|
319
326
|
"chromium-browser",
|
|
320
|
-
"chrome",
|
|
321
|
-
"google-chrome-stable",
|
|
322
327
|
):
|
|
323
328
|
candidates.append(os.sep.join((item, subitem)))
|
|
324
329
|
if "darwin" in sys.platform:
|
|
@@ -347,7 +352,11 @@ def find_chrome_executable(return_all=False):
|
|
|
347
352
|
)
|
|
348
353
|
rv = []
|
|
349
354
|
for candidate in candidates:
|
|
350
|
-
if
|
|
355
|
+
if (
|
|
356
|
+
os.path.exists(candidate)
|
|
357
|
+
and os.access(candidate, os.R_OK)
|
|
358
|
+
and os.access(candidate, os.X_OK)
|
|
359
|
+
):
|
|
351
360
|
logger.debug("%s is a valid candidate... " % candidate)
|
|
352
361
|
rv.append(candidate)
|
|
353
362
|
else:
|
|
@@ -806,7 +806,10 @@ class Element:
|
|
|
806
806
|
|
|
807
807
|
async def get_html_async(self):
|
|
808
808
|
return await self._tab.send(
|
|
809
|
-
cdp.dom.get_outer_html(
|
|
809
|
+
cdp.dom.get_outer_html(
|
|
810
|
+
backend_node_id=self.backend_node_id,
|
|
811
|
+
include_shadow_dom=True,
|
|
812
|
+
)
|
|
810
813
|
)
|
|
811
814
|
|
|
812
815
|
@property
|
|
@@ -899,7 +899,10 @@ class Tab(Connection):
|
|
|
899
899
|
"""Gets the current page source content (html)"""
|
|
900
900
|
doc: cdp.dom.Node = await self.send(cdp.dom.get_document(-1, True))
|
|
901
901
|
return await self.send(
|
|
902
|
-
cdp.dom.get_outer_html(
|
|
902
|
+
cdp.dom.get_outer_html(
|
|
903
|
+
backend_node_id=doc.backend_node_id,
|
|
904
|
+
include_shadow_dom=True,
|
|
905
|
+
)
|
|
903
906
|
)
|
|
904
907
|
|
|
905
908
|
async def maximize(self):
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: seleniumbase
|
|
3
|
-
Version: 4.44.
|
|
3
|
+
Version: 4.44.4
|
|
4
4
|
Summary: A complete web automation framework for end-to-end testing.
|
|
5
5
|
Home-page: https://github.com/seleniumbase/SeleniumBase
|
|
6
6
|
Author: Michael Mintz
|
|
@@ -75,7 +75,7 @@ Requires-Dist: filelock~=3.16.1; python_version < "3.9"
|
|
|
75
75
|
Requires-Dist: filelock~=3.19.1; python_version >= "3.9" and python_version < "3.10"
|
|
76
76
|
Requires-Dist: filelock>=3.20.0; python_version >= "3.10"
|
|
77
77
|
Requires-Dist: fasteners>=0.20
|
|
78
|
-
Requires-Dist: mycdp>=1.
|
|
78
|
+
Requires-Dist: mycdp>=1.3.0
|
|
79
79
|
Requires-Dist: pynose>=1.5.5
|
|
80
80
|
Requires-Dist: platformdirs~=4.3.6; python_version < "3.9"
|
|
81
81
|
Requires-Dist: platformdirs~=4.4.0; python_version >= "3.9" and python_version < "3.10"
|
|
@@ -106,7 +106,8 @@ Requires-Dist: sniffio==1.3.1
|
|
|
106
106
|
Requires-Dist: h11==0.16.0
|
|
107
107
|
Requires-Dist: outcome==1.3.0.post0
|
|
108
108
|
Requires-Dist: trio==0.27.0; python_version < "3.9"
|
|
109
|
-
Requires-Dist: trio<1,>=0.31.0; python_version >= "3.9"
|
|
109
|
+
Requires-Dist: trio<1,>=0.31.0; python_version >= "3.9" and python_version < "3.10"
|
|
110
|
+
Requires-Dist: trio<1,>=0.32.0; python_version >= "3.10"
|
|
110
111
|
Requires-Dist: trio-websocket~=0.12.2
|
|
111
112
|
Requires-Dist: wsproto==1.2.0
|
|
112
113
|
Requires-Dist: websocket-client~=1.8.0; python_version < "3.9"
|
|
@@ -3,7 +3,7 @@ wheel>=0.45.1
|
|
|
3
3
|
certifi>=2025.10.5
|
|
4
4
|
exceptiongroup>=1.3.0
|
|
5
5
|
fasteners>=0.20
|
|
6
|
-
mycdp>=1.
|
|
6
|
+
mycdp>=1.3.0
|
|
7
7
|
pynose>=1.5.5
|
|
8
8
|
sbvirtualdisplay>=1.4.0
|
|
9
9
|
Jinja2>=3.1.6
|
|
@@ -72,6 +72,7 @@ setuptools>=80.9.0
|
|
|
72
72
|
filelock>=3.20.0
|
|
73
73
|
platformdirs>=4.5.0
|
|
74
74
|
urllib3<2.6.0,>=1.26.20
|
|
75
|
+
trio<1,>=0.32.0
|
|
75
76
|
selenium==4.38.0
|
|
76
77
|
iniconfig==2.3.0
|
|
77
78
|
pytest-rerunfailures==16.1
|
|
@@ -84,7 +85,6 @@ websockets>=15.0.1
|
|
|
84
85
|
typing-extensions>=4.15.0
|
|
85
86
|
MarkupSafe>=3.0.3
|
|
86
87
|
requests~=2.32.5
|
|
87
|
-
trio<1,>=0.31.0
|
|
88
88
|
websocket-client~=1.9.0
|
|
89
89
|
cssselect==1.3.0
|
|
90
90
|
pluggy==1.6.0
|
|
@@ -95,6 +95,7 @@ soupsieve~=2.8
|
|
|
95
95
|
[:python_version >= "3.9" and python_version < "3.10"]
|
|
96
96
|
filelock~=3.19.1
|
|
97
97
|
platformdirs~=4.4.0
|
|
98
|
+
trio<1,>=0.31.0
|
|
98
99
|
selenium==4.32.0
|
|
99
100
|
pytest-rerunfailures==16.0.1
|
|
100
101
|
|
|
@@ -163,7 +163,7 @@ setup(
|
|
|
163
163
|
'filelock~=3.19.1;python_version>="3.9" and python_version<"3.10"',
|
|
164
164
|
'filelock>=3.20.0;python_version>="3.10"',
|
|
165
165
|
'fasteners>=0.20',
|
|
166
|
-
"mycdp>=1.
|
|
166
|
+
"mycdp>=1.3.0",
|
|
167
167
|
"pynose>=1.5.5",
|
|
168
168
|
'platformdirs~=4.3.6;python_version<"3.9"',
|
|
169
169
|
'platformdirs~=4.4.0;python_version>="3.9" and python_version<"3.10"',
|
|
@@ -194,7 +194,8 @@ setup(
|
|
|
194
194
|
'h11==0.16.0',
|
|
195
195
|
'outcome==1.3.0.post0',
|
|
196
196
|
'trio==0.27.0;python_version<"3.9"',
|
|
197
|
-
'trio>=0.31.0,<1;python_version>="3.9"',
|
|
197
|
+
'trio>=0.31.0,<1;python_version>="3.9" and python_version<"3.10"',
|
|
198
|
+
'trio>=0.32.0,<1;python_version>="3.10"',
|
|
198
199
|
'trio-websocket~=0.12.2',
|
|
199
200
|
'wsproto==1.2.0',
|
|
200
201
|
'websocket-client~=1.8.0;python_version<"3.9"',
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|