seleniumbase 4.49.0__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.49.0/seleniumbase.egg-info → seleniumbase-4.49.1}/PKG-INFO +21 -21
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/README.md +16 -15
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/requirements.txt +1 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/__version__.py +1 -1
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/undetected/__init__.py +24 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/undetected/cdp_driver/browser.py +23 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1/seleniumbase.egg-info}/PKG-INFO +21 -21
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase.egg-info/requires.txt +2 -4
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/setup.py +6 -12
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/.gitignore +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/LICENSE +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/MANIFEST.in +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/install.sh +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/pyproject.toml +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/pytest.ini +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/sbase/__init__.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/sbase/__main__.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/sbase/steps.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/__init__.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/__main__.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/behave/__init__.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/behave/behave_helper.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/behave/behave_sb.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/behave/steps.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/common/__init__.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/common/decorators.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/common/encryption.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/common/exceptions.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/common/obfuscate.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/common/unobfuscate.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/config/__init__.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/config/ad_block_list.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/config/proxy_list.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/config/settings.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/console_scripts/__init__.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/console_scripts/logo_helper.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/console_scripts/rich_helper.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/console_scripts/run.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/console_scripts/sb_commander.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/console_scripts/sb_install.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/console_scripts/sb_objectify.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/console_scripts/sb_print.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/console_scripts/sb_recorder.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/__init__.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/application_manager.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/browser_launcher.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/capabilities_parser.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/colored_traceback.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/create_db_tables.sql +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/detect_b_ver.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/download_helper.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/encoded_images.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/jqc_helper.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/log_helper.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/mysql.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/nest_asyncio.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/proxy_helper.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/recorder_helper.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/report_helper.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/s3_manager.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/sb_cdp.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/sb_driver.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/session_helper.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/settings_parser.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/style_sheet.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/testcase_manager.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/tour_helper.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/visual_helper.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/drivers/__init__.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/drivers/atlas_drivers/__init__.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/drivers/brave_drivers/__init__.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/drivers/cft_drivers/__init__.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/drivers/chromium_drivers/__init__.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/drivers/chs_drivers/__init__.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/drivers/comet_drivers/__init__.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/drivers/opera_drivers/__init__.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/extensions/__init__.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/extensions/ad_block.zip +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/extensions/disable_csp.zip +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/extensions/recorder.zip +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/extensions/sbase_ext.zip +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/fixtures/__init__.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/fixtures/base_case.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/fixtures/constants.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/fixtures/css_to_xpath.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/fixtures/errors.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/fixtures/js_utils.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/fixtures/page_actions.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/fixtures/page_utils.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/fixtures/shared_utils.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/fixtures/unittest_helper.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/fixtures/words.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/fixtures/xpath_to_css.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/js_code/__init__.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/js_code/active_css_js.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/js_code/live_js.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/js_code/recorder_js.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/masterqa/__init__.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/masterqa/master_qa.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/plugins/__init__.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/plugins/base_plugin.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/plugins/basic_test_info.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/plugins/driver_manager.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/plugins/page_source.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/plugins/pytest_plugin.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/plugins/sb_manager.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/plugins/screen_shots.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/plugins/selenium_plugin.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/resources/__init__.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/translate/__init__.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/translate/chinese.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/translate/dutch.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/translate/french.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/translate/italian.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/translate/japanese.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/translate/korean.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/translate/master_dict.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/translate/portuguese.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/translate/russian.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/translate/spanish.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/translate/translator.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/undetected/cdp.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/undetected/cdp_driver/__init__.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/undetected/cdp_driver/cdp_util.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/undetected/cdp_driver/config.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/undetected/cdp_driver/connection.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/undetected/cdp_driver/element.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/undetected/cdp_driver/tab.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/undetected/dprocess.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/undetected/options.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/undetected/patcher.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/undetected/reactor.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/undetected/webelement.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/utilities/__init__.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_grid/font_color +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase.egg-info/SOURCES.txt +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase.egg-info/dependency_links.txt +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase.egg-info/entry_points.txt +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase.egg-info/top_level.txt +0 -0
- {seleniumbase-4.49.0 → seleniumbase-4.49.1}/setup.cfg +0 -0
- {seleniumbase-4.49.0 → 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.49.
|
|
4
|
-
Summary:
|
|
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,web-crawling,web-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
|
|
@@ -84,6 +84,7 @@ Requires-Dist: six>=1.17.0
|
|
|
84
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"
|
|
@@ -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,19 +207,12 @@ 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
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>
|
|
216
213
|
<p align="center"></p>
|
|
217
214
|
|
|
218
|
-
<h3 align="center">Stealthy
|
|
219
|
-
|
|
220
|
-
<table align="center"><tr><td>
|
|
221
|
-
<b>Verified using multiple different Chromium browsers:<br />Chrome, Chrome-for-Testing, Chromium, Edge, Brave.</b>
|
|
222
|
-
</td></tr></table>
|
|
223
|
-
|
|
215
|
+
<h3 align="center">Stealthy Chromium Automation and E2E Testing.</h3>
|
|
224
216
|
|
|
225
217
|
<p align="center">
|
|
226
218
|
<a href="#python_installation">🚀 Start</a> |
|
|
@@ -240,7 +232,7 @@ Dynamic: summary
|
|
|
240
232
|
<a href="https://seleniumbase.io/demo_page">📰 TestPage</a> |
|
|
241
233
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/uc_mode.md">👤 UC Mode</a> |
|
|
242
234
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md">🐙 CDP Mode</a> |
|
|
243
|
-
<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> |
|
|
244
236
|
<a href="https://seleniumbase.io/devices/?url=seleniumbase.com">🖥️ Farm</a>
|
|
245
237
|
<br />
|
|
246
238
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/how_it_works.md">👁️ How</a> |
|
|
@@ -260,9 +252,11 @@ Dynamic: summary
|
|
|
260
252
|
|
|
261
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.
|
|
262
254
|
|
|
263
|
-
📚 The [SeleniumBase/examples/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples) folder includes over 100 ready-to-run examples. 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).
|
|
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).
|
|
256
|
+
|
|
257
|
+
🥷 Stealthy CDP Mode examples are located in [./examples/cdp_mode/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples/cdp_mode).
|
|
264
258
|
|
|
265
|
-
|
|
259
|
+
🎭 Stealthy Playwright examples are located in [./examples/cdp_mode/playwright/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/).
|
|
266
260
|
|
|
267
261
|
--------
|
|
268
262
|
|
|
@@ -283,13 +277,13 @@ url = "https://www.browserscan.net/bot-detection"
|
|
|
283
277
|
sb = sb_cdp.Chrome(url, locale="en", ad_block=True)
|
|
284
278
|
sb.flash("Test Results", duration=3, pause=1)
|
|
285
279
|
sb.assert_element('strong:contains("Normal")')
|
|
286
|
-
print("Bot Not
|
|
280
|
+
print("Bot Not Detected")
|
|
287
281
|
sb.flash('strong:contains("Normal")', duration=3, pause=2)
|
|
288
282
|
```
|
|
289
283
|
|
|
290
284
|
<img src="https://seleniumbase.github.io/other/b_scan_results.jpg" width="628" alt="Stealthy architecture flowchart" />
|
|
291
285
|
|
|
292
|
-
📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/raw_browserscan_sync.py">This</a>
|
|
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:
|
|
293
287
|
|
|
294
288
|
```python
|
|
295
289
|
from playwright.sync_api import sync_playwright
|
|
@@ -310,7 +304,7 @@ with sync_playwright() as p:
|
|
|
310
304
|
|
|
311
305
|
--------
|
|
312
306
|
|
|
313
|
-
|
|
307
|
+
💡 You can set which Chromium browser to use via command-line options:
|
|
314
308
|
|
|
315
309
|
```zsh
|
|
316
310
|
python SCRIPT.py --use-chromium # Use the unbranded Chromium browser
|
|
@@ -319,7 +313,13 @@ python SCRIPT.py --edge # Use Microsoft Edge
|
|
|
319
313
|
python SCRIPT.py --brave # Use Brave browser
|
|
320
314
|
```
|
|
321
315
|
|
|
322
|
-
|
|
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
323
|
|
|
324
324
|
--------
|
|
325
325
|
|
|
@@ -7,19 +7,12 @@
|
|
|
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
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>
|
|
15
13
|
<p align="center"></p>
|
|
16
14
|
|
|
17
|
-
<h3 align="center">Stealthy
|
|
18
|
-
|
|
19
|
-
<table align="center"><tr><td>
|
|
20
|
-
<b>Verified using multiple different Chromium browsers:<br />Chrome, Chrome-for-Testing, Chromium, Edge, Brave.</b>
|
|
21
|
-
</td></tr></table>
|
|
22
|
-
|
|
15
|
+
<h3 align="center">Stealthy Chromium Automation and E2E Testing.</h3>
|
|
23
16
|
|
|
24
17
|
<p align="center">
|
|
25
18
|
<a href="#python_installation">🚀 Start</a> |
|
|
@@ -39,7 +32,7 @@
|
|
|
39
32
|
<a href="https://seleniumbase.io/demo_page">📰 TestPage</a> |
|
|
40
33
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/uc_mode.md">👤 UC Mode</a> |
|
|
41
34
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md">🐙 CDP Mode</a> |
|
|
42
|
-
<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> |
|
|
43
36
|
<a href="https://seleniumbase.io/devices/?url=seleniumbase.com">🖥️ Farm</a>
|
|
44
37
|
<br />
|
|
45
38
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/how_it_works.md">👁️ How</a> |
|
|
@@ -59,9 +52,11 @@
|
|
|
59
52
|
|
|
60
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.
|
|
61
54
|
|
|
62
|
-
📚 The [SeleniumBase/examples/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples) folder includes over 100 ready-to-run examples. 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).
|
|
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).
|
|
56
|
+
|
|
57
|
+
🥷 Stealthy CDP Mode examples are located in [./examples/cdp_mode/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples/cdp_mode).
|
|
63
58
|
|
|
64
|
-
|
|
59
|
+
🎭 Stealthy Playwright examples are located in [./examples/cdp_mode/playwright/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/).
|
|
65
60
|
|
|
66
61
|
--------
|
|
67
62
|
|
|
@@ -82,13 +77,13 @@ url = "https://www.browserscan.net/bot-detection"
|
|
|
82
77
|
sb = sb_cdp.Chrome(url, locale="en", ad_block=True)
|
|
83
78
|
sb.flash("Test Results", duration=3, pause=1)
|
|
84
79
|
sb.assert_element('strong:contains("Normal")')
|
|
85
|
-
print("Bot Not
|
|
80
|
+
print("Bot Not Detected")
|
|
86
81
|
sb.flash('strong:contains("Normal")', duration=3, pause=2)
|
|
87
82
|
```
|
|
88
83
|
|
|
89
84
|
<img src="https://seleniumbase.github.io/other/b_scan_results.jpg" width="628" alt="Stealthy architecture flowchart" />
|
|
90
85
|
|
|
91
|
-
📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/raw_browserscan_sync.py">This</a>
|
|
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:
|
|
92
87
|
|
|
93
88
|
```python
|
|
94
89
|
from playwright.sync_api import sync_playwright
|
|
@@ -109,7 +104,7 @@ with sync_playwright() as p:
|
|
|
109
104
|
|
|
110
105
|
--------
|
|
111
106
|
|
|
112
|
-
|
|
107
|
+
💡 You can set which Chromium browser to use via command-line options:
|
|
113
108
|
|
|
114
109
|
```zsh
|
|
115
110
|
python SCRIPT.py --use-chromium # Use the unbranded Chromium browser
|
|
@@ -118,7 +113,13 @@ python SCRIPT.py --edge # Use Microsoft Edge
|
|
|
118
113
|
python SCRIPT.py --brave # Use Brave browser
|
|
119
114
|
```
|
|
120
115
|
|
|
121
|
-
|
|
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
|
+
```
|
|
122
123
|
|
|
123
124
|
--------
|
|
124
125
|
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
# seleniumbase package
|
|
2
|
-
__version__ = "4.49.
|
|
2
|
+
__version__ = "4.49.1"
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
import os
|
|
3
3
|
import re
|
|
4
|
+
import psutil
|
|
4
5
|
import requests
|
|
5
6
|
import subprocess
|
|
6
7
|
import sys
|
|
@@ -299,6 +300,13 @@ class Chrome(selenium.webdriver.chrome.webdriver.WebDriver):
|
|
|
299
300
|
creationflags=creationflags,
|
|
300
301
|
)
|
|
301
302
|
self.browser_pid = browser.pid
|
|
303
|
+
self._process_pid = browser.pid
|
|
304
|
+
try:
|
|
305
|
+
self._process_create_time = (
|
|
306
|
+
psutil.Process(self._process_pid).create_time()
|
|
307
|
+
)
|
|
308
|
+
except psutil.NoSuchProcess:
|
|
309
|
+
self._process_create_time = None
|
|
302
310
|
service_ = None
|
|
303
311
|
log_output = subprocess.PIPE
|
|
304
312
|
if patch_driver:
|
|
@@ -392,6 +400,22 @@ class Chrome(selenium.webdriver.chrome.webdriver.WebDriver):
|
|
|
392
400
|
},
|
|
393
401
|
)
|
|
394
402
|
|
|
403
|
+
def is_running(self):
|
|
404
|
+
"""Check if the browser is still running."""
|
|
405
|
+
if not getattr(self, "_process_pid", None):
|
|
406
|
+
return False
|
|
407
|
+
# Not good enough: return psutil.pid_exists(self._process_pid)
|
|
408
|
+
try:
|
|
409
|
+
process = psutil.Process(self._process_pid)
|
|
410
|
+
# Check for PID recycling: Is this actually our process?
|
|
411
|
+
if hasattr(self, "_process_create_time"):
|
|
412
|
+
if process.create_time() != self._process_create_time:
|
|
413
|
+
return False # The PID was reused by a different process!
|
|
414
|
+
# If the process is a zombie, assume the browser isn't running
|
|
415
|
+
return process.status() != psutil.STATUS_ZOMBIE
|
|
416
|
+
except psutil.NoSuchProcess:
|
|
417
|
+
return False
|
|
418
|
+
|
|
395
419
|
def remove_cdc_props_as_needed(self):
|
|
396
420
|
cdc_props = self._get_cdc_props()
|
|
397
421
|
if len(cdc_props) > 0:
|
|
@@ -9,6 +9,7 @@ import logging
|
|
|
9
9
|
import os
|
|
10
10
|
import pathlib
|
|
11
11
|
import pickle
|
|
12
|
+
import psutil
|
|
12
13
|
import re
|
|
13
14
|
import shutil
|
|
14
15
|
import time
|
|
@@ -263,6 +264,22 @@ class Browser:
|
|
|
263
264
|
)
|
|
264
265
|
self.targets.remove(current_tab)
|
|
265
266
|
|
|
267
|
+
def is_running(self):
|
|
268
|
+
"""Check if the browser is still running."""
|
|
269
|
+
if not getattr(self, "_process_pid", None):
|
|
270
|
+
return False
|
|
271
|
+
# Not good enough: return psutil.pid_exists(self._process_pid)
|
|
272
|
+
try:
|
|
273
|
+
process = psutil.Process(self._process_pid)
|
|
274
|
+
# Check for PID recycling: Is this actually our process?
|
|
275
|
+
if hasattr(self, "_process_create_time"):
|
|
276
|
+
if process.create_time() != self._process_create_time:
|
|
277
|
+
return False # The PID was reused by a different process!
|
|
278
|
+
# If the process is a zombie, assume the browser isn't running
|
|
279
|
+
return process.status() != psutil.STATUS_ZOMBIE
|
|
280
|
+
except psutil.NoSuchProcess:
|
|
281
|
+
return False
|
|
282
|
+
|
|
266
283
|
def get_rd_host(self):
|
|
267
284
|
return self.config.host
|
|
268
285
|
|
|
@@ -617,6 +634,12 @@ class Browser:
|
|
|
617
634
|
)
|
|
618
635
|
await asyncio.sleep(0.05)
|
|
619
636
|
self._process_pid = self._process.pid
|
|
637
|
+
try:
|
|
638
|
+
self._process_create_time = (
|
|
639
|
+
psutil.Process(self._process_pid).create_time()
|
|
640
|
+
)
|
|
641
|
+
except psutil.NoSuchProcess:
|
|
642
|
+
self._process_create_time = None
|
|
620
643
|
await asyncio.sleep(0.05)
|
|
621
644
|
self._http = HTTPApi((self.config.host, self.config.port))
|
|
622
645
|
await asyncio.sleep(0.05)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: seleniumbase
|
|
3
|
-
Version: 4.49.
|
|
4
|
-
Summary:
|
|
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,web-crawling,web-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
|
|
@@ -84,6 +84,7 @@ Requires-Dist: six>=1.17.0
|
|
|
84
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"
|
|
@@ -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,19 +207,12 @@ 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
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>
|
|
216
213
|
<p align="center"></p>
|
|
217
214
|
|
|
218
|
-
<h3 align="center">Stealthy
|
|
219
|
-
|
|
220
|
-
<table align="center"><tr><td>
|
|
221
|
-
<b>Verified using multiple different Chromium browsers:<br />Chrome, Chrome-for-Testing, Chromium, Edge, Brave.</b>
|
|
222
|
-
</td></tr></table>
|
|
223
|
-
|
|
215
|
+
<h3 align="center">Stealthy Chromium Automation and E2E Testing.</h3>
|
|
224
216
|
|
|
225
217
|
<p align="center">
|
|
226
218
|
<a href="#python_installation">🚀 Start</a> |
|
|
@@ -240,7 +232,7 @@ Dynamic: summary
|
|
|
240
232
|
<a href="https://seleniumbase.io/demo_page">📰 TestPage</a> |
|
|
241
233
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/uc_mode.md">👤 UC Mode</a> |
|
|
242
234
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md">🐙 CDP Mode</a> |
|
|
243
|
-
<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> |
|
|
244
236
|
<a href="https://seleniumbase.io/devices/?url=seleniumbase.com">🖥️ Farm</a>
|
|
245
237
|
<br />
|
|
246
238
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/how_it_works.md">👁️ How</a> |
|
|
@@ -260,9 +252,11 @@ Dynamic: summary
|
|
|
260
252
|
|
|
261
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.
|
|
262
254
|
|
|
263
|
-
📚 The [SeleniumBase/examples/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples) folder includes over 100 ready-to-run examples. 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).
|
|
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).
|
|
256
|
+
|
|
257
|
+
🥷 Stealthy CDP Mode examples are located in [./examples/cdp_mode/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples/cdp_mode).
|
|
264
258
|
|
|
265
|
-
|
|
259
|
+
🎭 Stealthy Playwright examples are located in [./examples/cdp_mode/playwright/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/).
|
|
266
260
|
|
|
267
261
|
--------
|
|
268
262
|
|
|
@@ -283,13 +277,13 @@ url = "https://www.browserscan.net/bot-detection"
|
|
|
283
277
|
sb = sb_cdp.Chrome(url, locale="en", ad_block=True)
|
|
284
278
|
sb.flash("Test Results", duration=3, pause=1)
|
|
285
279
|
sb.assert_element('strong:contains("Normal")')
|
|
286
|
-
print("Bot Not
|
|
280
|
+
print("Bot Not Detected")
|
|
287
281
|
sb.flash('strong:contains("Normal")', duration=3, pause=2)
|
|
288
282
|
```
|
|
289
283
|
|
|
290
284
|
<img src="https://seleniumbase.github.io/other/b_scan_results.jpg" width="628" alt="Stealthy architecture flowchart" />
|
|
291
285
|
|
|
292
|
-
📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/raw_browserscan_sync.py">This</a>
|
|
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:
|
|
293
287
|
|
|
294
288
|
```python
|
|
295
289
|
from playwright.sync_api import sync_playwright
|
|
@@ -310,7 +304,7 @@ with sync_playwright() as p:
|
|
|
310
304
|
|
|
311
305
|
--------
|
|
312
306
|
|
|
313
|
-
|
|
307
|
+
💡 You can set which Chromium browser to use via command-line options:
|
|
314
308
|
|
|
315
309
|
```zsh
|
|
316
310
|
python SCRIPT.py --use-chromium # Use the unbranded Chromium browser
|
|
@@ -319,7 +313,13 @@ python SCRIPT.py --edge # Use Microsoft Edge
|
|
|
319
313
|
python SCRIPT.py --brave # Use Brave browser
|
|
320
314
|
```
|
|
321
315
|
|
|
322
|
-
|
|
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
323
|
|
|
324
324
|
--------
|
|
325
325
|
|
|
@@ -14,6 +14,7 @@ six>=1.17.0
|
|
|
14
14
|
parse>=1.22.0
|
|
15
15
|
parse-type>=0.6.6
|
|
16
16
|
colorama>=0.4.6
|
|
17
|
+
psutil>=7.2.2
|
|
17
18
|
pyyaml>=6.0.3
|
|
18
19
|
pygments>=2.20.0
|
|
19
20
|
tabcompleter>=1.4.1
|
|
@@ -139,14 +140,11 @@ Pillow>=12.2.0
|
|
|
139
140
|
pip-system-certs==4.0
|
|
140
141
|
|
|
141
142
|
[playwright]
|
|
142
|
-
playwright>=1.
|
|
143
|
+
playwright>=1.60.0
|
|
143
144
|
|
|
144
145
|
[proxy]
|
|
145
146
|
proxy.py==2.4.3
|
|
146
147
|
|
|
147
|
-
[psutil]
|
|
148
|
-
psutil>=7.2.2
|
|
149
|
-
|
|
150
148
|
[pyautogui]
|
|
151
149
|
|
|
152
150
|
[pyautogui:platform_system != "Linux"]
|
|
@@ -75,8 +75,8 @@ setup(
|
|
|
75
75
|
name="seleniumbase",
|
|
76
76
|
version=about["__version__"],
|
|
77
77
|
description=(
|
|
78
|
-
"
|
|
79
|
-
"
|
|
78
|
+
"A framework for stealthy Chromium automation with CDP Mode. "
|
|
79
|
+
"Includes CAPTCHA-bypass, E2E Testing, and a Playwright integration."
|
|
80
80
|
),
|
|
81
81
|
long_description=long_description,
|
|
82
82
|
long_description_content_type="text/markdown",
|
|
@@ -109,12 +109,9 @@ setup(
|
|
|
109
109
|
"sbase",
|
|
110
110
|
"web-crawling",
|
|
111
111
|
"web-scraping",
|
|
112
|
-
"scraping",
|
|
113
112
|
"stealth",
|
|
114
113
|
"chromium",
|
|
115
114
|
"playwright",
|
|
116
|
-
"anti-detect",
|
|
117
|
-
"antidetect",
|
|
118
115
|
"undetected",
|
|
119
116
|
"bot-detection",
|
|
120
117
|
"fingerprint",
|
|
@@ -185,11 +182,12 @@ setup(
|
|
|
185
182
|
'typing-extensions>=4.15.0',
|
|
186
183
|
'sbvirtualdisplay>=1.4.0',
|
|
187
184
|
'MarkupSafe>=3.0.3',
|
|
188
|
-
|
|
189
|
-
|
|
185
|
+
'Jinja2>=3.1.6',
|
|
186
|
+
'six>=1.17.0',
|
|
190
187
|
'parse>=1.22.0',
|
|
191
188
|
'parse-type>=0.6.6',
|
|
192
189
|
'colorama>=0.4.6',
|
|
190
|
+
'psutil>=7.2.2',
|
|
193
191
|
'pyyaml>=6.0.3',
|
|
194
192
|
'pygments>=2.20.0',
|
|
195
193
|
'pyreadline3>=3.5.4;platform_system=="Windows"',
|
|
@@ -306,11 +304,7 @@ setup(
|
|
|
306
304
|
# pip install -e .[playwright]
|
|
307
305
|
# (For the Playwright integration.)
|
|
308
306
|
"playwright": [
|
|
309
|
-
"playwright>=1.
|
|
310
|
-
],
|
|
311
|
-
# pip install -e .[psutil]
|
|
312
|
-
"psutil": [
|
|
313
|
-
"psutil>=7.2.2",
|
|
307
|
+
"playwright>=1.60.0",
|
|
314
308
|
],
|
|
315
309
|
# pip install -e .[pyautogui]
|
|
316
310
|
# (Already a required dependency on Linux now.)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/drivers/chromium_drivers/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/undetected/cdp_driver/_contradict.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/undetected/cdp_driver/connection.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_grid/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_grid/grid_hub.py
RENAMED
|
File without changes
|
{seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_grid/grid_node.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat
RENAMED
|
File without changes
|
{seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh
RENAMED
|
File without changes
|
|
File without changes
|
{seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_ide/convert_ide.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|