seleniumbase 4.57.1__tar.gz → 4.58.0__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.57.1/seleniumbase.egg-info → seleniumbase-4.58.0}/PKG-INFO +42 -31
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/README.md +33 -20
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/requirements.txt +6 -6
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/__version__.py +1 -1
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/browser_launcher.py +35 -28
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/sb_cdp.py +20 -4
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/fixtures/base_case.py +22 -1
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/fixtures/shared_utils.py +20 -1
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/plugins/driver_manager.py +8 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/plugins/pytest_plugin.py +16 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/plugins/sb_manager.py +9 -1
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/plugins/selenium_plugin.py +16 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/undetected/cdp_driver/browser.py +3 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/undetected/cdp_driver/cdp_util.py +11 -3
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/undetected/cdp_driver/config.py +16 -2
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/undetected/cdp_driver/element.py +93 -50
- {seleniumbase-4.57.1 → seleniumbase-4.58.0/seleniumbase.egg-info}/PKG-INFO +42 -31
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase.egg-info/requires.txt +8 -14
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/setup.py +8 -10
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/.gitignore +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/LICENSE +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/MANIFEST.in +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/install.sh +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/mcp_servers/__init__.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/mcp_servers/server.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/pyproject.toml +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/pytest.ini +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/sbase/__init__.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/sbase/__main__.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/sbase/steps.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/__init__.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/__main__.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/behave/__init__.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/behave/behave_helper.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/behave/behave_sb.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/behave/steps.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/common/__init__.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/common/decorators.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/common/encryption.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/common/exceptions.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/common/obfuscate.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/common/unobfuscate.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/config/__init__.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/config/ad_block_list.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/config/proxy_list.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/config/settings.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/console_scripts/__init__.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/console_scripts/logo_helper.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/console_scripts/rich_helper.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/console_scripts/run.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/console_scripts/sb_commander.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/console_scripts/sb_install.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/console_scripts/sb_objectify.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/console_scripts/sb_print.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/console_scripts/sb_recorder.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/__init__.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/application_manager.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/capabilities_parser.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/colored_traceback.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/create_db_tables.sql +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/detect_b_ver.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/download_helper.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/encoded_images.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/jqc_helper.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/log_helper.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/mysql.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/nest_asyncio.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/proxy_helper.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/recorder_helper.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/report_helper.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/s3_manager.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/sb_driver.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/session_helper.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/settings_parser.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/style_sheet.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/testcase_manager.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/tour_helper.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/core/visual_helper.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/drivers/__init__.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/drivers/brave_drivers/__init__.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/drivers/cft_drivers/__init__.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/drivers/chromium_drivers/__init__.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/drivers/chs_drivers/__init__.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/drivers/comet_drivers/__init__.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/drivers/opera_drivers/__init__.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/extensions/__init__.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/extensions/ad_block.zip +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/extensions/disable_csp.zip +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/extensions/recorder.zip +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/extensions/sbase_ext.zip +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/fixtures/__init__.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/fixtures/constants.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/fixtures/css_to_xpath.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/fixtures/errors.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/fixtures/js_utils.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/fixtures/page_actions.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/fixtures/page_utils.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/fixtures/unittest_helper.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/fixtures/words.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/fixtures/xpath_to_css.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/js_code/__init__.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/js_code/active_css_js.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/js_code/live_js.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/js_code/recorder_js.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/masterqa/__init__.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/masterqa/master_qa.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/plugins/__init__.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/plugins/base_plugin.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/plugins/basic_test_info.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/plugins/page_source.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/plugins/screen_shots.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/resources/__init__.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/translate/__init__.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/translate/chinese.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/translate/dutch.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/translate/french.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/translate/italian.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/translate/japanese.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/translate/korean.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/translate/master_dict.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/translate/portuguese.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/translate/russian.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/translate/spanish.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/translate/translator.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/undetected/__init__.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/undetected/cdp.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/undetected/cdp_driver/__init__.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/undetected/cdp_driver/connection.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/undetected/cdp_driver/tab.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/undetected/dprocess.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/undetected/options.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/undetected/patcher.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/undetected/reactor.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/undetected/webelement.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/utilities/__init__.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/utilities/selenium_grid/font_color +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase.egg-info/SOURCES.txt +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase.egg-info/dependency_links.txt +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase.egg-info/entry_points.txt +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/seleniumbase.egg-info/top_level.txt +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/setup.cfg +0 -0
- {seleniumbase-4.57.1 → seleniumbase-4.58.0}/virtualenv_install.sh +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: seleniumbase
|
|
3
|
-
Version: 4.
|
|
3
|
+
Version: 4.58.0
|
|
4
4
|
Summary: SeleniumBase is a framework for web crawling, scraping, and testing. Supports pytest. CDP Mode adds stealth. Includes many tools.
|
|
5
5
|
Home-page: https://github.com/seleniumbase/SeleniumBase
|
|
6
6
|
Author: Michael Mintz
|
|
@@ -68,7 +68,7 @@ Requires-Dist: exceptiongroup>=1.3.1
|
|
|
68
68
|
Requires-Dist: websockets~=16.1.1; python_version == "3.10"
|
|
69
69
|
Requires-Dist: websockets>=17.4; python_version >= "3.11"
|
|
70
70
|
Requires-Dist: filelock==4.1.0; python_version == "3.10"
|
|
71
|
-
Requires-Dist: filelock>=4.2.
|
|
71
|
+
Requires-Dist: filelock>=4.2.10; python_version >= "3.11"
|
|
72
72
|
Requires-Dist: fasteners>=0.20
|
|
73
73
|
Requires-Dist: mycdp>=1.4.0
|
|
74
74
|
Requires-Dist: pynose>=1.5.5
|
|
@@ -85,7 +85,7 @@ Requires-Dist: pyyaml>=6.0.3
|
|
|
85
85
|
Requires-Dist: pygments>=2.20.1
|
|
86
86
|
Requires-Dist: pyreadline3>=3.5.4; platform_system == "Windows"
|
|
87
87
|
Requires-Dist: tabcompleter>=1.4.1
|
|
88
|
-
Requires-Dist: pdbp>=1.
|
|
88
|
+
Requires-Dist: pdbp>=1.9.0
|
|
89
89
|
Requires-Dist: idna>=3.20
|
|
90
90
|
Requires-Dist: charset-normalizer<4,>=3.5.2
|
|
91
91
|
Requires-Dist: urllib3<3,>=2.8.0
|
|
@@ -116,12 +116,12 @@ Requires-Dist: pytest-xdist==3.8.0
|
|
|
116
116
|
Requires-Dist: parameterized==0.9.0
|
|
117
117
|
Requires-Dist: behave==1.2.6
|
|
118
118
|
Requires-Dist: soupsieve~=2.10.0; python_version < "3.11.5"
|
|
119
|
-
Requires-Dist: soupsieve~=4.
|
|
119
|
+
Requires-Dist: soupsieve~=4.1.1; python_version >= "3.11.5"
|
|
120
120
|
Requires-Dist: beautifulsoup4~=4.15.0
|
|
121
|
-
Requires-Dist: pyotp~=2.
|
|
121
|
+
Requires-Dist: pyotp~=2.11.2
|
|
122
122
|
Requires-Dist: python-xlib==0.33; platform_system == "Linux"
|
|
123
123
|
Requires-Dist: PyAutoGUI>=0.9.54; platform_system == "Linux"
|
|
124
|
-
Requires-Dist: markdown-it-py==4.
|
|
124
|
+
Requires-Dist: markdown-it-py==4.3.0
|
|
125
125
|
Requires-Dist: mdurl==0.1.2
|
|
126
126
|
Requires-Dist: rich<16,>=15.0.0
|
|
127
127
|
Provides-Extra: allure
|
|
@@ -130,7 +130,7 @@ Requires-Dist: allure-python-commons>=2.16.0; extra == "allure"
|
|
|
130
130
|
Requires-Dist: allure-behave>=2.16.0; extra == "allure"
|
|
131
131
|
Provides-Extra: coverage
|
|
132
132
|
Requires-Dist: coverage>=7.16.2; python_version == "3.10" and extra == "coverage"
|
|
133
|
-
Requires-Dist: coverage>=7.17.
|
|
133
|
+
Requires-Dist: coverage>=7.17.3; python_version >= "3.11" and extra == "coverage"
|
|
134
134
|
Requires-Dist: pytest-cov>=7.1.0; extra == "coverage"
|
|
135
135
|
Provides-Extra: flake8
|
|
136
136
|
Requires-Dist: flake8==7.4.1; python_version == "3.10" and extra == "flake8"
|
|
@@ -157,14 +157,12 @@ Requires-Dist: pip-system-certs>=4.0; platform_system == "Windows" and extra ==
|
|
|
157
157
|
Provides-Extra: proxy
|
|
158
158
|
Requires-Dist: proxy.py==2.4.3; extra == "proxy"
|
|
159
159
|
Provides-Extra: playwright
|
|
160
|
-
Requires-Dist: playwright>=1.
|
|
160
|
+
Requires-Dist: playwright>=1.65.2; extra == "playwright"
|
|
161
161
|
Requires-Dist: greenlet>=3.5.6; extra == "playwright"
|
|
162
|
-
Requires-Dist: pyee>=13.0.1; python_version < "3.12" and extra == "playwright"
|
|
163
|
-
Requires-Dist: pyee>=14.0.0; python_version >= "3.12" and extra == "playwright"
|
|
164
162
|
Provides-Extra: pyautogui
|
|
165
163
|
Requires-Dist: PyAutoGUI>=0.9.54; platform_system != "Linux" and extra == "pyautogui"
|
|
166
164
|
Provides-Extra: uv
|
|
167
|
-
Requires-Dist: uv>=0.13.
|
|
165
|
+
Requires-Dist: uv>=0.13.8; extra == "uv"
|
|
168
166
|
Dynamic: author
|
|
169
167
|
Dynamic: author-email
|
|
170
168
|
Dynamic: classifier
|
|
@@ -189,13 +187,10 @@ Dynamic: summary
|
|
|
189
187
|
<meta property="og:image" content="https://seleniumbase.github.io/cdn/img/mac_sb_logo_5b.png" />
|
|
190
188
|
<link rel="icon" href="https://seleniumbase.github.io/img/logo7.png" />
|
|
191
189
|
|
|
192
|
-
<
|
|
193
|
-
|
|
194
|
-
<h3 align="center">Browser Automation, Web Scraping, and End-to-End Testing.<br /></h3>
|
|
190
|
+
<h3 align="center" class="hero__title"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/nice_logo_8t.png" alt="SeleniumBase" title="SeleniumBase" width="450" /></a><br /><b>A Complete Browser Automation Experience:<br />Web Crawling / Testing / Scraping / Stealth</b></h3>
|
|
195
191
|
|
|
196
192
|
<p align="center">
|
|
197
|
-
<a href="https://pypi.python.org/pypi/seleniumbase" target="_blank" rel="noopener"><img src="https://img.shields.io/pypi/v/seleniumbase.svg?style=flat-square&color=3399EE" alt="PyPI version" height="20" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/actions" target="_blank" rel="noopener"><img src="https://
|
|
198
|
-
<a href="https://www.youtube.com/playlist?list=PLp9uKicxkBc5UIlGi2BuE3aWC7JyXpD3m" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/docs-📺-D844E8.svg?style=flat-square&logo=YouTube&logoColor=white&label=YouTube" alt="YouTube Channel" height="20" /></a> <a href="https://www.facebook.com/SeleniumBase/" target="_blank" rel="noopener"> <img src="https://img.shields.io/badge/Facebook-4K_followers-1877F2?style=flat-square&logo=facebook&logoColor=white" alt="SeleniumBase Facebook Followers" height="20" /></a> <a href="https://x.com/seleniumbase" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/-1K_followers-1DA1F2?style=flat-square&logo=x&logoColor=white&labelColor=555555" alt="SeleniumBase X Followers" height="20" /></a> <a href="https://discord.gg/EdhQTn3EyE" target="_blank" rel="noopener"><img src="https://img.shields.io/discord/727927627830001734?style=flat-square&color=7289DA&label=Discord&logo=discord&logoColor=white" height="20" /></a> <a href="https://github.com/seleniumbase/SeleniumBase" target="_blank" rel="noopener"><img src="https://badgen.net/github/stars/seleniumbase/SeleniumBase" title="Stars" height="20" /></a>
|
|
193
|
+
<a href="https://pypi.python.org/pypi/seleniumbase" target="_blank" rel="noopener"><img src="https://img.shields.io/pypi/v/seleniumbase.svg?style=flat-square&color=3399EE" alt="PyPI version" height="20" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/actions" target="_blank" rel="noopener"><img src="https://flat.badgen.net/github/checks/seleniumbase/SeleniumBase/master?label=CI&" alt="CI Status" height="20" /></a> <a href="https://seleniumbase.io" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg?style=flat-square" alt="SeleniumBase Docs" height="20" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/LICENSE" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/license-MIT-33A6C6.svg?style=flat-square" title="SeleniumBase" height="20" /></a><br /><a href="https://github.com/seleniumbase/SeleniumBase/tree/master/mcp_servers" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/MCP-tool_info-7C6EE5?style=flat-square" height="20" /></a> <a href="https://pepy.tech/projects/seleniumbase?timeRange=threeMonths&category=version&includeCIDownloads=true&granularity=daily&viewType=line&versions=*" target="_blank" rel="noopener"><img src="https://static.pepy.tech/badge/seleniumbase" alt="SeleniumBase PyPI downloads" height="20" /></a> <a href="https://www.youtube.com/playlist?list=PLp9uKicxkBc5UIlGi2BuE3aWC7JyXpD3m" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/docs-📺-D844E8.svg?style=flat-square&logo=YouTube&logoColor=white&label=YouTube" alt="YouTube Channel" height="20" /></a> <a href="https://github.com/seleniumbase/SeleniumBase" target="_blank" rel="noopener"><img src="https://badgen.net/github/stars/seleniumbase/SeleniumBase" title="Stars" height="20" /></a>
|
|
199
194
|
</p>
|
|
200
195
|
|
|
201
196
|
<p align="center">
|
|
@@ -233,6 +228,27 @@ Dynamic: summary
|
|
|
233
228
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/case_plans.md">🗂️ CPlans</a>
|
|
234
229
|
</p>
|
|
235
230
|
|
|
231
|
+
<h4>SeleniumBase is the professional toolkit for web automation activities. Built for testing websites, bypassing CAPTCHAs, enhancing productivity, completing tasks, and scaling your business.</h4>
|
|
232
|
+
|
|
233
|
+
--------
|
|
234
|
+
|
|
235
|
+
📚 Learn from [**over 200 examples** in **SeleniumBase/examples/**](https://github.com/seleniumbase/SeleniumBase/tree/master/examples).
|
|
236
|
+
|
|
237
|
+
<p align="left"><a href="https://github.com/seleniumbase/SeleniumBase/tree/master/examples" target="_blank" rel="noopener"><img src="https://seleniumbase.github.io/cdn/gif/google_search.gif" alt="SeleniumBase Google Search" title="SeleniumBase Google Search" width="480" /></a></p>
|
|
238
|
+
|
|
239
|
+
--------
|
|
240
|
+
|
|
241
|
+
<h3 align="left"><img src="https://seleniumbase.io/img/logo6.png" title="SeleniumBase" width="32" /> SeleniumBase Chromium architecture and modes:</h3>
|
|
242
|
+
|
|
243
|
+
<img src="https://seleniumbase.github.io/other/sb_architecture.png" width="600" style="max-width: 100% !important; height: auto !important;" alt="Stealthy architecture flowchart" />
|
|
244
|
+
|
|
245
|
+
> (*Note that "Regular Mode" also supports Safari/WebKit and Firefox/Gecko.*)
|
|
246
|
+
|
|
247
|
+
<ul>
|
|
248
|
+
<li>🐙 <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md"><b>CDP Mode</b></a> <b>bypasses bot-detection with Chromium-based browsers.</b></li>
|
|
249
|
+
<li>🎭 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/ReadMe.md"><b><span translate="no">Stealthy Playwright Mode</span></b></a> <b>extends CDP Mode's stealth to Playwright.</b></li>
|
|
250
|
+
</ul>
|
|
251
|
+
|
|
236
252
|
--------
|
|
237
253
|
|
|
238
254
|
🧪 End-to-End Testing examples are located in [./examples/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples).
|
|
@@ -252,21 +268,21 @@ Dynamic: summary
|
|
|
252
268
|
```python
|
|
253
269
|
from seleniumbase import sb_cdp
|
|
254
270
|
|
|
255
|
-
sb = sb_cdp.Chrome() #
|
|
271
|
+
sb = sb_cdp.Chrome() # Launch a stealth browser
|
|
256
272
|
sb.goto("https://www.planetminecraft.com/account")
|
|
257
273
|
sb.type('[name="email"]', "Test123")
|
|
258
274
|
sb.type('[name="password"]', "Pass")
|
|
259
|
-
sb.click("input#autologin") #
|
|
260
|
-
sb.solve_captcha() # (
|
|
275
|
+
sb.click("input#autologin") # Uncheck a checkbox
|
|
276
|
+
sb.solve_captcha() # (fallback if not automatic)
|
|
261
277
|
sb.assert_element('input[name="login"]')
|
|
262
278
|
sb.assert_element_not_visible("input[disabled]")
|
|
263
|
-
sb.sleep(1) # (
|
|
264
|
-
sb.quit()
|
|
279
|
+
sb.sleep(1) # (see the live demo more easily)
|
|
280
|
+
sb.quit()
|
|
265
281
|
```
|
|
266
282
|
|
|
267
283
|
<p align="left">
|
|
268
|
-
<img src="https://seleniumbase.github.io/other/pmc_captcha_3.png" width="
|
|
269
|
-
<br /><em>(Note
|
|
284
|
+
<img src="https://seleniumbase.github.io/other/pmc_captcha_3.png" width="572" style="max-width: 100% !important; height: auto !important;" alt="Cloudflare Turnstile bypassed successfully" />
|
|
285
|
+
<br /><em>(Note: In this example, the click only unchecks the "Stay signed in" checkbox.)</em>
|
|
270
286
|
</p>
|
|
271
287
|
|
|
272
288
|
--------
|
|
@@ -346,12 +362,6 @@ sb = sb_cdp.Chrome(use_chromium=True)
|
|
|
346
362
|
|
|
347
363
|
--------
|
|
348
364
|
|
|
349
|
-
<h3 align="left">⚙️ Stealthy architecture flowchart:</h3>
|
|
350
|
-
|
|
351
|
-
<img src="https://seleniumbase.github.io/other/sb_architecture.png" width="530" style="max-width: 100% !important; height: auto !important;" alt="Stealthy architecture flowchart" />
|
|
352
|
-
|
|
353
|
-
--------
|
|
354
|
-
|
|
355
365
|
<h3>🧪 Comprehensive E2E Testing with <code>pytest</code>:</h3>
|
|
356
366
|
|
|
357
367
|
<p align="left">📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_get_swag.py" target="_blank" rel="noopener">This script</a> tests an e-commerce site: (Runs with <b><code>pytest</code></b>):</p>
|
|
@@ -440,7 +450,7 @@ pytest test_demo_site.py
|
|
|
440
450
|
|
|
441
451
|
--------
|
|
442
452
|
|
|
443
|
-
<p align="left"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/super_logo_sb3.png" alt="SeleniumBase" title="SeleniumBase" width="
|
|
453
|
+
<p align="left"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/super_logo_sb3.png" alt="SeleniumBase" title="SeleniumBase" width="248" /></a></p>
|
|
444
454
|
|
|
445
455
|
<blockquote>
|
|
446
456
|
<p dir="auto"><strong>Explore the README:</strong></p>
|
|
@@ -994,6 +1004,7 @@ pytest test_coffee_cart.py --trace
|
|
|
994
1004
|
--rs | --reuse-session # (Reuse browser session for all tests.)
|
|
995
1005
|
--rcs | --reuse-class-session # (Reuse session for tests in class.)
|
|
996
1006
|
--crumbs # (Delete all cookies between tests reusing a session.)
|
|
1007
|
+
--no-tt # (Skips "--test-type" when using Proxy Mode. Adds stealth.)
|
|
997
1008
|
--disable-beforeunload # (Disable the "beforeunload" event on Chrome.)
|
|
998
1009
|
--window-position=X,Y # (Set the browser's starting window position.)
|
|
999
1010
|
--window-size=WIDTH,HEIGHT # (Set the browser's starting window size.)
|
|
@@ -1670,7 +1681,7 @@ pytest --reruns=1 --reruns-delay=1
|
|
|
1670
1681
|
|
|
1671
1682
|
<p><div><b><a href="https://github.com/mdmintz" target="_blank" rel="noopener">https://github.com/mdmintz</a></b></div></p>
|
|
1672
1683
|
|
|
1673
|
-
<div><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/
|
|
1684
|
+
<div><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/super_logo_sb6.png" title="SeleniumBase" width="310" style="max-width: 100% !important; height: auto !important;" /></a></div>
|
|
1674
1685
|
<div><a href="https://github.com/seleniumbase/SeleniumBase"><img src="https://img.shields.io/badge/tested%20with-SeleniumBase-04C38E.svg" alt="Tested with SeleniumBase" /></a> <img src="https://views.whatilearened.today/views/github/seleniumbase/SeleniumBase.svg" width="98px" height="20px" alt="Views" /></div>
|
|
1675
1686
|
<div><a href="https://seleniumbase.io"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg" alt="SeleniumBase Docs" height="20" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/LICENSE"><img src="https://img.shields.io/badge/license-MIT-22BBCC.svg" title="SeleniumBase" height="20" /></a> </div>
|
|
1676
1687
|
<div align="left"></div>
|
|
@@ -8,13 +8,10 @@
|
|
|
8
8
|
<meta property="og:image" content="https://seleniumbase.github.io/cdn/img/mac_sb_logo_5b.png" />
|
|
9
9
|
<link rel="icon" href="https://seleniumbase.github.io/img/logo7.png" />
|
|
10
10
|
|
|
11
|
-
<
|
|
12
|
-
|
|
13
|
-
<h3 align="center">Browser Automation, Web Scraping, and End-to-End Testing.<br /></h3>
|
|
11
|
+
<h3 align="center" class="hero__title"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/nice_logo_8t.png" alt="SeleniumBase" title="SeleniumBase" width="450" /></a><br /><b>A Complete Browser Automation Experience:<br />Web Crawling / Testing / Scraping / Stealth</b></h3>
|
|
14
12
|
|
|
15
13
|
<p align="center">
|
|
16
|
-
<a href="https://pypi.python.org/pypi/seleniumbase" target="_blank" rel="noopener"><img src="https://img.shields.io/pypi/v/seleniumbase.svg?style=flat-square&color=3399EE" alt="PyPI version" height="20" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/actions" target="_blank" rel="noopener"><img src="https://
|
|
17
|
-
<a href="https://www.youtube.com/playlist?list=PLp9uKicxkBc5UIlGi2BuE3aWC7JyXpD3m" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/docs-📺-D844E8.svg?style=flat-square&logo=YouTube&logoColor=white&label=YouTube" alt="YouTube Channel" height="20" /></a> <a href="https://www.facebook.com/SeleniumBase/" target="_blank" rel="noopener"> <img src="https://img.shields.io/badge/Facebook-4K_followers-1877F2?style=flat-square&logo=facebook&logoColor=white" alt="SeleniumBase Facebook Followers" height="20" /></a> <a href="https://x.com/seleniumbase" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/-1K_followers-1DA1F2?style=flat-square&logo=x&logoColor=white&labelColor=555555" alt="SeleniumBase X Followers" height="20" /></a> <a href="https://discord.gg/EdhQTn3EyE" target="_blank" rel="noopener"><img src="https://img.shields.io/discord/727927627830001734?style=flat-square&color=7289DA&label=Discord&logo=discord&logoColor=white" height="20" /></a> <a href="https://github.com/seleniumbase/SeleniumBase" target="_blank" rel="noopener"><img src="https://badgen.net/github/stars/seleniumbase/SeleniumBase" title="Stars" height="20" /></a>
|
|
14
|
+
<a href="https://pypi.python.org/pypi/seleniumbase" target="_blank" rel="noopener"><img src="https://img.shields.io/pypi/v/seleniumbase.svg?style=flat-square&color=3399EE" alt="PyPI version" height="20" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/actions" target="_blank" rel="noopener"><img src="https://flat.badgen.net/github/checks/seleniumbase/SeleniumBase/master?label=CI&" alt="CI Status" height="20" /></a> <a href="https://seleniumbase.io" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg?style=flat-square" alt="SeleniumBase Docs" height="20" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/LICENSE" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/license-MIT-33A6C6.svg?style=flat-square" title="SeleniumBase" height="20" /></a><br /><a href="https://github.com/seleniumbase/SeleniumBase/tree/master/mcp_servers" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/MCP-tool_info-7C6EE5?style=flat-square" height="20" /></a> <a href="https://pepy.tech/projects/seleniumbase?timeRange=threeMonths&category=version&includeCIDownloads=true&granularity=daily&viewType=line&versions=*" target="_blank" rel="noopener"><img src="https://static.pepy.tech/badge/seleniumbase" alt="SeleniumBase PyPI downloads" height="20" /></a> <a href="https://www.youtube.com/playlist?list=PLp9uKicxkBc5UIlGi2BuE3aWC7JyXpD3m" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/docs-📺-D844E8.svg?style=flat-square&logo=YouTube&logoColor=white&label=YouTube" alt="YouTube Channel" height="20" /></a> <a href="https://github.com/seleniumbase/SeleniumBase" target="_blank" rel="noopener"><img src="https://badgen.net/github/stars/seleniumbase/SeleniumBase" title="Stars" height="20" /></a>
|
|
18
15
|
</p>
|
|
19
16
|
|
|
20
17
|
<p align="center">
|
|
@@ -52,6 +49,27 @@
|
|
|
52
49
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/case_plans.md">🗂️ CPlans</a>
|
|
53
50
|
</p>
|
|
54
51
|
|
|
52
|
+
<h4>SeleniumBase is the professional toolkit for web automation activities. Built for testing websites, bypassing CAPTCHAs, enhancing productivity, completing tasks, and scaling your business.</h4>
|
|
53
|
+
|
|
54
|
+
--------
|
|
55
|
+
|
|
56
|
+
📚 Learn from [**over 200 examples** in **SeleniumBase/examples/**](https://github.com/seleniumbase/SeleniumBase/tree/master/examples).
|
|
57
|
+
|
|
58
|
+
<p align="left"><a href="https://github.com/seleniumbase/SeleniumBase/tree/master/examples" target="_blank" rel="noopener"><img src="https://seleniumbase.github.io/cdn/gif/google_search.gif" alt="SeleniumBase Google Search" title="SeleniumBase Google Search" width="480" /></a></p>
|
|
59
|
+
|
|
60
|
+
--------
|
|
61
|
+
|
|
62
|
+
<h3 align="left"><img src="https://seleniumbase.io/img/logo6.png" title="SeleniumBase" width="32" /> SeleniumBase Chromium architecture and modes:</h3>
|
|
63
|
+
|
|
64
|
+
<img src="https://seleniumbase.github.io/other/sb_architecture.png" width="600" style="max-width: 100% !important; height: auto !important;" alt="Stealthy architecture flowchart" />
|
|
65
|
+
|
|
66
|
+
> (*Note that "Regular Mode" also supports Safari/WebKit and Firefox/Gecko.*)
|
|
67
|
+
|
|
68
|
+
<ul>
|
|
69
|
+
<li>🐙 <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md"><b>CDP Mode</b></a> <b>bypasses bot-detection with Chromium-based browsers.</b></li>
|
|
70
|
+
<li>🎭 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/ReadMe.md"><b><span translate="no">Stealthy Playwright Mode</span></b></a> <b>extends CDP Mode's stealth to Playwright.</b></li>
|
|
71
|
+
</ul>
|
|
72
|
+
|
|
55
73
|
--------
|
|
56
74
|
|
|
57
75
|
🧪 End-to-End Testing examples are located in [./examples/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples).
|
|
@@ -71,21 +89,21 @@
|
|
|
71
89
|
```python
|
|
72
90
|
from seleniumbase import sb_cdp
|
|
73
91
|
|
|
74
|
-
sb = sb_cdp.Chrome() #
|
|
92
|
+
sb = sb_cdp.Chrome() # Launch a stealth browser
|
|
75
93
|
sb.goto("https://www.planetminecraft.com/account")
|
|
76
94
|
sb.type('[name="email"]', "Test123")
|
|
77
95
|
sb.type('[name="password"]', "Pass")
|
|
78
|
-
sb.click("input#autologin") #
|
|
79
|
-
sb.solve_captcha() # (
|
|
96
|
+
sb.click("input#autologin") # Uncheck a checkbox
|
|
97
|
+
sb.solve_captcha() # (fallback if not automatic)
|
|
80
98
|
sb.assert_element('input[name="login"]')
|
|
81
99
|
sb.assert_element_not_visible("input[disabled]")
|
|
82
|
-
sb.sleep(1) # (
|
|
83
|
-
sb.quit()
|
|
100
|
+
sb.sleep(1) # (see the live demo more easily)
|
|
101
|
+
sb.quit()
|
|
84
102
|
```
|
|
85
103
|
|
|
86
104
|
<p align="left">
|
|
87
|
-
<img src="https://seleniumbase.github.io/other/pmc_captcha_3.png" width="
|
|
88
|
-
<br /><em>(Note
|
|
105
|
+
<img src="https://seleniumbase.github.io/other/pmc_captcha_3.png" width="572" style="max-width: 100% !important; height: auto !important;" alt="Cloudflare Turnstile bypassed successfully" />
|
|
106
|
+
<br /><em>(Note: In this example, the click only unchecks the "Stay signed in" checkbox.)</em>
|
|
89
107
|
</p>
|
|
90
108
|
|
|
91
109
|
--------
|
|
@@ -165,12 +183,6 @@ sb = sb_cdp.Chrome(use_chromium=True)
|
|
|
165
183
|
|
|
166
184
|
--------
|
|
167
185
|
|
|
168
|
-
<h3 align="left">⚙️ Stealthy architecture flowchart:</h3>
|
|
169
|
-
|
|
170
|
-
<img src="https://seleniumbase.github.io/other/sb_architecture.png" width="530" style="max-width: 100% !important; height: auto !important;" alt="Stealthy architecture flowchart" />
|
|
171
|
-
|
|
172
|
-
--------
|
|
173
|
-
|
|
174
186
|
<h3>🧪 Comprehensive E2E Testing with <code>pytest</code>:</h3>
|
|
175
187
|
|
|
176
188
|
<p align="left">📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_get_swag.py" target="_blank" rel="noopener">This script</a> tests an e-commerce site: (Runs with <b><code>pytest</code></b>):</p>
|
|
@@ -259,7 +271,7 @@ pytest test_demo_site.py
|
|
|
259
271
|
|
|
260
272
|
--------
|
|
261
273
|
|
|
262
|
-
<p align="left"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/super_logo_sb3.png" alt="SeleniumBase" title="SeleniumBase" width="
|
|
274
|
+
<p align="left"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/super_logo_sb3.png" alt="SeleniumBase" title="SeleniumBase" width="248" /></a></p>
|
|
263
275
|
|
|
264
276
|
<blockquote>
|
|
265
277
|
<p dir="auto"><strong>Explore the README:</strong></p>
|
|
@@ -813,6 +825,7 @@ pytest test_coffee_cart.py --trace
|
|
|
813
825
|
--rs | --reuse-session # (Reuse browser session for all tests.)
|
|
814
826
|
--rcs | --reuse-class-session # (Reuse session for tests in class.)
|
|
815
827
|
--crumbs # (Delete all cookies between tests reusing a session.)
|
|
828
|
+
--no-tt # (Skips "--test-type" when using Proxy Mode. Adds stealth.)
|
|
816
829
|
--disable-beforeunload # (Disable the "beforeunload" event on Chrome.)
|
|
817
830
|
--window-position=X,Y # (Set the browser's starting window position.)
|
|
818
831
|
--window-size=WIDTH,HEIGHT # (Set the browser's starting window size.)
|
|
@@ -1489,7 +1502,7 @@ pytest --reruns=1 --reruns-delay=1
|
|
|
1489
1502
|
|
|
1490
1503
|
<p><div><b><a href="https://github.com/mdmintz" target="_blank" rel="noopener">https://github.com/mdmintz</a></b></div></p>
|
|
1491
1504
|
|
|
1492
|
-
<div><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/
|
|
1505
|
+
<div><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/super_logo_sb6.png" title="SeleniumBase" width="310" style="max-width: 100% !important; height: auto !important;" /></a></div>
|
|
1493
1506
|
<div><a href="https://github.com/seleniumbase/SeleniumBase"><img src="https://img.shields.io/badge/tested%20with-SeleniumBase-04C38E.svg" alt="Tested with SeleniumBase" /></a> <img src="https://views.whatilearened.today/views/github/seleniumbase/SeleniumBase.svg" width="98px" height="20px" alt="Views" /></div>
|
|
1494
1507
|
<div><a href="https://seleniumbase.io"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg" alt="SeleniumBase Docs" height="20" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/LICENSE"><img src="https://img.shields.io/badge/license-MIT-22BBCC.svg" title="SeleniumBase" height="20" /></a> </div>
|
|
1495
1508
|
<div align="left"></div>
|
|
@@ -8,7 +8,7 @@ exceptiongroup>=1.3.1
|
|
|
8
8
|
websockets~=16.1.1;python_version=="3.10"
|
|
9
9
|
websockets>=17.4;python_version>="3.11"
|
|
10
10
|
filelock==4.1.0;python_version=="3.10"
|
|
11
|
-
filelock>=4.2.
|
|
11
|
+
filelock>=4.2.10;python_version>="3.11"
|
|
12
12
|
fasteners>=0.20
|
|
13
13
|
mycdp>=1.4.0
|
|
14
14
|
pynose>=1.5.5
|
|
@@ -25,7 +25,7 @@ pyyaml>=6.0.3
|
|
|
25
25
|
pygments>=2.20.1
|
|
26
26
|
pyreadline3>=3.5.4;platform_system=="Windows"
|
|
27
27
|
tabcompleter>=1.4.1
|
|
28
|
-
pdbp>=1.
|
|
28
|
+
pdbp>=1.9.0
|
|
29
29
|
idna>=3.20
|
|
30
30
|
charset-normalizer>=3.5.2,<4
|
|
31
31
|
urllib3>=2.8.0,<3
|
|
@@ -56,12 +56,12 @@ pytest-xdist==3.8.0
|
|
|
56
56
|
parameterized==0.9.0
|
|
57
57
|
behave==1.2.6
|
|
58
58
|
soupsieve~=2.10.0;python_version<"3.11.5"
|
|
59
|
-
soupsieve~=4.
|
|
59
|
+
soupsieve~=4.1.1;python_version>="3.11.5"
|
|
60
60
|
beautifulsoup4~=4.15.0
|
|
61
|
-
pyotp~=2.
|
|
61
|
+
pyotp~=2.11.2
|
|
62
62
|
python-xlib==0.33;platform_system=="Linux"
|
|
63
63
|
PyAutoGUI>=0.9.54;platform_system=="Linux"
|
|
64
|
-
markdown-it-py==4.
|
|
64
|
+
markdown-it-py==4.3.0
|
|
65
65
|
mdurl==0.1.2
|
|
66
66
|
rich>=15.0.0,<16
|
|
67
67
|
|
|
@@ -69,7 +69,7 @@ rich>=15.0.0,<16
|
|
|
69
69
|
# ("pip install -r requirements.txt" also installs this, but "pip install -e ." won't.)
|
|
70
70
|
|
|
71
71
|
coverage>=7.16.2;python_version=="3.10"
|
|
72
|
-
coverage>=7.17.
|
|
72
|
+
coverage>=7.17.3;python_version>="3.11"
|
|
73
73
|
pytest-cov>=7.1.0
|
|
74
74
|
flake8==7.4.1;python_version=="3.10"
|
|
75
75
|
flake8==7.5.0;python_version>="3.11"
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
# seleniumbase package
|
|
2
|
-
__version__ = "4.
|
|
2
|
+
__version__ = "4.58.0"
|
|
@@ -929,6 +929,7 @@ def uc_open_with_cdp_mode(driver, url=None, **kwargs):
|
|
|
929
929
|
cdp.enter_mfa_code = CDPM.enter_mfa_code
|
|
930
930
|
cdp.flash = CDPM.flash
|
|
931
931
|
cdp.highlight = CDPM.highlight
|
|
932
|
+
cdp.highlight_if_visible = CDPM.highlight_if_visible
|
|
932
933
|
cdp.focus = CDPM.focus
|
|
933
934
|
cdp.highlight_overlay = CDPM.highlight_overlay
|
|
934
935
|
cdp.get_window_position = CDPM.get_window_position
|
|
@@ -2373,7 +2374,8 @@ def _set_chrome_options(
|
|
|
2373
2374
|
device_pixel_ratio,
|
|
2374
2375
|
):
|
|
2375
2376
|
chrome_options = webdriver.ChromeOptions()
|
|
2376
|
-
|
|
2377
|
+
is_uc = is_using_uc(undetectable, browser_name)
|
|
2378
|
+
if is_uc:
|
|
2377
2379
|
from seleniumbase import undetected
|
|
2378
2380
|
chrome_options = undetected.ChromeOptions()
|
|
2379
2381
|
elif browser_name == constants.Browser.EDGE:
|
|
@@ -2457,7 +2459,7 @@ def _set_chrome_options(
|
|
|
2457
2459
|
chrome_options.add_argument(
|
|
2458
2460
|
"--host-resolver-rules=%s" % host_resolver_rules
|
|
2459
2461
|
)
|
|
2460
|
-
if mobile_emulator and not
|
|
2462
|
+
if mobile_emulator and not is_uc:
|
|
2461
2463
|
emulator_settings = {}
|
|
2462
2464
|
device_metrics = {}
|
|
2463
2465
|
if (
|
|
@@ -2555,7 +2557,7 @@ def _set_chrome_options(
|
|
|
2555
2557
|
pass
|
|
2556
2558
|
if dark_mode:
|
|
2557
2559
|
chrome_options.add_argument("--enable-features=WebContentsForceDark")
|
|
2558
|
-
if user_data_dir and not
|
|
2560
|
+
if user_data_dir and not is_uc:
|
|
2559
2561
|
abs_path = os.path.abspath(user_data_dir)
|
|
2560
2562
|
chrome_options.add_argument("--user-data-dir=%s" % abs_path)
|
|
2561
2563
|
if extension_zip:
|
|
@@ -2646,7 +2648,7 @@ def _set_chrome_options(
|
|
|
2646
2648
|
if proxy_string:
|
|
2647
2649
|
if proxy_auth:
|
|
2648
2650
|
zip_it = True
|
|
2649
|
-
if
|
|
2651
|
+
if is_uc:
|
|
2650
2652
|
zip_it = False # undetected-chromedriver needs a folder ext
|
|
2651
2653
|
chrome_options = _add_chrome_proxy_extension(
|
|
2652
2654
|
chrome_options,
|
|
@@ -2666,7 +2668,7 @@ def _set_chrome_options(
|
|
|
2666
2668
|
elif proxy_pac_url:
|
|
2667
2669
|
if proxy_auth:
|
|
2668
2670
|
zip_it = True # undetected-chromedriver needs a folder ext
|
|
2669
|
-
if
|
|
2671
|
+
if is_uc:
|
|
2670
2672
|
zip_it = False
|
|
2671
2673
|
chrome_options = _add_chrome_proxy_extension(
|
|
2672
2674
|
chrome_options,
|
|
@@ -2679,18 +2681,14 @@ def _set_chrome_options(
|
|
|
2679
2681
|
multi_proxy,
|
|
2680
2682
|
)
|
|
2681
2683
|
chrome_options.add_argument("--proxy-pac-url=%s" % proxy_pac_url)
|
|
2682
|
-
if
|
|
2683
|
-
not is_using_uc(undetectable, browser_name)
|
|
2684
|
-
or not enable_ws
|
|
2685
|
-
or proxy_string
|
|
2686
|
-
):
|
|
2684
|
+
if not is_uc or not enable_ws or proxy_string:
|
|
2687
2685
|
chrome_options.add_argument("--ignore-certificate-errors")
|
|
2688
2686
|
chrome_options.add_argument("--ignore-ssl-errors=yes")
|
|
2689
2687
|
if not enable_ws:
|
|
2690
2688
|
chrome_options.add_argument("--disable-web-security")
|
|
2691
2689
|
if (
|
|
2692
2690
|
IS_LINUX
|
|
2693
|
-
or (IS_MAC and not
|
|
2691
|
+
or (IS_MAC and not is_uc)
|
|
2694
2692
|
):
|
|
2695
2693
|
chrome_options.add_argument("--no-sandbox")
|
|
2696
2694
|
if remote_debug:
|
|
@@ -2705,13 +2703,10 @@ def _set_chrome_options(
|
|
|
2705
2703
|
if swiftshader:
|
|
2706
2704
|
chrome_options.add_argument("--use-gl=angle")
|
|
2707
2705
|
chrome_options.add_argument("--use-angle=swiftshader-webgl")
|
|
2708
|
-
elif
|
|
2709
|
-
not is_using_uc(undetectable, browser_name)
|
|
2710
|
-
and not enable_3d_apis
|
|
2711
|
-
):
|
|
2706
|
+
elif not is_uc and not enable_3d_apis:
|
|
2712
2707
|
chrome_options.add_argument("--disable-gpu")
|
|
2713
2708
|
if (
|
|
2714
|
-
(not IS_LINUX and
|
|
2709
|
+
(not IS_LINUX and is_uc)
|
|
2715
2710
|
or (
|
|
2716
2711
|
IS_MAC
|
|
2717
2712
|
and binary_location
|
|
@@ -2722,7 +2717,7 @@ def _set_chrome_options(
|
|
|
2722
2717
|
chrome_options.add_argument("--disable-application-cache")
|
|
2723
2718
|
if IS_LINUX:
|
|
2724
2719
|
chrome_options.add_argument("--disable-dev-shm-usage")
|
|
2725
|
-
if
|
|
2720
|
+
if is_uc:
|
|
2726
2721
|
chrome_options.add_argument("--disable-application-cache")
|
|
2727
2722
|
chrome_options.add_argument("--disable-setuid-sandbox")
|
|
2728
2723
|
if not binary_location:
|
|
@@ -2762,9 +2757,7 @@ def _set_chrome_options(
|
|
|
2762
2757
|
)
|
|
2763
2758
|
if "set-binary" in chromium_arg_item and not binary_location:
|
|
2764
2759
|
br_app = "google-chrome"
|
|
2765
|
-
binary_loc = detect_b_ver.get_binary_location(
|
|
2766
|
-
br_app, is_using_uc(undetectable, browser_name)
|
|
2767
|
-
)
|
|
2760
|
+
binary_loc = detect_b_ver.get_binary_location(br_app, is_uc)
|
|
2768
2761
|
if os.path.exists(binary_loc):
|
|
2769
2762
|
binary_location = binary_loc
|
|
2770
2763
|
elif "disable-features=" in chromium_arg_item:
|
|
@@ -2789,9 +2782,9 @@ def _set_chrome_options(
|
|
|
2789
2782
|
chrome_options.add_argument("--disable-translate")
|
|
2790
2783
|
if binary_location:
|
|
2791
2784
|
chrome_options.binary_location = binary_location
|
|
2792
|
-
if not enable_3d_apis and not
|
|
2785
|
+
if not enable_3d_apis and not is_uc:
|
|
2793
2786
|
chrome_options.add_argument("--disable-3d-apis")
|
|
2794
|
-
if headless or headless2 or
|
|
2787
|
+
if headless or headless2 or is_uc:
|
|
2795
2788
|
chrome_options.add_argument("--disable-renderer-backgrounding")
|
|
2796
2789
|
chrome_options.add_argument("--disable-background-networking")
|
|
2797
2790
|
chrome_options.add_argument("--disable-backgrounding-occluded-windows")
|
|
@@ -2805,7 +2798,10 @@ def _set_chrome_options(
|
|
|
2805
2798
|
chrome_options.add_argument(
|
|
2806
2799
|
'--simulate-outdated-no-au="Tue, 31 Dec 2099 23:59:59 GMT"'
|
|
2807
2800
|
)
|
|
2808
|
-
|
|
2801
|
+
if not is_uc or __is_using_fast_mode():
|
|
2802
|
+
# Since disabling IPC FP is detectable by sites that look for it,
|
|
2803
|
+
# we'll now keep it enabled in UC Mode / CDP Mode, unless "fast".
|
|
2804
|
+
chrome_options.add_argument("--disable-ipc-flooding-protection")
|
|
2809
2805
|
chrome_options.add_argument("--disable-password-generation")
|
|
2810
2806
|
chrome_options.add_argument("--disable-domain-reliability")
|
|
2811
2807
|
chrome_options.add_argument("--disable-breakpad")
|
|
@@ -2830,7 +2826,7 @@ def _set_chrome_options(
|
|
|
2830
2826
|
included_disabled_features.append("PasskeyAuth")
|
|
2831
2827
|
included_disabled_features.append("DialMediaRouteProvider")
|
|
2832
2828
|
included_disabled_features.append("WebRtcHideLocalIpsWithMdns")
|
|
2833
|
-
if
|
|
2829
|
+
if is_uc:
|
|
2834
2830
|
included_disabled_features.append("IsolateOrigins")
|
|
2835
2831
|
included_disabled_features.append("site-per-process")
|
|
2836
2832
|
for item in extra_disabled_features:
|
|
@@ -2839,20 +2835,30 @@ def _set_chrome_options(
|
|
|
2839
2835
|
d_f_string = ",".join(included_disabled_features)
|
|
2840
2836
|
chrome_options.add_argument("--disable-features=%s" % d_f_string)
|
|
2841
2837
|
chrome_options.add_argument("--enable-unsafe-extension-debugging")
|
|
2838
|
+
if is_uc and binary_location and "cft_drivers" in binary_location:
|
|
2839
|
+
chrome_options.add_argument("--disable-infobars")
|
|
2842
2840
|
if (
|
|
2843
2841
|
hasattr(sb_config, "_cdp_browser")
|
|
2844
2842
|
and sb_config._cdp_browser == "brave"
|
|
2845
2843
|
):
|
|
2846
2844
|
pass # Looks like "--test-type" breaks Brave now
|
|
2847
2845
|
else:
|
|
2848
|
-
|
|
2846
|
+
if not is_uc or (
|
|
2847
|
+
proxy_string and not (
|
|
2848
|
+
hasattr(sb_config, "_no_tt") and sb_config._no_tt
|
|
2849
|
+
)
|
|
2850
|
+
):
|
|
2851
|
+
# Since --test-type is detectable by sites that look for it,
|
|
2852
|
+
# there's a new no_tt option to skip it in UC Mode / CDP Mode
|
|
2853
|
+
# when using a proxy. Not used anymore if no proxy otherwise.
|
|
2854
|
+
chrome_options.add_argument("--test-type")
|
|
2849
2855
|
if proxy_auth or sb_config._ext_dirs:
|
|
2850
|
-
if not
|
|
2856
|
+
if not is_uc:
|
|
2851
2857
|
chrome_options.add_argument("--remote-debugging-pipe")
|
|
2852
2858
|
chrome_options.enable_webextensions = True
|
|
2853
2859
|
chrome_options.enable_bidi = True
|
|
2854
2860
|
if (
|
|
2855
|
-
|
|
2861
|
+
is_uc
|
|
2856
2862
|
and (
|
|
2857
2863
|
not headless
|
|
2858
2864
|
or IS_LINUX # switches to Xvfb (non-headless)
|
|
@@ -2866,7 +2872,8 @@ def _set_chrome_options(
|
|
|
2866
2872
|
chrome_options.add_argument("--disable-auto-reload")
|
|
2867
2873
|
chrome_options.add_argument("--disable-background-timer-throttling")
|
|
2868
2874
|
# Prevent new tabs opened by Selenium from being blocked:
|
|
2869
|
-
|
|
2875
|
+
# (Option might not be needed anymore. Removing for now.)
|
|
2876
|
+
# chrome_options.add_argument("--disable-popup-blocking")
|
|
2870
2877
|
# Skip remaining options that trigger anti-bot services
|
|
2871
2878
|
return chrome_options
|
|
2872
2879
|
chrome_options.add_argument("--log-level=3")
|
|
@@ -257,12 +257,15 @@ class CDPMethods():
|
|
|
257
257
|
that SeleniumBase methods can be called from Playwright
|
|
258
258
|
without encountering event loop error messages such as:
|
|
259
259
|
Cannot run the event loop while another loop is running.
|
|
260
|
+
Also fixes a NodeJS compatibility issue on old versions
|
|
261
|
+
of macOS when using Playwright versions 1.65.0 or newer.
|
|
260
262
|
Also sets an environment variable to hide this warning:
|
|
261
263
|
Deprecation: "url.parse() behavior is not standardized".
|
|
262
264
|
(github.com/microsoft/playwright-python/issues/3016)"""
|
|
263
265
|
from seleniumbase.core import nest_asyncio
|
|
264
266
|
nest_asyncio.apply()
|
|
265
267
|
os.environ["NODE_NO_WARNINGS"] = "1"
|
|
268
|
+
shared_utils.fix_playwright_node_compatibility()
|
|
266
269
|
driver = self.driver
|
|
267
270
|
if hasattr(driver, "cdp_base"):
|
|
268
271
|
driver = driver.cdp_base
|
|
@@ -1249,6 +1252,19 @@ class CDPMethods():
|
|
|
1249
1252
|
element.flash(0.30, "44CC88", x_offset, y_offset)
|
|
1250
1253
|
time.sleep(0.30)
|
|
1251
1254
|
|
|
1255
|
+
def highlight_if_visible(self, selector, scroll=True, timeout=0):
|
|
1256
|
+
if self.is_element_visible(selector):
|
|
1257
|
+
with suppress(Exception):
|
|
1258
|
+
self.highlight(selector, scroll=scroll, timeout=1)
|
|
1259
|
+
elif timeout == 0:
|
|
1260
|
+
return
|
|
1261
|
+
else:
|
|
1262
|
+
with suppress(Exception):
|
|
1263
|
+
self.find_element(selector, timeout=timeout)
|
|
1264
|
+
self.sleep(0.1)
|
|
1265
|
+
if self.is_element_visible(selector):
|
|
1266
|
+
self.highlight(selector, scroll=scroll, timeout=1)
|
|
1267
|
+
|
|
1252
1268
|
def focus(self, selector, timeout=None):
|
|
1253
1269
|
if not timeout:
|
|
1254
1270
|
timeout = settings.SMALL_TIMEOUT
|
|
@@ -2463,8 +2479,8 @@ class CDPMethods():
|
|
|
2463
2479
|
self.loop.run_until_complete(self.page.wait(0.05))
|
|
2464
2480
|
if (
|
|
2465
2481
|
self.is_element_visible(
|
|
2466
|
-
'
|
|
2467
|
-
'
|
|
2482
|
+
'iframe[src*="/geo.captcha-delivery.com/captcha/"], '
|
|
2483
|
+
'iframe[src*="/geo.captcha-delivery.com/interstitial/"]'
|
|
2468
2484
|
)
|
|
2469
2485
|
):
|
|
2470
2486
|
return True
|
|
@@ -2551,8 +2567,8 @@ class CDPMethods():
|
|
|
2551
2567
|
|
|
2552
2568
|
def __gui_slide_datadome_captcha(self):
|
|
2553
2569
|
iframe = (
|
|
2554
|
-
'
|
|
2555
|
-
'
|
|
2570
|
+
'iframe[src*="/geo.captcha-delivery.com/captcha/"], '
|
|
2571
|
+
'iframe[src*="/geo.captcha-delivery.com/interstitial/"]'
|
|
2556
2572
|
)
|
|
2557
2573
|
if not self.is_element_visible(iframe):
|
|
2558
2574
|
return False
|