seleniumbase 4.55.2__tar.gz → 4.56.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.55.2/seleniumbase.egg-info → seleniumbase-4.56.0}/PKG-INFO +69 -32
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/README.md +59 -24
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/requirements.txt +7 -5
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/__version__.py +1 -1
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/browser_launcher.py +31 -18
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/sb_driver.py +3 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/fixtures/page_actions.py +34 -16
- {seleniumbase-4.55.2 → seleniumbase-4.56.0/seleniumbase.egg-info}/PKG-INFO +69 -32
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase.egg-info/requires.txt +9 -7
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/setup.py +9 -7
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/.gitignore +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/LICENSE +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/MANIFEST.in +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/install.sh +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/mcp_servers/__init__.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/mcp_servers/server.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/pyproject.toml +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/pytest.ini +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/sbase/__init__.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/sbase/__main__.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/sbase/steps.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/__init__.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/__main__.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/behave/__init__.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/behave/behave_helper.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/behave/behave_sb.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/behave/steps.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/common/__init__.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/common/decorators.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/common/encryption.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/common/exceptions.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/common/obfuscate.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/common/unobfuscate.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/config/__init__.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/config/ad_block_list.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/config/proxy_list.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/config/settings.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/console_scripts/__init__.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/console_scripts/logo_helper.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/console_scripts/rich_helper.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/console_scripts/run.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/console_scripts/sb_commander.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/console_scripts/sb_install.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/console_scripts/sb_objectify.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/console_scripts/sb_print.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/console_scripts/sb_recorder.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/__init__.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/application_manager.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/capabilities_parser.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/colored_traceback.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/create_db_tables.sql +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/detect_b_ver.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/download_helper.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/encoded_images.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/jqc_helper.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/log_helper.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/mysql.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/nest_asyncio.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/proxy_helper.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/recorder_helper.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/report_helper.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/s3_manager.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/sb_cdp.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/session_helper.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/settings_parser.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/style_sheet.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/testcase_manager.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/tour_helper.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/core/visual_helper.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/drivers/__init__.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/drivers/brave_drivers/__init__.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/drivers/cft_drivers/__init__.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/drivers/chromium_drivers/__init__.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/drivers/chs_drivers/__init__.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/drivers/comet_drivers/__init__.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/drivers/opera_drivers/__init__.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/extensions/__init__.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/extensions/ad_block.zip +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/extensions/disable_csp.zip +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/extensions/recorder.zip +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/extensions/sbase_ext.zip +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/fixtures/__init__.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/fixtures/base_case.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/fixtures/constants.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/fixtures/css_to_xpath.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/fixtures/errors.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/fixtures/js_utils.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/fixtures/page_utils.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/fixtures/shared_utils.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/fixtures/unittest_helper.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/fixtures/words.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/fixtures/xpath_to_css.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/js_code/__init__.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/js_code/active_css_js.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/js_code/live_js.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/js_code/recorder_js.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/masterqa/__init__.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/masterqa/master_qa.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/plugins/__init__.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/plugins/base_plugin.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/plugins/basic_test_info.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/plugins/driver_manager.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/plugins/page_source.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/plugins/pytest_plugin.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/plugins/sb_manager.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/plugins/screen_shots.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/plugins/selenium_plugin.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/resources/__init__.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/translate/__init__.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/translate/chinese.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/translate/dutch.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/translate/french.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/translate/italian.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/translate/japanese.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/translate/korean.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/translate/master_dict.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/translate/portuguese.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/translate/russian.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/translate/spanish.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/translate/translator.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/undetected/__init__.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/undetected/cdp.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/undetected/cdp_driver/__init__.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/undetected/cdp_driver/browser.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/undetected/cdp_driver/cdp_util.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/undetected/cdp_driver/config.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/undetected/cdp_driver/connection.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/undetected/cdp_driver/element.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/undetected/cdp_driver/tab.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/undetected/dprocess.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/undetected/options.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/undetected/patcher.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/undetected/reactor.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/undetected/webelement.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/utilities/__init__.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/utilities/selenium_grid/font_color +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase.egg-info/SOURCES.txt +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase.egg-info/dependency_links.txt +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase.egg-info/entry_points.txt +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/seleniumbase.egg-info/top_level.txt +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.0}/setup.cfg +0 -0
- {seleniumbase-4.55.2 → seleniumbase-4.56.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.56.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
|
|
@@ -67,7 +67,7 @@ Requires-Dist: certifi>=2026.7.22
|
|
|
67
67
|
Requires-Dist: exceptiongroup>=1.3.1
|
|
68
68
|
Requires-Dist: websockets~=16.1.1; python_version == "3.10"
|
|
69
69
|
Requires-Dist: websockets>=16.1.1; python_version >= "3.11"
|
|
70
|
-
Requires-Dist: filelock>=4.0
|
|
70
|
+
Requires-Dist: filelock>=4.1.0
|
|
71
71
|
Requires-Dist: fasteners>=0.20
|
|
72
72
|
Requires-Dist: mycdp>=1.4.0
|
|
73
73
|
Requires-Dist: pynose>=1.5.5
|
|
@@ -76,7 +76,7 @@ Requires-Dist: sbvirtualdisplay>=1.4.0
|
|
|
76
76
|
Requires-Dist: MarkupSafe>=3.0.4
|
|
77
77
|
Requires-Dist: Jinja2>=3.1.6
|
|
78
78
|
Requires-Dist: six>=1.17.0
|
|
79
|
-
Requires-Dist: parse>=1.22.
|
|
79
|
+
Requires-Dist: parse>=1.22.3
|
|
80
80
|
Requires-Dist: parse-type>=0.6.6
|
|
81
81
|
Requires-Dist: colorama>=0.4.6
|
|
82
82
|
Requires-Dist: psutil>=7.2.2
|
|
@@ -96,8 +96,9 @@ Requires-Dist: trio<1,>=0.34.0
|
|
|
96
96
|
Requires-Dist: trio-websocket~=0.12.2
|
|
97
97
|
Requires-Dist: wsproto~=1.3.2
|
|
98
98
|
Requires-Dist: websocket-client~=1.9.2
|
|
99
|
-
Requires-Dist: selenium==4.
|
|
100
|
-
Requires-Dist: cssselect
|
|
99
|
+
Requires-Dist: selenium==4.51.0
|
|
100
|
+
Requires-Dist: cssselect~=1.5.0; python_version < "3.11"
|
|
101
|
+
Requires-Dist: cssselect<2,>=1.6.0; python_version >= "3.11"
|
|
101
102
|
Requires-Dist: sortedcontainers==2.4.0
|
|
102
103
|
Requires-Dist: execnet==2.1.2
|
|
103
104
|
Requires-Dist: iniconfig~=2.3.1
|
|
@@ -112,7 +113,8 @@ Requires-Dist: pytest-rerunfailures==16.7; python_version >= "3.11"
|
|
|
112
113
|
Requires-Dist: pytest-xdist==3.8.0
|
|
113
114
|
Requires-Dist: parameterized==0.9.0
|
|
114
115
|
Requires-Dist: behave==1.2.6
|
|
115
|
-
Requires-Dist: soupsieve~=2.10.0
|
|
116
|
+
Requires-Dist: soupsieve~=2.10.0; python_version == "3.10"
|
|
117
|
+
Requires-Dist: soupsieve~=3.0.1; python_version >= "3.11"
|
|
116
118
|
Requires-Dist: beautifulsoup4~=4.15.0
|
|
117
119
|
Requires-Dist: pyotp~=2.10.0
|
|
118
120
|
Requires-Dist: python-xlib==0.33; platform_system == "Linux"
|
|
@@ -140,7 +142,7 @@ Provides-Extra: pdfminer
|
|
|
140
142
|
Requires-Dist: pdfminer.six==20260107; extra == "pdfminer"
|
|
141
143
|
Requires-Dist: cryptography==50.0.2; extra == "pdfminer"
|
|
142
144
|
Requires-Dist: cffi==2.1.1; extra == "pdfminer"
|
|
143
|
-
Requires-Dist: pycparser==3.
|
|
145
|
+
Requires-Dist: pycparser==3.11; extra == "pdfminer"
|
|
144
146
|
Provides-Extra: pillow
|
|
145
147
|
Requires-Dist: Pillow>=12.3.0; extra == "pillow"
|
|
146
148
|
Provides-Extra: pip-system-certs
|
|
@@ -154,7 +156,7 @@ Requires-Dist: pyee>=13.0.1; extra == "playwright"
|
|
|
154
156
|
Provides-Extra: pyautogui
|
|
155
157
|
Requires-Dist: PyAutoGUI>=0.9.54; platform_system != "Linux" and extra == "pyautogui"
|
|
156
158
|
Provides-Extra: uv
|
|
157
|
-
Requires-Dist: uv>=0.
|
|
159
|
+
Requires-Dist: uv>=0.13.0; extra == "uv"
|
|
158
160
|
Dynamic: author
|
|
159
161
|
Dynamic: author-email
|
|
160
162
|
Dynamic: classifier
|
|
@@ -179,11 +181,11 @@ Dynamic: summary
|
|
|
179
181
|
<meta property="og:image" content="https://seleniumbase.github.io/cdn/img/mac_sb_logo_5b.png" />
|
|
180
182
|
<link rel="icon" href="https://seleniumbase.github.io/img/logo7.png" />
|
|
181
183
|
|
|
182
|
-
<
|
|
184
|
+
<h1 align="center">📊 SeleniumBase</h1>
|
|
183
185
|
|
|
184
|
-
<p align="center"
|
|
186
|
+
<p><h3 align="center">One framework for browser automation, web scraping, and testing.<br /></h3></p>
|
|
185
187
|
|
|
186
|
-
<p align="center"><a href="https://pypi.python.org/pypi/seleniumbase" target="_blank"><img src="https://img.shields.io/pypi/v/seleniumbase.svg?color=3399EE" alt="PyPI version" height="20" /></a> <a href="https://pepy.tech/projects/seleniumbase?timeRange=threeMonths&category=version&includeCIDownloads=true&granularity=daily&viewType=line&versions=*" target="_blank"><img src="https://
|
|
188
|
+
<p align="center"><a href="https://pypi.python.org/pypi/seleniumbase" target="_blank"><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"><img src="https://img.shields.io/github/actions/workflow/status/seleniumbase/SeleniumBase/python-package.yml?branch=master&style=flat-square&label=CI" alt="SeleniumBase GitHub Actions" height="20" /></a> <a href="https://seleniumbase.io"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg?style=flat-square" alt="SeleniumBase Docs" height="20" /></a> <a href="https://pepy.tech/projects/seleniumbase?timeRange=threeMonths&category=version&includeCIDownloads=true&granularity=daily&viewType=line&versions=*" target="_blank"><img src="https://img.shields.io/pepy/dt/seleniumbase?style=flat-square" alt="SeleniumBase PyPI downloads" height="20" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/LICENSE"><img src="https://img.shields.io/badge/license-MIT-f4c430.svg?style=flat-square" title="SeleniumBase" height="20" /></a><br /><a href="https://www.youtube.com/playlist?list=PLp9uKicxkBc5UIlGi2BuE3aWC7JyXpD3m"><img src="https://img.shields.io/badge/docs-📺-D124D8.svg?style=flat-square&logo=YouTube&logoColor=white&label=YouTube" alt="YouTube Channel" height="20" /></a> <a href="https://discord.gg/EdhQTn3EyE" target="_blank"><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://www.facebook.com/SeleniumBase/" target="_blank"> <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"><img src="https://img.shields.io/badge/-1K_followers-1DA1F2?style=flat-square&logo=x&logoColor=white&labelColor=000000" alt="SeleniumBase X Followers" height="20" /></a></p>
|
|
187
189
|
|
|
188
190
|
<p align="center">
|
|
189
191
|
<a href="#python_installation">🚀 Start</a> |
|
|
@@ -218,24 +220,17 @@ Dynamic: summary
|
|
|
218
220
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/presenter/ReadMe.md">🎞️ Presenter</a> |
|
|
219
221
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/visual_testing/ReadMe.md">🖼️ Visual</a> |
|
|
220
222
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/case_plans.md">🗂️ CPlans</a>
|
|
221
|
-
<br />
|
|
222
223
|
</p>
|
|
223
224
|
|
|
224
225
|
--------
|
|
225
226
|
|
|
226
|
-
🥷
|
|
227
|
-
|
|
228
|
-
🧪 End-to-End Testing examples are located in [./examples/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples).
|
|
227
|
+
🥷 <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/uc_mode.md"><b>UC Mode</b></a> and the newer <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md"><b>CDP Mode</b></a> makes your automation undetectable to anti-bot services. <b>CDP Mode</b> also <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/ReadMe.md"><span translate="no">adds <b>stealth</b> to stock Playwright</span></a>.
|
|
229
228
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
🎭 Stealthy Playwright examples are located in [./examples/cdp_mode/playwright/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/).
|
|
233
|
-
|
|
234
|
-
📚 Examples that have `test_` or `_test` in the filename are specifically designed to run with `pytest` / `pynose`. Other examples run directly with raw `python` (those files generally start with `raw_` to avoid confusion).
|
|
229
|
+
📚 Example scripts that start or end with "<code>test</code>" are specifically designed to be run with <code><b>pytest</b></code>. Other scripts run directly with raw <code><b>python</b></code>. (Those start with "<code>raw</code>" to avoid confusion.)
|
|
235
230
|
|
|
236
231
|
--------
|
|
237
232
|
|
|
238
|
-
<b>📝 Here's a
|
|
233
|
+
<b>📝 Here's a <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_planetmc.py" target="_blank">Python script</a> that uses <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md#-pure-cdp-mode-sb_cdp">Pure CDP Mode</a> (<code>sb_cdp</code>):</b><br />(It performs actions such as typing, clicking, and bypassing a Cloudflare Turnstile)
|
|
239
234
|
|
|
240
235
|
```python
|
|
241
236
|
from seleniumbase import sb_cdp
|
|
@@ -253,7 +248,9 @@ sb.sleep(1.5)
|
|
|
253
248
|
sb.quit()
|
|
254
249
|
```
|
|
255
250
|
|
|
256
|
-
|
|
251
|
+
```
|
|
252
|
+
python raw_cdp_planetmc.py
|
|
253
|
+
```
|
|
257
254
|
|
|
258
255
|
<p align="left">
|
|
259
256
|
<img src="https://seleniumbase.github.io/other/pmc_captcha_2.png" width="530" style="max-width: 100% !important; height: auto !important;" alt="Cloudflare Turnstile bypassed successfully" />
|
|
@@ -261,9 +258,11 @@ sb.quit()
|
|
|
261
258
|
|
|
262
259
|
✅ <b><code>sb.solve_captcha()</code></b> handles CAPTCHAs that aren't bypassed automatically.<br />(If called when there's no CAPTCHA on the page, then nothing happens / no-op.)
|
|
263
260
|
|
|
261
|
+
ℹ️ <code>sb.assert_*</code> methods wait up to 7 seconds for the expected condition to occur.
|
|
262
|
+
|
|
264
263
|
--------
|
|
265
264
|
|
|
266
|
-
<p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_yc_news.py" target="_blank">This
|
|
265
|
+
<p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_yc_news.py" target="_blank">This script</a> scrapes Hacker News listings:</b></p>
|
|
267
266
|
|
|
268
267
|
```python
|
|
269
268
|
from seleniumbase import sb_cdp
|
|
@@ -275,7 +274,9 @@ for element in elements:
|
|
|
275
274
|
print("* " + element.text)
|
|
276
275
|
```
|
|
277
276
|
|
|
278
|
-
|
|
277
|
+
```
|
|
278
|
+
python raw_cdp_yc_news.py
|
|
279
|
+
```
|
|
279
280
|
|
|
280
281
|
<p align="left">
|
|
281
282
|
<img src="https://seleniumbase.github.io/other/yc_news_results.png" alt="SeleniumBase" width="510" style="max-width: 100% !important; height: auto !important;"/>
|
|
@@ -283,7 +284,7 @@ for element in elements:
|
|
|
283
284
|
|
|
284
285
|
--------
|
|
285
286
|
|
|
286
|
-
<p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_gitlab.py" target="_blank">This
|
|
287
|
+
<p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_gitlab.py" target="_blank">This script</a> bypasses Cloudflare's challenge page with UC + CDP Mode:</b></p>
|
|
287
288
|
|
|
288
289
|
```python
|
|
289
290
|
from seleniumbase import SB
|
|
@@ -297,7 +298,9 @@ with SB(uc=True, test=True, locale="en") as sb:
|
|
|
297
298
|
sb.highlight('button:contains("Sign in")')
|
|
298
299
|
```
|
|
299
300
|
|
|
300
|
-
|
|
301
|
+
```
|
|
302
|
+
python raw_gitlab.py
|
|
303
|
+
```
|
|
301
304
|
|
|
302
305
|
<p align="left">
|
|
303
306
|
<img src="https://seleniumbase.github.io/other/gitlab_bypass_2.png" alt="SeleniumBase" width="420" style="max-width: 100% !important; height: auto !important;"/>
|
|
@@ -305,6 +308,14 @@ with SB(uc=True, test=True, locale="en") as sb:
|
|
|
305
308
|
|
|
306
309
|
--------
|
|
307
310
|
|
|
311
|
+
🧪 End-to-End Testing examples are located in [./examples/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples).
|
|
312
|
+
|
|
313
|
+
🐙 Stealthy CDP Mode examples are located in [./examples/cdp_mode/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples/cdp_mode).
|
|
314
|
+
|
|
315
|
+
🎭 Stealthy Playwright examples are located in [./examples/cdp_mode/playwright/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/).
|
|
316
|
+
|
|
317
|
+
--------
|
|
318
|
+
|
|
308
319
|
<h3 align="left">🌐 CLI Options for Supported Chromium Browsers</h3>
|
|
309
320
|
|
|
310
321
|
<p>💡 You can set which Chromium browser to use via command-line parameters:</p>
|
|
@@ -328,13 +339,13 @@ sb = sb_cdp.Chrome(use_chromium=True)
|
|
|
328
339
|
|
|
329
340
|
<h3 align="left">⚙️ Stealthy architecture flowchart:</h3>
|
|
330
341
|
|
|
331
|
-
<img src="https://seleniumbase.github.io/other/sb_architecture.png" width="
|
|
342
|
+
<img src="https://seleniumbase.github.io/other/sb_architecture.png" width="530" style="max-width: 100% !important; height: auto !important;" alt="Stealthy architecture flowchart" />
|
|
332
343
|
|
|
333
344
|
--------
|
|
334
345
|
|
|
335
346
|
<h3>🧪 Comprehensive E2E Testing with <code>pytest</code>:</h3>
|
|
336
347
|
|
|
337
|
-
<p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_get_swag.py" target="_blank">This
|
|
348
|
+
<p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_get_swag.py" target="_blank">This script</a> tests an e-commerce site with <code>pytest</code>:</b></p>
|
|
338
349
|
|
|
339
350
|
```python
|
|
340
351
|
from seleniumbase import BaseCase
|
|
@@ -358,7 +369,9 @@ class MyTestClass(BaseCase):
|
|
|
358
369
|
self.assert_text("Thank you for your order!")
|
|
359
370
|
```
|
|
360
371
|
|
|
361
|
-
|
|
372
|
+
```
|
|
373
|
+
pytest test_get_swag.py
|
|
374
|
+
```
|
|
362
375
|
|
|
363
376
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_get_swag.py"><img src="https://seleniumbase.github.io/cdn/gif/fast_swag_2.gif" alt="SeleniumBase Test" width="500" style="max-width: 100% !important; height: auto !important;" /></a>
|
|
364
377
|
|
|
@@ -366,7 +379,31 @@ class MyTestClass(BaseCase):
|
|
|
366
379
|
|
|
367
380
|
--------
|
|
368
381
|
|
|
369
|
-
<p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_coffee_cart.py" target="_blank">This
|
|
382
|
+
<p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_coffee_cart.py" target="_blank">This script</a> tests a different e-commerce site with <code>pytest</code>:</b></p>
|
|
383
|
+
|
|
384
|
+
```python
|
|
385
|
+
from seleniumbase import BaseCase
|
|
386
|
+
BaseCase.main(__name__, __file__)
|
|
387
|
+
|
|
388
|
+
class CoffeeCartTest(BaseCase):
|
|
389
|
+
def test_coffee_cart(self):
|
|
390
|
+
self.goto("https://seleniumbase.io/coffee/")
|
|
391
|
+
self.assert_title("Coffee Cart")
|
|
392
|
+
self.assert_element('button:contains("Total: $0.00")')
|
|
393
|
+
self.click('div[data-sb="Cappuccino"]')
|
|
394
|
+
self.assert_exact_text("cart (1)", 'a[aria-label="Cart page"]')
|
|
395
|
+
self.click('div[data-sb="Flat-White"]')
|
|
396
|
+
self.assert_exact_text("cart (2)", 'a[aria-label="Cart page"]')
|
|
397
|
+
self.click('div[data-sb="Cafe-Latte"]')
|
|
398
|
+
self.assert_exact_text("cart (3)", 'a[aria-label="Cart page"]')
|
|
399
|
+
self.click('a[aria-label="Cart page"]')
|
|
400
|
+
self.assert_exact_text("Total: $53.00", "button.pay")
|
|
401
|
+
self.click("button.pay")
|
|
402
|
+
self.type("input#name", "Selenium Coffee")
|
|
403
|
+
self.type("input#email", "test@test.test")
|
|
404
|
+
self.click("button#submit-payment")
|
|
405
|
+
self.assert_text("Thanks for your purchase.", "#app .success")
|
|
406
|
+
```
|
|
370
407
|
|
|
371
408
|
```zsh
|
|
372
409
|
pytest test_coffee_cart.py --demo
|
|
@@ -380,7 +417,7 @@ pytest test_coffee_cart.py --demo
|
|
|
380
417
|
|
|
381
418
|
<a id="multiple_examples"></a>
|
|
382
419
|
|
|
383
|
-
<p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_demo_site.py" target="_blank">This
|
|
420
|
+
<p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_demo_site.py" target="_blank">This script</a> covers multiple actions with <code>pytest</code>:</b></p>
|
|
384
421
|
|
|
385
422
|
```zsh
|
|
386
423
|
pytest test_demo_site.py
|
|
@@ -390,7 +427,7 @@ pytest test_demo_site.py
|
|
|
390
427
|
|
|
391
428
|
> Easy to type, click, select, toggle, drag & drop, and more.
|
|
392
429
|
|
|
393
|
-
📚 For more
|
|
430
|
+
📚 For more scripts, see the <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/ReadMe.md">SeleniumBase/examples/</a> folder.
|
|
394
431
|
|
|
395
432
|
--------
|
|
396
433
|
|
|
@@ -8,11 +8,11 @@
|
|
|
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
|
-
<
|
|
11
|
+
<h1 align="center">📊 SeleniumBase</h1>
|
|
12
12
|
|
|
13
|
-
<p align="center"
|
|
13
|
+
<p><h3 align="center">One framework for browser automation, web scraping, and testing.<br /></h3></p>
|
|
14
14
|
|
|
15
|
-
<p align="center"><a href="https://pypi.python.org/pypi/seleniumbase" target="_blank"><img src="https://img.shields.io/pypi/v/seleniumbase.svg?color=3399EE" alt="PyPI version" height="20" /></a> <a href="https://pepy.tech/projects/seleniumbase?timeRange=threeMonths&category=version&includeCIDownloads=true&granularity=daily&viewType=line&versions=*" target="_blank"><img src="https://
|
|
15
|
+
<p align="center"><a href="https://pypi.python.org/pypi/seleniumbase" target="_blank"><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"><img src="https://img.shields.io/github/actions/workflow/status/seleniumbase/SeleniumBase/python-package.yml?branch=master&style=flat-square&label=CI" alt="SeleniumBase GitHub Actions" height="20" /></a> <a href="https://seleniumbase.io"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg?style=flat-square" alt="SeleniumBase Docs" height="20" /></a> <a href="https://pepy.tech/projects/seleniumbase?timeRange=threeMonths&category=version&includeCIDownloads=true&granularity=daily&viewType=line&versions=*" target="_blank"><img src="https://img.shields.io/pepy/dt/seleniumbase?style=flat-square" alt="SeleniumBase PyPI downloads" height="20" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/LICENSE"><img src="https://img.shields.io/badge/license-MIT-f4c430.svg?style=flat-square" title="SeleniumBase" height="20" /></a><br /><a href="https://www.youtube.com/playlist?list=PLp9uKicxkBc5UIlGi2BuE3aWC7JyXpD3m"><img src="https://img.shields.io/badge/docs-📺-D124D8.svg?style=flat-square&logo=YouTube&logoColor=white&label=YouTube" alt="YouTube Channel" height="20" /></a> <a href="https://discord.gg/EdhQTn3EyE" target="_blank"><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://www.facebook.com/SeleniumBase/" target="_blank"> <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"><img src="https://img.shields.io/badge/-1K_followers-1DA1F2?style=flat-square&logo=x&logoColor=white&labelColor=000000" alt="SeleniumBase X Followers" height="20" /></a></p>
|
|
16
16
|
|
|
17
17
|
<p align="center">
|
|
18
18
|
<a href="#python_installation">🚀 Start</a> |
|
|
@@ -47,24 +47,17 @@
|
|
|
47
47
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/presenter/ReadMe.md">🎞️ Presenter</a> |
|
|
48
48
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/visual_testing/ReadMe.md">🖼️ Visual</a> |
|
|
49
49
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/case_plans.md">🗂️ CPlans</a>
|
|
50
|
-
<br />
|
|
51
50
|
</p>
|
|
52
51
|
|
|
53
52
|
--------
|
|
54
53
|
|
|
55
|
-
🥷
|
|
56
|
-
|
|
57
|
-
🧪 End-to-End Testing examples are located in [./examples/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples).
|
|
54
|
+
🥷 <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/uc_mode.md"><b>UC Mode</b></a> and the newer <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md"><b>CDP Mode</b></a> makes your automation undetectable to anti-bot services. <b>CDP Mode</b> also <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/ReadMe.md"><span translate="no">adds <b>stealth</b> to stock Playwright</span></a>.
|
|
58
55
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
🎭 Stealthy Playwright examples are located in [./examples/cdp_mode/playwright/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/).
|
|
62
|
-
|
|
63
|
-
📚 Examples that have `test_` or `_test` in the filename are specifically designed to run with `pytest` / `pynose`. Other examples run directly with raw `python` (those files generally start with `raw_` to avoid confusion).
|
|
56
|
+
📚 Example scripts that start or end with "<code>test</code>" are specifically designed to be run with <code><b>pytest</b></code>. Other scripts run directly with raw <code><b>python</b></code>. (Those start with "<code>raw</code>" to avoid confusion.)
|
|
64
57
|
|
|
65
58
|
--------
|
|
66
59
|
|
|
67
|
-
<b>📝 Here's a
|
|
60
|
+
<b>📝 Here's a <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_planetmc.py" target="_blank">Python script</a> that uses <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md#-pure-cdp-mode-sb_cdp">Pure CDP Mode</a> (<code>sb_cdp</code>):</b><br />(It performs actions such as typing, clicking, and bypassing a Cloudflare Turnstile)
|
|
68
61
|
|
|
69
62
|
```python
|
|
70
63
|
from seleniumbase import sb_cdp
|
|
@@ -82,7 +75,9 @@ sb.sleep(1.5)
|
|
|
82
75
|
sb.quit()
|
|
83
76
|
```
|
|
84
77
|
|
|
85
|
-
|
|
78
|
+
```
|
|
79
|
+
python raw_cdp_planetmc.py
|
|
80
|
+
```
|
|
86
81
|
|
|
87
82
|
<p align="left">
|
|
88
83
|
<img src="https://seleniumbase.github.io/other/pmc_captcha_2.png" width="530" style="max-width: 100% !important; height: auto !important;" alt="Cloudflare Turnstile bypassed successfully" />
|
|
@@ -90,9 +85,11 @@ sb.quit()
|
|
|
90
85
|
|
|
91
86
|
✅ <b><code>sb.solve_captcha()</code></b> handles CAPTCHAs that aren't bypassed automatically.<br />(If called when there's no CAPTCHA on the page, then nothing happens / no-op.)
|
|
92
87
|
|
|
88
|
+
ℹ️ <code>sb.assert_*</code> methods wait up to 7 seconds for the expected condition to occur.
|
|
89
|
+
|
|
93
90
|
--------
|
|
94
91
|
|
|
95
|
-
<p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_yc_news.py" target="_blank">This
|
|
92
|
+
<p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_yc_news.py" target="_blank">This script</a> scrapes Hacker News listings:</b></p>
|
|
96
93
|
|
|
97
94
|
```python
|
|
98
95
|
from seleniumbase import sb_cdp
|
|
@@ -104,7 +101,9 @@ for element in elements:
|
|
|
104
101
|
print("* " + element.text)
|
|
105
102
|
```
|
|
106
103
|
|
|
107
|
-
|
|
104
|
+
```
|
|
105
|
+
python raw_cdp_yc_news.py
|
|
106
|
+
```
|
|
108
107
|
|
|
109
108
|
<p align="left">
|
|
110
109
|
<img src="https://seleniumbase.github.io/other/yc_news_results.png" alt="SeleniumBase" width="510" style="max-width: 100% !important; height: auto !important;"/>
|
|
@@ -112,7 +111,7 @@ for element in elements:
|
|
|
112
111
|
|
|
113
112
|
--------
|
|
114
113
|
|
|
115
|
-
<p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_gitlab.py" target="_blank">This
|
|
114
|
+
<p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_gitlab.py" target="_blank">This script</a> bypasses Cloudflare's challenge page with UC + CDP Mode:</b></p>
|
|
116
115
|
|
|
117
116
|
```python
|
|
118
117
|
from seleniumbase import SB
|
|
@@ -126,7 +125,9 @@ with SB(uc=True, test=True, locale="en") as sb:
|
|
|
126
125
|
sb.highlight('button:contains("Sign in")')
|
|
127
126
|
```
|
|
128
127
|
|
|
129
|
-
|
|
128
|
+
```
|
|
129
|
+
python raw_gitlab.py
|
|
130
|
+
```
|
|
130
131
|
|
|
131
132
|
<p align="left">
|
|
132
133
|
<img src="https://seleniumbase.github.io/other/gitlab_bypass_2.png" alt="SeleniumBase" width="420" style="max-width: 100% !important; height: auto !important;"/>
|
|
@@ -134,6 +135,14 @@ with SB(uc=True, test=True, locale="en") as sb:
|
|
|
134
135
|
|
|
135
136
|
--------
|
|
136
137
|
|
|
138
|
+
🧪 End-to-End Testing examples are located in [./examples/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples).
|
|
139
|
+
|
|
140
|
+
🐙 Stealthy CDP Mode examples are located in [./examples/cdp_mode/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples/cdp_mode).
|
|
141
|
+
|
|
142
|
+
🎭 Stealthy Playwright examples are located in [./examples/cdp_mode/playwright/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/).
|
|
143
|
+
|
|
144
|
+
--------
|
|
145
|
+
|
|
137
146
|
<h3 align="left">🌐 CLI Options for Supported Chromium Browsers</h3>
|
|
138
147
|
|
|
139
148
|
<p>💡 You can set which Chromium browser to use via command-line parameters:</p>
|
|
@@ -157,13 +166,13 @@ sb = sb_cdp.Chrome(use_chromium=True)
|
|
|
157
166
|
|
|
158
167
|
<h3 align="left">⚙️ Stealthy architecture flowchart:</h3>
|
|
159
168
|
|
|
160
|
-
<img src="https://seleniumbase.github.io/other/sb_architecture.png" width="
|
|
169
|
+
<img src="https://seleniumbase.github.io/other/sb_architecture.png" width="530" style="max-width: 100% !important; height: auto !important;" alt="Stealthy architecture flowchart" />
|
|
161
170
|
|
|
162
171
|
--------
|
|
163
172
|
|
|
164
173
|
<h3>🧪 Comprehensive E2E Testing with <code>pytest</code>:</h3>
|
|
165
174
|
|
|
166
|
-
<p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_get_swag.py" target="_blank">This
|
|
175
|
+
<p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_get_swag.py" target="_blank">This script</a> tests an e-commerce site with <code>pytest</code>:</b></p>
|
|
167
176
|
|
|
168
177
|
```python
|
|
169
178
|
from seleniumbase import BaseCase
|
|
@@ -187,7 +196,9 @@ class MyTestClass(BaseCase):
|
|
|
187
196
|
self.assert_text("Thank you for your order!")
|
|
188
197
|
```
|
|
189
198
|
|
|
190
|
-
|
|
199
|
+
```
|
|
200
|
+
pytest test_get_swag.py
|
|
201
|
+
```
|
|
191
202
|
|
|
192
203
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_get_swag.py"><img src="https://seleniumbase.github.io/cdn/gif/fast_swag_2.gif" alt="SeleniumBase Test" width="500" style="max-width: 100% !important; height: auto !important;" /></a>
|
|
193
204
|
|
|
@@ -195,7 +206,31 @@ class MyTestClass(BaseCase):
|
|
|
195
206
|
|
|
196
207
|
--------
|
|
197
208
|
|
|
198
|
-
<p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_coffee_cart.py" target="_blank">This
|
|
209
|
+
<p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_coffee_cart.py" target="_blank">This script</a> tests a different e-commerce site with <code>pytest</code>:</b></p>
|
|
210
|
+
|
|
211
|
+
```python
|
|
212
|
+
from seleniumbase import BaseCase
|
|
213
|
+
BaseCase.main(__name__, __file__)
|
|
214
|
+
|
|
215
|
+
class CoffeeCartTest(BaseCase):
|
|
216
|
+
def test_coffee_cart(self):
|
|
217
|
+
self.goto("https://seleniumbase.io/coffee/")
|
|
218
|
+
self.assert_title("Coffee Cart")
|
|
219
|
+
self.assert_element('button:contains("Total: $0.00")')
|
|
220
|
+
self.click('div[data-sb="Cappuccino"]')
|
|
221
|
+
self.assert_exact_text("cart (1)", 'a[aria-label="Cart page"]')
|
|
222
|
+
self.click('div[data-sb="Flat-White"]')
|
|
223
|
+
self.assert_exact_text("cart (2)", 'a[aria-label="Cart page"]')
|
|
224
|
+
self.click('div[data-sb="Cafe-Latte"]')
|
|
225
|
+
self.assert_exact_text("cart (3)", 'a[aria-label="Cart page"]')
|
|
226
|
+
self.click('a[aria-label="Cart page"]')
|
|
227
|
+
self.assert_exact_text("Total: $53.00", "button.pay")
|
|
228
|
+
self.click("button.pay")
|
|
229
|
+
self.type("input#name", "Selenium Coffee")
|
|
230
|
+
self.type("input#email", "test@test.test")
|
|
231
|
+
self.click("button#submit-payment")
|
|
232
|
+
self.assert_text("Thanks for your purchase.", "#app .success")
|
|
233
|
+
```
|
|
199
234
|
|
|
200
235
|
```zsh
|
|
201
236
|
pytest test_coffee_cart.py --demo
|
|
@@ -209,7 +244,7 @@ pytest test_coffee_cart.py --demo
|
|
|
209
244
|
|
|
210
245
|
<a id="multiple_examples"></a>
|
|
211
246
|
|
|
212
|
-
<p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_demo_site.py" target="_blank">This
|
|
247
|
+
<p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_demo_site.py" target="_blank">This script</a> covers multiple actions with <code>pytest</code>:</b></p>
|
|
213
248
|
|
|
214
249
|
```zsh
|
|
215
250
|
pytest test_demo_site.py
|
|
@@ -219,7 +254,7 @@ pytest test_demo_site.py
|
|
|
219
254
|
|
|
220
255
|
> Easy to type, click, select, toggle, drag & drop, and more.
|
|
221
256
|
|
|
222
|
-
📚 For more
|
|
257
|
+
📚 For more scripts, see the <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/ReadMe.md">SeleniumBase/examples/</a> folder.
|
|
223
258
|
|
|
224
259
|
--------
|
|
225
260
|
|
|
@@ -7,7 +7,7 @@ certifi>=2026.7.22
|
|
|
7
7
|
exceptiongroup>=1.3.1
|
|
8
8
|
websockets~=16.1.1;python_version=="3.10"
|
|
9
9
|
websockets>=16.1.1;python_version>="3.11"
|
|
10
|
-
filelock>=4.0
|
|
10
|
+
filelock>=4.1.0
|
|
11
11
|
fasteners>=0.20
|
|
12
12
|
mycdp>=1.4.0
|
|
13
13
|
pynose>=1.5.5
|
|
@@ -16,7 +16,7 @@ sbvirtualdisplay>=1.4.0
|
|
|
16
16
|
MarkupSafe>=3.0.4
|
|
17
17
|
Jinja2>=3.1.6
|
|
18
18
|
six>=1.17.0
|
|
19
|
-
parse>=1.22.
|
|
19
|
+
parse>=1.22.3
|
|
20
20
|
parse-type>=0.6.6
|
|
21
21
|
colorama>=0.4.6
|
|
22
22
|
psutil>=7.2.2
|
|
@@ -36,8 +36,9 @@ trio>=0.34.0,<1
|
|
|
36
36
|
trio-websocket~=0.12.2
|
|
37
37
|
wsproto~=1.3.2
|
|
38
38
|
websocket-client~=1.9.2
|
|
39
|
-
selenium==4.
|
|
40
|
-
cssselect
|
|
39
|
+
selenium==4.51.0
|
|
40
|
+
cssselect~=1.5.0;python_version<"3.11"
|
|
41
|
+
cssselect>=1.6.0,<2;python_version>="3.11"
|
|
41
42
|
sortedcontainers==2.4.0
|
|
42
43
|
execnet==2.1.2
|
|
43
44
|
iniconfig~=2.3.1
|
|
@@ -52,7 +53,8 @@ pytest-rerunfailures==16.7;python_version>="3.11"
|
|
|
52
53
|
pytest-xdist==3.8.0
|
|
53
54
|
parameterized==0.9.0
|
|
54
55
|
behave==1.2.6
|
|
55
|
-
soupsieve~=2.10.0
|
|
56
|
+
soupsieve~=2.10.0;python_version=="3.10"
|
|
57
|
+
soupsieve~=3.0.1;python_version>="3.11"
|
|
56
58
|
beautifulsoup4~=4.15.0
|
|
57
59
|
pyotp~=2.10.0
|
|
58
60
|
python-xlib==0.33;platform_system=="Linux"
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
# seleniumbase package
|
|
2
|
-
__version__ = "4.
|
|
2
|
+
__version__ = "4.56.0"
|