seleniumbase 4.48.4__tar.gz → 4.49.1__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.48.4/seleniumbase.egg-info → seleniumbase-4.49.1}/PKG-INFO +93 -43
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/README.md +78 -27
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/requirements.txt +10 -9
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/__version__.py +1 -1
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/fixtures/base_case.py +13 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/undetected/__init__.py +31 -2
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/undetected/cdp_driver/browser.py +23 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/undetected/cdp_driver/cdp_util.py +3 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/undetected/cdp_driver/config.py +51 -3
- {seleniumbase-4.48.4 → seleniumbase-4.49.1/seleniumbase.egg-info}/PKG-INFO +93 -43
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase.egg-info/requires.txt +12 -14
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/setup.py +32 -20
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/.gitignore +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/LICENSE +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/MANIFEST.in +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/install.sh +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/pyproject.toml +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/pytest.ini +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/sbase/__init__.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/sbase/__main__.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/sbase/steps.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/__init__.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/__main__.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/behave/__init__.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/behave/behave_helper.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/behave/behave_sb.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/behave/steps.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/common/__init__.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/common/decorators.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/common/encryption.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/common/exceptions.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/common/obfuscate.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/common/unobfuscate.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/config/__init__.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/config/ad_block_list.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/config/proxy_list.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/config/settings.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/console_scripts/__init__.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/console_scripts/logo_helper.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/console_scripts/rich_helper.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/console_scripts/run.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/console_scripts/sb_commander.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/console_scripts/sb_install.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/console_scripts/sb_objectify.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/console_scripts/sb_print.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/console_scripts/sb_recorder.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/__init__.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/application_manager.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/browser_launcher.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/capabilities_parser.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/colored_traceback.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/create_db_tables.sql +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/detect_b_ver.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/download_helper.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/encoded_images.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/jqc_helper.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/log_helper.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/mysql.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/nest_asyncio.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/proxy_helper.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/recorder_helper.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/report_helper.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/s3_manager.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/sb_cdp.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/sb_driver.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/session_helper.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/settings_parser.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/style_sheet.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/testcase_manager.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/tour_helper.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/core/visual_helper.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/drivers/__init__.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/drivers/atlas_drivers/__init__.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/drivers/brave_drivers/__init__.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/drivers/cft_drivers/__init__.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/drivers/chromium_drivers/__init__.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/drivers/chs_drivers/__init__.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/drivers/comet_drivers/__init__.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/drivers/opera_drivers/__init__.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/extensions/__init__.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/extensions/ad_block.zip +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/extensions/disable_csp.zip +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/extensions/recorder.zip +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/extensions/sbase_ext.zip +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/fixtures/__init__.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/fixtures/constants.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/fixtures/css_to_xpath.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/fixtures/errors.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/fixtures/js_utils.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/fixtures/page_actions.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/fixtures/page_utils.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/fixtures/shared_utils.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/fixtures/unittest_helper.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/fixtures/words.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/fixtures/xpath_to_css.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/js_code/__init__.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/js_code/active_css_js.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/js_code/live_js.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/js_code/recorder_js.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/masterqa/__init__.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/masterqa/master_qa.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/plugins/__init__.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/plugins/base_plugin.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/plugins/basic_test_info.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/plugins/driver_manager.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/plugins/page_source.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/plugins/pytest_plugin.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/plugins/sb_manager.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/plugins/screen_shots.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/plugins/selenium_plugin.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/resources/__init__.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/translate/__init__.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/translate/chinese.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/translate/dutch.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/translate/french.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/translate/italian.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/translate/japanese.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/translate/korean.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/translate/master_dict.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/translate/portuguese.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/translate/russian.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/translate/spanish.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/translate/translator.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/undetected/cdp.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/undetected/cdp_driver/__init__.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/undetected/cdp_driver/connection.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/undetected/cdp_driver/element.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/undetected/cdp_driver/tab.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/undetected/dprocess.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/undetected/options.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/undetected/patcher.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/undetected/reactor.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/undetected/webelement.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/utilities/__init__.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_grid/font_color +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase.egg-info/SOURCES.txt +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase.egg-info/dependency_links.txt +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase.egg-info/entry_points.txt +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/seleniumbase.egg-info/top_level.txt +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/setup.cfg +0 -0
- {seleniumbase-4.48.4 → seleniumbase-4.49.1}/virtualenv_install.sh +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: seleniumbase
|
|
3
|
-
Version: 4.
|
|
4
|
-
Summary: A
|
|
3
|
+
Version: 4.49.1
|
|
4
|
+
Summary: A framework for stealthy Chromium automation with CDP Mode. Includes CAPTCHA-bypass, E2E Testing, and a Playwright integration.
|
|
5
5
|
Home-page: https://github.com/seleniumbase/SeleniumBase
|
|
6
6
|
Author: Michael Mintz
|
|
7
7
|
Author-email: mdmintz@gmail.com
|
|
@@ -16,7 +16,7 @@ Project-URL: PyPI, https://pypi.org/project/seleniumbase/
|
|
|
16
16
|
Project-URL: Source, https://github.com/seleniumbase/SeleniumBase
|
|
17
17
|
Project-URL: Repository, https://github.com/seleniumbase/SeleniumBase
|
|
18
18
|
Project-URL: Documentation, https://seleniumbase.io/
|
|
19
|
-
Keywords: pytest,selenium,framework,automation,browser,testing,webdriver,seleniumbase,sbase,crawling,scraping
|
|
19
|
+
Keywords: pytest,selenium,framework,automation,browser,testing,webdriver,seleniumbase,sbase,web-crawling,web-scraping,stealth,chromium,playwright,undetected,bot-detection,fingerprint,recaptcha,cloudflare,turnstile,datadome,captcha,headless
|
|
20
20
|
Platform: Windows
|
|
21
21
|
Platform: Linux
|
|
22
22
|
Platform: Mac OS-X
|
|
@@ -59,7 +59,7 @@ Requires-Python: >=3.9
|
|
|
59
59
|
Description-Content-Type: text/markdown
|
|
60
60
|
License-File: LICENSE
|
|
61
61
|
Requires-Dist: pip>=26.0.1; python_version < "3.10"
|
|
62
|
-
Requires-Dist: pip>=26.1; python_version >= "3.10"
|
|
62
|
+
Requires-Dist: pip>=26.1.1; python_version >= "3.10"
|
|
63
63
|
Requires-Dist: packaging>=26.2
|
|
64
64
|
Requires-Dist: setuptools~=70.2; python_version < "3.10"
|
|
65
65
|
Requires-Dist: setuptools>=82.0.1; python_version >= "3.10"
|
|
@@ -81,20 +81,21 @@ Requires-Dist: sbvirtualdisplay>=1.4.0
|
|
|
81
81
|
Requires-Dist: MarkupSafe>=3.0.3
|
|
82
82
|
Requires-Dist: Jinja2>=3.1.6
|
|
83
83
|
Requires-Dist: six>=1.17.0
|
|
84
|
-
Requires-Dist: parse>=1.
|
|
84
|
+
Requires-Dist: parse>=1.22.0
|
|
85
85
|
Requires-Dist: parse-type>=0.6.6
|
|
86
86
|
Requires-Dist: colorama>=0.4.6
|
|
87
|
+
Requires-Dist: psutil>=7.2.2
|
|
87
88
|
Requires-Dist: pyyaml>=6.0.3
|
|
88
89
|
Requires-Dist: pygments>=2.20.0
|
|
89
90
|
Requires-Dist: pyreadline3>=3.5.4; platform_system == "Windows"
|
|
90
91
|
Requires-Dist: tabcompleter>=1.4.1
|
|
91
92
|
Requires-Dist: pdbp>=1.8.2
|
|
92
|
-
Requires-Dist: idna>=3.
|
|
93
|
+
Requires-Dist: idna>=3.15
|
|
93
94
|
Requires-Dist: charset-normalizer<4,>=3.4.7
|
|
94
95
|
Requires-Dist: urllib3<2,>=1.26.20; python_version < "3.10"
|
|
95
|
-
Requires-Dist: urllib3<3,>=
|
|
96
|
+
Requires-Dist: urllib3<3,>=2.7.0; python_version >= "3.10"
|
|
96
97
|
Requires-Dist: requests~=2.32.5; python_version < "3.10"
|
|
97
|
-
Requires-Dist: requests~=2.
|
|
98
|
+
Requires-Dist: requests~=2.34.2; python_version >= "3.10"
|
|
98
99
|
Requires-Dist: sniffio==1.3.1
|
|
99
100
|
Requires-Dist: h11==0.16.0
|
|
100
101
|
Requires-Dist: outcome==1.3.0.post0
|
|
@@ -105,7 +106,7 @@ Requires-Dist: wsproto==1.2.0; python_version < "3.10"
|
|
|
105
106
|
Requires-Dist: wsproto~=1.3.2; python_version >= "3.10"
|
|
106
107
|
Requires-Dist: websocket-client~=1.9.0
|
|
107
108
|
Requires-Dist: selenium==4.32.0; python_version < "3.10"
|
|
108
|
-
Requires-Dist: selenium==4.
|
|
109
|
+
Requires-Dist: selenium==4.44.0; python_version >= "3.10"
|
|
109
110
|
Requires-Dist: cssselect==1.3.0; python_version < "3.10"
|
|
110
111
|
Requires-Dist: cssselect<2,>=1.4.0; python_version >= "3.10"
|
|
111
112
|
Requires-Dist: sortedcontainers==2.4.0
|
|
@@ -120,7 +121,7 @@ Requires-Dist: pytest-html==4.0.2
|
|
|
120
121
|
Requires-Dist: pytest-metadata==3.1.1
|
|
121
122
|
Requires-Dist: pytest-ordering==0.6
|
|
122
123
|
Requires-Dist: pytest-rerunfailures==16.0.1; python_version < "3.10"
|
|
123
|
-
Requires-Dist: pytest-rerunfailures==16.
|
|
124
|
+
Requires-Dist: pytest-rerunfailures==16.2; python_version >= "3.10"
|
|
124
125
|
Requires-Dist: pytest-xdist==3.8.0
|
|
125
126
|
Requires-Dist: parameterized==0.9.0
|
|
126
127
|
Requires-Dist: behave==1.2.6
|
|
@@ -130,7 +131,7 @@ Requires-Dist: pyotp==2.9.0
|
|
|
130
131
|
Requires-Dist: python-xlib==0.33; platform_system == "Linux"
|
|
131
132
|
Requires-Dist: PyAutoGUI>=0.9.54; platform_system == "Linux"
|
|
132
133
|
Requires-Dist: markdown-it-py==3.0.0; python_version < "3.10"
|
|
133
|
-
Requires-Dist: markdown-it-py==4.
|
|
134
|
+
Requires-Dist: markdown-it-py==4.2.0; python_version >= "3.10"
|
|
134
135
|
Requires-Dist: mdurl==0.1.2
|
|
135
136
|
Requires-Dist: rich<16,>=15.0.0
|
|
136
137
|
Provides-Extra: allure
|
|
@@ -139,7 +140,7 @@ Requires-Dist: allure-python-commons>=2.13.5; extra == "allure"
|
|
|
139
140
|
Requires-Dist: allure-behave>=2.13.5; extra == "allure"
|
|
140
141
|
Provides-Extra: coverage
|
|
141
142
|
Requires-Dist: coverage>=7.10.7; python_version < "3.10" and extra == "coverage"
|
|
142
|
-
Requires-Dist: coverage>=7.
|
|
143
|
+
Requires-Dist: coverage>=7.14.0; python_version >= "3.10" and extra == "coverage"
|
|
143
144
|
Requires-Dist: pytest-cov>=7.1.0; extra == "coverage"
|
|
144
145
|
Provides-Extra: flake8
|
|
145
146
|
Requires-Dist: flake8==7.3.0; extra == "flake8"
|
|
@@ -154,7 +155,7 @@ Requires-Dist: mss==10.2.0; extra == "mss"
|
|
|
154
155
|
Provides-Extra: pdfminer
|
|
155
156
|
Requires-Dist: pdfminer.six==20251107; python_version < "3.10" and extra == "pdfminer"
|
|
156
157
|
Requires-Dist: pdfminer.six==20260107; python_version >= "3.10" and extra == "pdfminer"
|
|
157
|
-
Requires-Dist: cryptography==
|
|
158
|
+
Requires-Dist: cryptography==48.0.0; extra == "pdfminer"
|
|
158
159
|
Requires-Dist: cffi==2.0.0; extra == "pdfminer"
|
|
159
160
|
Requires-Dist: pycparser==2.23; python_version < "3.10" and extra == "pdfminer"
|
|
160
161
|
Requires-Dist: pycparser==3.0; python_version >= "3.10" and extra == "pdfminer"
|
|
@@ -166,9 +167,7 @@ Requires-Dist: pip-system-certs==4.0; platform_system == "Windows" and extra ==
|
|
|
166
167
|
Provides-Extra: proxy
|
|
167
168
|
Requires-Dist: proxy.py==2.4.3; extra == "proxy"
|
|
168
169
|
Provides-Extra: playwright
|
|
169
|
-
Requires-Dist: playwright>=1.
|
|
170
|
-
Provides-Extra: psutil
|
|
171
|
-
Requires-Dist: psutil>=7.2.2; extra == "psutil"
|
|
170
|
+
Requires-Dist: playwright>=1.60.0; extra == "playwright"
|
|
172
171
|
Provides-Extra: pyautogui
|
|
173
172
|
Requires-Dist: PyAutoGUI>=0.9.54; platform_system != "Linux" and extra == "pyautogui"
|
|
174
173
|
Provides-Extra: selenium-stealth
|
|
@@ -208,34 +207,32 @@ Dynamic: summary
|
|
|
208
207
|
<meta property="og:image" content="https://seleniumbase.github.io/cdn/img/mac_sb_logo_5b.png" />
|
|
209
208
|
<link rel="icon" href="https://seleniumbase.github.io/img/logo7.png" />
|
|
210
209
|
|
|
211
|
-
<h1>SeleniumBase</h1>
|
|
212
|
-
|
|
213
210
|
<p align="center"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/nice_logo_8t.png" alt="SeleniumBase" width="424" /></a></p>
|
|
214
211
|
|
|
215
|
-
<p align="center"
|
|
216
|
-
|
|
217
|
-
<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" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/actions" target="_blank"><img src="https://github.com/seleniumbase/SeleniumBase/workflows/CI%20build/badge.svg" alt="SeleniumBase GitHub Actions" /></a> <a href="https://seleniumbase.io"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg" alt="SeleniumBase Docs" /></a> <a href="https://pepy.tech/projects/seleniumbase?timeRange=threeMonths&category=version&includeCIDownloads=true&granularity=daily&viewType=line&versions=*" target="_blank"><img src="https://static.pepy.tech/badge/seleniumbase" alt="SeleniumBase PyPI downloads" /></a> <a href="https://discord.gg/EdhQTn3EyE" target="_blank"><img src="https://img.shields.io/discord/727927627830001734?color=7289DA&label=Discord&logo=discord&logoColor=white"/></a></p>
|
|
212
|
+
<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" /></a> <a href="https://pepy.tech/projects/seleniumbase?timeRange=threeMonths&category=version&includeCIDownloads=true&granularity=daily&viewType=line&versions=*" target="_blank"><img src="https://static.pepy.tech/badge/seleniumbase" alt="SeleniumBase PyPI downloads" /></a> <a href="https://discord.gg/EdhQTn3EyE" target="_blank"><img src="https://img.shields.io/discord/727927627830001734?color=7289DA&label=Discord&logo=discord&logoColor=white"/></a><br /> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/LICENSE"><img src="https://img.shields.io/badge/license-MIT-22BBCC.svg" title="SeleniumBase" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/actions" target="_blank"><img src="https://github.com/seleniumbase/SeleniumBase/workflows/CI%20build/badge.svg" alt="SeleniumBase GitHub Actions" /></a> <a href="https://seleniumbase.io"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg" alt="SeleniumBase Docs" /></a></p>
|
|
218
213
|
<p align="center"></p>
|
|
219
214
|
|
|
215
|
+
<h3 align="center">Stealthy Chromium Automation and E2E Testing.</h3>
|
|
216
|
+
|
|
220
217
|
<p align="center">
|
|
221
218
|
<a href="#python_installation">🚀 Start</a> |
|
|
222
219
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/features_list.md">🏰 Features</a> |
|
|
223
220
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/customizing_test_runs.md">🎛️ Options</a> |
|
|
224
221
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/ReadMe.md">📚 Examples</a> |
|
|
225
|
-
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/console_scripts/ReadMe.md"
|
|
226
|
-
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/
|
|
222
|
+
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/console_scripts/ReadMe.md">💻 Scripts</a> |
|
|
223
|
+
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/locale_codes.md">🗾 Locale</a>
|
|
227
224
|
<br />
|
|
228
|
-
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/method_summary.md"
|
|
229
|
-
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/
|
|
225
|
+
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/method_summary.md">📗 API</a> |
|
|
226
|
+
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/cdp_mode_methods.md">📘 Stealth API</a> |
|
|
227
|
+
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/syntax_formats.md"> 🔠 DesignPatterns</a> |
|
|
230
228
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/recorder_mode.md">🔴 Recorder</a> |
|
|
231
|
-
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/example_logs/ReadMe.md">📊 Dashboard</a>
|
|
232
|
-
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/locale_codes.md">🗾 Locale</a>
|
|
229
|
+
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/example_logs/ReadMe.md">📊 Dashboard</a>
|
|
233
230
|
<br />
|
|
234
231
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/commander.md">🎖️ GUI</a> |
|
|
235
232
|
<a href="https://seleniumbase.io/demo_page">📰 TestPage</a> |
|
|
236
233
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/uc_mode.md">👤 UC Mode</a> |
|
|
237
234
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md">🐙 CDP Mode</a> |
|
|
238
|
-
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/chart_maker/ReadMe.md">📶 Charts</a>
|
|
235
|
+
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/chart_maker/ReadMe.md">📶 Charts</a> |
|
|
239
236
|
<a href="https://seleniumbase.io/devices/?url=seleniumbase.com">🖥️ Farm</a>
|
|
240
237
|
<br />
|
|
241
238
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/how_it_works.md">👁️ How</a> |
|
|
@@ -245,7 +242,7 @@ Dynamic: summary
|
|
|
245
242
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/tour_examples/ReadMe.md">🚎 Tours</a>
|
|
246
243
|
<br />
|
|
247
244
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/integrations/github/workflows/ReadMe.md">🤖 CI/CD</a> |
|
|
248
|
-
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/js_package_manager.md"
|
|
245
|
+
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/js_package_manager.md">🟨 JSMgr</a> |
|
|
249
246
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/translations.md">🌏 Translator</a> |
|
|
250
247
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/presenter/ReadMe.md">🎞️ Presenter</a> |
|
|
251
248
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/visual_testing/ReadMe.md">🖼️ Visual</a> |
|
|
@@ -253,25 +250,80 @@ Dynamic: summary
|
|
|
253
250
|
<br />
|
|
254
251
|
</p>
|
|
255
252
|
|
|
256
|
-
|
|
253
|
+
🐙 <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md"><b>CDP Mode</b></a> bypasses bot-detection and handles CAPTCHAs by driving the browser directly through the <a href="https://chromedevtools.github.io/devtools-protocol/" translate="no">Chrome DevTools Protocol</a>. Includes <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>, which extends these advanced anti-detection patches to Playwright scripts.
|
|
257
254
|
|
|
258
|
-
|
|
255
|
+
📚 The [SeleniumBase/examples/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples) folder includes over 100 ready-to-run examples of E2E testing. Examples that start with `test_` or end with `_test.py`/`_tests.py` are specifically designed to run with `pytest`. Other examples run directly with raw `python` (those files generally start with `raw_` to avoid confusion).
|
|
259
256
|
|
|
260
|
-
|
|
257
|
+
🥷 Stealthy CDP Mode examples are located in [./examples/cdp_mode/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples/cdp_mode).
|
|
261
258
|
|
|
262
|
-
|
|
259
|
+
🎭 Stealthy Playwright examples are located in [./examples/cdp_mode/playwright/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/).
|
|
263
260
|
|
|
264
261
|
--------
|
|
265
262
|
|
|
266
263
|
<h3 align="left">⚙️ Stealthy architecture flowchart:</h3>
|
|
267
264
|
|
|
268
|
-
<img src="https://seleniumbase.github.io/other/
|
|
265
|
+
<img src="https://seleniumbase.github.io/other/sb_architecture.png" width="596" alt="Stealthy architecture flowchart" />
|
|
269
266
|
|
|
270
267
|
(For maximum stealth, use <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md">CDP Mode</a>, which includes <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/ReadMe.md">Stealthy Playwright Mode</a>)
|
|
271
268
|
|
|
272
269
|
--------
|
|
273
270
|
|
|
274
|
-
<p align="left"
|
|
271
|
+
<p align="left">📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_browserscan.py" target="_blank">This example</a> verifies that <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md#-pure-cdp-mode-sb_cdp">Pure CDP Mode</a> is stealthy on <a href="https://www.browserscan.net/bot-detection">BrowserScan</a>:
|
|
272
|
+
|
|
273
|
+
```python
|
|
274
|
+
from seleniumbase import sb_cdp
|
|
275
|
+
|
|
276
|
+
url = "https://www.browserscan.net/bot-detection"
|
|
277
|
+
sb = sb_cdp.Chrome(url, locale="en", ad_block=True)
|
|
278
|
+
sb.flash("Test Results", duration=3, pause=1)
|
|
279
|
+
sb.assert_element('strong:contains("Normal")')
|
|
280
|
+
print("Bot Not Detected")
|
|
281
|
+
sb.flash('strong:contains("Normal")', duration=3, pause=2)
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
<img src="https://seleniumbase.github.io/other/b_scan_results.jpg" width="628" alt="Stealthy architecture flowchart" />
|
|
285
|
+
|
|
286
|
+
📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/raw_browserscan_sync.py">This example</a> demonstrates the drop-in patch that makes Playwright stealthy:
|
|
287
|
+
|
|
288
|
+
```python
|
|
289
|
+
from playwright.sync_api import sync_playwright
|
|
290
|
+
from seleniumbase import sb_cdp
|
|
291
|
+
|
|
292
|
+
sb = sb_cdp.Chrome(locale="en", ad_block=True)
|
|
293
|
+
endpoint_url = sb.get_endpoint_url()
|
|
294
|
+
|
|
295
|
+
with sync_playwright() as p:
|
|
296
|
+
browser = p.chromium.connect_over_cdp(endpoint_url)
|
|
297
|
+
page = browser.contexts[0].pages[0]
|
|
298
|
+
page.goto("https://www.browserscan.net/bot-detection")
|
|
299
|
+
page.wait_for_timeout(500)
|
|
300
|
+
sb.flash("Test Results", duration=3, pause=1)
|
|
301
|
+
sb.assert_element('strong:contains("Normal")')
|
|
302
|
+
sb.flash('strong:contains("Normal")', duration=3, pause=2)
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
--------
|
|
306
|
+
|
|
307
|
+
💡 You can set which Chromium browser to use via command-line options:
|
|
308
|
+
|
|
309
|
+
```zsh
|
|
310
|
+
python SCRIPT.py --use-chromium # Use the unbranded Chromium browser
|
|
311
|
+
python SCRIPT.py --cft # Use Chrome-for-testing
|
|
312
|
+
python SCRIPT.py --edge # Use Microsoft Edge
|
|
313
|
+
python SCRIPT.py --brave # Use Brave browser
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
Google Chrome is the default browser if not specified. Only unbranded Chromium and Chrome-for-Testing are installed automatically if not already installed.
|
|
317
|
+
|
|
318
|
+
You can also set the browser via method args, eg: `cft=True`, `use_chromium=True`, `browser="edge"`, `browser="brave"`, etc. Eg:
|
|
319
|
+
|
|
320
|
+
```python
|
|
321
|
+
sb = sb_cdp.Chrome(url, use_chromium=True)
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
--------
|
|
325
|
+
|
|
326
|
+
<p align="left">📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_yc_news.py" target="_blank">This example</a> scrapes Hacker News listings with <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md#-pure-cdp-mode-sb_cdp">Pure CDP Mode</a>:
|
|
275
327
|
|
|
276
328
|
```python
|
|
277
329
|
from seleniumbase import sb_cdp
|
|
@@ -281,12 +333,11 @@ sb = sb_cdp.Chrome(url)
|
|
|
281
333
|
elements = sb.find_elements("span.titleline > a")
|
|
282
334
|
for element in elements:
|
|
283
335
|
print("* " + element.text)
|
|
284
|
-
sb.driver.stop()
|
|
285
336
|
```
|
|
286
337
|
|
|
287
338
|
--------
|
|
288
339
|
|
|
289
|
-
<p align="left"
|
|
340
|
+
<p align="left">📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_google.py" target="_blank">This example</a> saves Google Search results with UC + CDP Mode:<br />(Results are saved as PDF, HTML, and PNG files)</p>
|
|
290
341
|
|
|
291
342
|
```python
|
|
292
343
|
from seleniumbase import SB
|
|
@@ -307,7 +358,7 @@ with SB(uc=True, test=True) as sb:
|
|
|
307
358
|
|
|
308
359
|
--------
|
|
309
360
|
|
|
310
|
-
<p align="left"
|
|
361
|
+
<p align="left">📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_gitlab.py" target="_blank">This example</a> bypasses Cloudflare's challenge page with UC + CDP Mode:
|
|
311
362
|
|
|
312
363
|
```python
|
|
313
364
|
from seleniumbase import SB
|
|
@@ -329,7 +380,7 @@ with SB(uc=True, test=True, locale="en") as sb:
|
|
|
329
380
|
|
|
330
381
|
----
|
|
331
382
|
|
|
332
|
-
<p align="left"
|
|
383
|
+
<p align="left">📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_gitlab.py" target="_blank">This example</a> handles a CAPTCHA page with Pure CDP Mode:
|
|
333
384
|
|
|
334
385
|
```python
|
|
335
386
|
from seleniumbase import sb_cdp
|
|
@@ -340,12 +391,11 @@ sb.sleep(2)
|
|
|
340
391
|
sb.solve_captcha()
|
|
341
392
|
sb.highlight('h1:contains("GitLab")')
|
|
342
393
|
sb.highlight('button:contains("Sign in")')
|
|
343
|
-
sb.driver.stop()
|
|
344
394
|
```
|
|
345
395
|
|
|
346
396
|
--------
|
|
347
397
|
|
|
348
|
-
<p align="left"
|
|
398
|
+
<p align="left">📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_get_swag.py" target="_blank">This example</a> tests an e-commerce site with <code>pytest</code>:
|
|
349
399
|
|
|
350
400
|
```python
|
|
351
401
|
from seleniumbase import BaseCase
|
|
@@ -375,7 +425,7 @@ class MyTestClass(BaseCase):
|
|
|
375
425
|
|
|
376
426
|
--------
|
|
377
427
|
|
|
378
|
-
<p align="left"
|
|
428
|
+
<p align="left">📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_coffee_cart.py" target="_blank">This example</a> tests another e-commerce site with <code>pytest</code>:
|
|
379
429
|
|
|
380
430
|
```zsh
|
|
381
431
|
pytest test_coffee_cart.py --demo
|
|
@@ -389,7 +439,7 @@ pytest test_coffee_cart.py --demo
|
|
|
389
439
|
|
|
390
440
|
<a id="multiple_examples"></a>
|
|
391
441
|
|
|
392
|
-
<p align="left"
|
|
442
|
+
<p align="left">📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_demo_site.py" target="_blank">This example</a> covers multiple actions with <code>pytest</code>:
|
|
393
443
|
|
|
394
444
|
```zsh
|
|
395
445
|
pytest test_demo_site.py
|
|
@@ -7,34 +7,32 @@
|
|
|
7
7
|
<meta property="og:image" content="https://seleniumbase.github.io/cdn/img/mac_sb_logo_5b.png" />
|
|
8
8
|
<link rel="icon" href="https://seleniumbase.github.io/img/logo7.png" />
|
|
9
9
|
|
|
10
|
-
<h1>SeleniumBase</h1>
|
|
11
|
-
|
|
12
10
|
<p align="center"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/nice_logo_8t.png" alt="SeleniumBase" width="424" /></a></p>
|
|
13
11
|
|
|
14
|
-
<p align="center"
|
|
15
|
-
|
|
16
|
-
<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" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/actions" target="_blank"><img src="https://github.com/seleniumbase/SeleniumBase/workflows/CI%20build/badge.svg" alt="SeleniumBase GitHub Actions" /></a> <a href="https://seleniumbase.io"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg" alt="SeleniumBase Docs" /></a> <a href="https://pepy.tech/projects/seleniumbase?timeRange=threeMonths&category=version&includeCIDownloads=true&granularity=daily&viewType=line&versions=*" target="_blank"><img src="https://static.pepy.tech/badge/seleniumbase" alt="SeleniumBase PyPI downloads" /></a> <a href="https://discord.gg/EdhQTn3EyE" target="_blank"><img src="https://img.shields.io/discord/727927627830001734?color=7289DA&label=Discord&logo=discord&logoColor=white"/></a></p>
|
|
12
|
+
<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" /></a> <a href="https://pepy.tech/projects/seleniumbase?timeRange=threeMonths&category=version&includeCIDownloads=true&granularity=daily&viewType=line&versions=*" target="_blank"><img src="https://static.pepy.tech/badge/seleniumbase" alt="SeleniumBase PyPI downloads" /></a> <a href="https://discord.gg/EdhQTn3EyE" target="_blank"><img src="https://img.shields.io/discord/727927627830001734?color=7289DA&label=Discord&logo=discord&logoColor=white"/></a><br /> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/LICENSE"><img src="https://img.shields.io/badge/license-MIT-22BBCC.svg" title="SeleniumBase" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/actions" target="_blank"><img src="https://github.com/seleniumbase/SeleniumBase/workflows/CI%20build/badge.svg" alt="SeleniumBase GitHub Actions" /></a> <a href="https://seleniumbase.io"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg" alt="SeleniumBase Docs" /></a></p>
|
|
17
13
|
<p align="center"></p>
|
|
18
14
|
|
|
15
|
+
<h3 align="center">Stealthy Chromium Automation and E2E Testing.</h3>
|
|
16
|
+
|
|
19
17
|
<p align="center">
|
|
20
18
|
<a href="#python_installation">🚀 Start</a> |
|
|
21
19
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/features_list.md">🏰 Features</a> |
|
|
22
20
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/customizing_test_runs.md">🎛️ Options</a> |
|
|
23
21
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/ReadMe.md">📚 Examples</a> |
|
|
24
|
-
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/console_scripts/ReadMe.md"
|
|
25
|
-
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/
|
|
22
|
+
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/console_scripts/ReadMe.md">💻 Scripts</a> |
|
|
23
|
+
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/locale_codes.md">🗾 Locale</a>
|
|
26
24
|
<br />
|
|
27
|
-
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/method_summary.md"
|
|
28
|
-
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/
|
|
25
|
+
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/method_summary.md">📗 API</a> |
|
|
26
|
+
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/cdp_mode_methods.md">📘 Stealth API</a> |
|
|
27
|
+
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/syntax_formats.md"> 🔠 DesignPatterns</a> |
|
|
29
28
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/recorder_mode.md">🔴 Recorder</a> |
|
|
30
|
-
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/example_logs/ReadMe.md">📊 Dashboard</a>
|
|
31
|
-
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/locale_codes.md">🗾 Locale</a>
|
|
29
|
+
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/example_logs/ReadMe.md">📊 Dashboard</a>
|
|
32
30
|
<br />
|
|
33
31
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/commander.md">🎖️ GUI</a> |
|
|
34
32
|
<a href="https://seleniumbase.io/demo_page">📰 TestPage</a> |
|
|
35
33
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/uc_mode.md">👤 UC Mode</a> |
|
|
36
34
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md">🐙 CDP Mode</a> |
|
|
37
|
-
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/chart_maker/ReadMe.md">📶 Charts</a>
|
|
35
|
+
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/chart_maker/ReadMe.md">📶 Charts</a> |
|
|
38
36
|
<a href="https://seleniumbase.io/devices/?url=seleniumbase.com">🖥️ Farm</a>
|
|
39
37
|
<br />
|
|
40
38
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/how_it_works.md">👁️ How</a> |
|
|
@@ -44,7 +42,7 @@
|
|
|
44
42
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/tour_examples/ReadMe.md">🚎 Tours</a>
|
|
45
43
|
<br />
|
|
46
44
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/integrations/github/workflows/ReadMe.md">🤖 CI/CD</a> |
|
|
47
|
-
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/js_package_manager.md"
|
|
45
|
+
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/js_package_manager.md">🟨 JSMgr</a> |
|
|
48
46
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/translations.md">🌏 Translator</a> |
|
|
49
47
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/presenter/ReadMe.md">🎞️ Presenter</a> |
|
|
50
48
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/visual_testing/ReadMe.md">🖼️ Visual</a> |
|
|
@@ -52,25 +50,80 @@
|
|
|
52
50
|
<br />
|
|
53
51
|
</p>
|
|
54
52
|
|
|
55
|
-
|
|
53
|
+
🐙 <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md"><b>CDP Mode</b></a> bypasses bot-detection and handles CAPTCHAs by driving the browser directly through the <a href="https://chromedevtools.github.io/devtools-protocol/" translate="no">Chrome DevTools Protocol</a>. Includes <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>, which extends these advanced anti-detection patches to Playwright scripts.
|
|
56
54
|
|
|
57
|
-
|
|
55
|
+
📚 The [SeleniumBase/examples/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples) folder includes over 100 ready-to-run examples of E2E testing. Examples that start with `test_` or end with `_test.py`/`_tests.py` are specifically designed to run with `pytest`. Other examples run directly with raw `python` (those files generally start with `raw_` to avoid confusion).
|
|
58
56
|
|
|
59
|
-
|
|
57
|
+
🥷 Stealthy CDP Mode examples are located in [./examples/cdp_mode/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples/cdp_mode).
|
|
60
58
|
|
|
61
|
-
|
|
59
|
+
🎭 Stealthy Playwright examples are located in [./examples/cdp_mode/playwright/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/).
|
|
62
60
|
|
|
63
61
|
--------
|
|
64
62
|
|
|
65
63
|
<h3 align="left">⚙️ Stealthy architecture flowchart:</h3>
|
|
66
64
|
|
|
67
|
-
<img src="https://seleniumbase.github.io/other/
|
|
65
|
+
<img src="https://seleniumbase.github.io/other/sb_architecture.png" width="596" alt="Stealthy architecture flowchart" />
|
|
68
66
|
|
|
69
67
|
(For maximum stealth, use <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md">CDP Mode</a>, which includes <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/ReadMe.md">Stealthy Playwright Mode</a>)
|
|
70
68
|
|
|
71
69
|
--------
|
|
72
70
|
|
|
73
|
-
<p align="left"
|
|
71
|
+
<p align="left">📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_browserscan.py" target="_blank">This example</a> verifies that <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md#-pure-cdp-mode-sb_cdp">Pure CDP Mode</a> is stealthy on <a href="https://www.browserscan.net/bot-detection">BrowserScan</a>:
|
|
72
|
+
|
|
73
|
+
```python
|
|
74
|
+
from seleniumbase import sb_cdp
|
|
75
|
+
|
|
76
|
+
url = "https://www.browserscan.net/bot-detection"
|
|
77
|
+
sb = sb_cdp.Chrome(url, locale="en", ad_block=True)
|
|
78
|
+
sb.flash("Test Results", duration=3, pause=1)
|
|
79
|
+
sb.assert_element('strong:contains("Normal")')
|
|
80
|
+
print("Bot Not Detected")
|
|
81
|
+
sb.flash('strong:contains("Normal")', duration=3, pause=2)
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
<img src="https://seleniumbase.github.io/other/b_scan_results.jpg" width="628" alt="Stealthy architecture flowchart" />
|
|
85
|
+
|
|
86
|
+
📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/raw_browserscan_sync.py">This example</a> demonstrates the drop-in patch that makes Playwright stealthy:
|
|
87
|
+
|
|
88
|
+
```python
|
|
89
|
+
from playwright.sync_api import sync_playwright
|
|
90
|
+
from seleniumbase import sb_cdp
|
|
91
|
+
|
|
92
|
+
sb = sb_cdp.Chrome(locale="en", ad_block=True)
|
|
93
|
+
endpoint_url = sb.get_endpoint_url()
|
|
94
|
+
|
|
95
|
+
with sync_playwright() as p:
|
|
96
|
+
browser = p.chromium.connect_over_cdp(endpoint_url)
|
|
97
|
+
page = browser.contexts[0].pages[0]
|
|
98
|
+
page.goto("https://www.browserscan.net/bot-detection")
|
|
99
|
+
page.wait_for_timeout(500)
|
|
100
|
+
sb.flash("Test Results", duration=3, pause=1)
|
|
101
|
+
sb.assert_element('strong:contains("Normal")')
|
|
102
|
+
sb.flash('strong:contains("Normal")', duration=3, pause=2)
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
--------
|
|
106
|
+
|
|
107
|
+
💡 You can set which Chromium browser to use via command-line options:
|
|
108
|
+
|
|
109
|
+
```zsh
|
|
110
|
+
python SCRIPT.py --use-chromium # Use the unbranded Chromium browser
|
|
111
|
+
python SCRIPT.py --cft # Use Chrome-for-testing
|
|
112
|
+
python SCRIPT.py --edge # Use Microsoft Edge
|
|
113
|
+
python SCRIPT.py --brave # Use Brave browser
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Google Chrome is the default browser if not specified. Only unbranded Chromium and Chrome-for-Testing are installed automatically if not already installed.
|
|
117
|
+
|
|
118
|
+
You can also set the browser via method args, eg: `cft=True`, `use_chromium=True`, `browser="edge"`, `browser="brave"`, etc. Eg:
|
|
119
|
+
|
|
120
|
+
```python
|
|
121
|
+
sb = sb_cdp.Chrome(url, use_chromium=True)
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
--------
|
|
125
|
+
|
|
126
|
+
<p align="left">📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_yc_news.py" target="_blank">This example</a> scrapes Hacker News listings with <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md#-pure-cdp-mode-sb_cdp">Pure CDP Mode</a>:
|
|
74
127
|
|
|
75
128
|
```python
|
|
76
129
|
from seleniumbase import sb_cdp
|
|
@@ -80,12 +133,11 @@ sb = sb_cdp.Chrome(url)
|
|
|
80
133
|
elements = sb.find_elements("span.titleline > a")
|
|
81
134
|
for element in elements:
|
|
82
135
|
print("* " + element.text)
|
|
83
|
-
sb.driver.stop()
|
|
84
136
|
```
|
|
85
137
|
|
|
86
138
|
--------
|
|
87
139
|
|
|
88
|
-
<p align="left"
|
|
140
|
+
<p align="left">📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_google.py" target="_blank">This example</a> saves Google Search results with UC + CDP Mode:<br />(Results are saved as PDF, HTML, and PNG files)</p>
|
|
89
141
|
|
|
90
142
|
```python
|
|
91
143
|
from seleniumbase import SB
|
|
@@ -106,7 +158,7 @@ with SB(uc=True, test=True) as sb:
|
|
|
106
158
|
|
|
107
159
|
--------
|
|
108
160
|
|
|
109
|
-
<p align="left"
|
|
161
|
+
<p align="left">📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_gitlab.py" target="_blank">This example</a> bypasses Cloudflare's challenge page with UC + CDP Mode:
|
|
110
162
|
|
|
111
163
|
```python
|
|
112
164
|
from seleniumbase import SB
|
|
@@ -128,7 +180,7 @@ with SB(uc=True, test=True, locale="en") as sb:
|
|
|
128
180
|
|
|
129
181
|
----
|
|
130
182
|
|
|
131
|
-
<p align="left"
|
|
183
|
+
<p align="left">📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_gitlab.py" target="_blank">This example</a> handles a CAPTCHA page with Pure CDP Mode:
|
|
132
184
|
|
|
133
185
|
```python
|
|
134
186
|
from seleniumbase import sb_cdp
|
|
@@ -139,12 +191,11 @@ sb.sleep(2)
|
|
|
139
191
|
sb.solve_captcha()
|
|
140
192
|
sb.highlight('h1:contains("GitLab")')
|
|
141
193
|
sb.highlight('button:contains("Sign in")')
|
|
142
|
-
sb.driver.stop()
|
|
143
194
|
```
|
|
144
195
|
|
|
145
196
|
--------
|
|
146
197
|
|
|
147
|
-
<p align="left"
|
|
198
|
+
<p align="left">📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_get_swag.py" target="_blank">This example</a> tests an e-commerce site with <code>pytest</code>:
|
|
148
199
|
|
|
149
200
|
```python
|
|
150
201
|
from seleniumbase import BaseCase
|
|
@@ -174,7 +225,7 @@ class MyTestClass(BaseCase):
|
|
|
174
225
|
|
|
175
226
|
--------
|
|
176
227
|
|
|
177
|
-
<p align="left"
|
|
228
|
+
<p align="left">📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_coffee_cart.py" target="_blank">This example</a> tests another e-commerce site with <code>pytest</code>:
|
|
178
229
|
|
|
179
230
|
```zsh
|
|
180
231
|
pytest test_coffee_cart.py --demo
|
|
@@ -188,7 +239,7 @@ pytest test_coffee_cart.py --demo
|
|
|
188
239
|
|
|
189
240
|
<a id="multiple_examples"></a>
|
|
190
241
|
|
|
191
|
-
<p align="left"
|
|
242
|
+
<p align="left">📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_demo_site.py" target="_blank">This example</a> covers multiple actions with <code>pytest</code>:
|
|
192
243
|
|
|
193
244
|
```zsh
|
|
194
245
|
pytest test_demo_site.py
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
pip>=26.0.1;python_version<"3.10"
|
|
2
|
-
pip>=26.1;python_version>="3.10"
|
|
2
|
+
pip>=26.1.1;python_version>="3.10"
|
|
3
3
|
packaging>=26.2
|
|
4
4
|
setuptools~=70.2;python_version<"3.10"
|
|
5
5
|
setuptools>=82.0.1;python_version>="3.10"
|
|
@@ -21,20 +21,21 @@ sbvirtualdisplay>=1.4.0
|
|
|
21
21
|
MarkupSafe>=3.0.3
|
|
22
22
|
Jinja2>=3.1.6
|
|
23
23
|
six>=1.17.0
|
|
24
|
-
parse>=1.
|
|
24
|
+
parse>=1.22.0
|
|
25
25
|
parse-type>=0.6.6
|
|
26
26
|
colorama>=0.4.6
|
|
27
|
+
psutil>=7.2.2
|
|
27
28
|
pyyaml>=6.0.3
|
|
28
29
|
pygments>=2.20.0
|
|
29
30
|
pyreadline3>=3.5.4;platform_system=="Windows"
|
|
30
31
|
tabcompleter>=1.4.1
|
|
31
32
|
pdbp>=1.8.2
|
|
32
|
-
idna>=3.
|
|
33
|
+
idna>=3.15
|
|
33
34
|
charset-normalizer>=3.4.7,<4
|
|
34
35
|
urllib3>=1.26.20,<2;python_version<"3.10"
|
|
35
|
-
urllib3>=
|
|
36
|
+
urllib3>=2.7.0,<3;python_version>="3.10"
|
|
36
37
|
requests~=2.32.5;python_version<"3.10"
|
|
37
|
-
requests~=2.
|
|
38
|
+
requests~=2.34.2;python_version>="3.10"
|
|
38
39
|
sniffio==1.3.1
|
|
39
40
|
h11==0.16.0
|
|
40
41
|
outcome==1.3.0.post0
|
|
@@ -45,7 +46,7 @@ wsproto==1.2.0;python_version<"3.10"
|
|
|
45
46
|
wsproto~=1.3.2;python_version>="3.10"
|
|
46
47
|
websocket-client~=1.9.0
|
|
47
48
|
selenium==4.32.0;python_version<"3.10"
|
|
48
|
-
selenium==4.
|
|
49
|
+
selenium==4.44.0;python_version>="3.10"
|
|
49
50
|
cssselect==1.3.0;python_version<"3.10"
|
|
50
51
|
cssselect>=1.4.0,<2;python_version>="3.10"
|
|
51
52
|
sortedcontainers==2.4.0
|
|
@@ -60,7 +61,7 @@ pytest-html==4.0.2
|
|
|
60
61
|
pytest-metadata==3.1.1
|
|
61
62
|
pytest-ordering==0.6
|
|
62
63
|
pytest-rerunfailures==16.0.1;python_version<"3.10"
|
|
63
|
-
pytest-rerunfailures==16.
|
|
64
|
+
pytest-rerunfailures==16.2;python_version>="3.10"
|
|
64
65
|
pytest-xdist==3.8.0
|
|
65
66
|
parameterized==0.9.0
|
|
66
67
|
behave==1.2.6
|
|
@@ -70,7 +71,7 @@ pyotp==2.9.0
|
|
|
70
71
|
python-xlib==0.33;platform_system=="Linux"
|
|
71
72
|
PyAutoGUI>=0.9.54;platform_system=="Linux"
|
|
72
73
|
markdown-it-py==3.0.0;python_version<"3.10"
|
|
73
|
-
markdown-it-py==4.
|
|
74
|
+
markdown-it-py==4.2.0;python_version>="3.10"
|
|
74
75
|
mdurl==0.1.2
|
|
75
76
|
rich>=15.0.0,<16
|
|
76
77
|
|
|
@@ -78,7 +79,7 @@ rich>=15.0.0,<16
|
|
|
78
79
|
# ("pip install -r requirements.txt" also installs this, but "pip install -e ." won't.)
|
|
79
80
|
|
|
80
81
|
coverage>=7.10.7;python_version<"3.10"
|
|
81
|
-
coverage>=7.
|
|
82
|
+
coverage>=7.14.0;python_version>="3.10"
|
|
82
83
|
pytest-cov>=7.1.0
|
|
83
84
|
flake8==7.3.0
|
|
84
85
|
mccabe==0.7.0
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
# seleniumbase package
|
|
2
|
-
__version__ = "4.
|
|
2
|
+
__version__ = "4.49.1"
|