seleniumbase 4.35.3__tar.gz → 4.35.7__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.35.3/seleniumbase.egg-info → seleniumbase-4.35.7}/PKG-INFO +12 -10
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/README.md +5 -4
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/requirements.txt +6 -5
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/__version__.py +1 -1
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/core/browser_launcher.py +44 -2
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/core/sb_cdp.py +45 -1
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/fixtures/base_case.py +41 -6
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/plugins/driver_manager.py +17 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/plugins/sb_manager.py +17 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/undetected/__init__.py +1 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/undetected/cdp_driver/browser.py +1 -1
- {seleniumbase-4.35.3 → seleniumbase-4.35.7/seleniumbase.egg-info}/PKG-INFO +12 -10
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase.egg-info/requires.txt +6 -5
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/setup.py +6 -5
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/.gitignore +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/LICENSE +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/MANIFEST.in +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/install.sh +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/pyproject.toml +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/pytest.ini +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/sbase/__init__.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/sbase/__main__.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/sbase/steps.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/__init__.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/__main__.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/behave/__init__.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/behave/behave_helper.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/behave/behave_sb.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/behave/steps.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/common/__init__.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/common/decorators.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/common/encryption.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/common/exceptions.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/common/obfuscate.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/common/unobfuscate.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/config/__init__.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/config/ad_block_list.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/config/proxy_list.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/config/settings.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/console_scripts/__init__.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/console_scripts/logo_helper.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/console_scripts/rich_helper.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/console_scripts/run.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/console_scripts/sb_commander.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/console_scripts/sb_install.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/console_scripts/sb_objectify.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/console_scripts/sb_print.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/console_scripts/sb_recorder.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/core/__init__.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/core/application_manager.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/core/capabilities_parser.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/core/colored_traceback.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/core/create_db_tables.sql +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/core/detect_b_ver.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/core/download_helper.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/core/encoded_images.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/core/jqc_helper.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/core/log_helper.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/core/mysql.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/core/proxy_helper.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/core/recorder_helper.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/core/report_helper.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/core/s3_manager.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/core/sb_driver.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/core/session_helper.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/core/settings_parser.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/core/style_sheet.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/core/testcase_manager.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/core/tour_helper.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/core/visual_helper.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/drivers/__init__.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/extensions/__init__.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/extensions/ad_block.zip +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/extensions/disable_csp.zip +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/extensions/recorder.zip +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/extensions/sbase_ext.zip +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/fixtures/__init__.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/fixtures/constants.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/fixtures/css_to_xpath.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/fixtures/errors.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/fixtures/js_utils.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/fixtures/page_actions.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/fixtures/page_utils.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/fixtures/shared_utils.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/fixtures/unittest_helper.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/fixtures/words.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/fixtures/xpath_to_css.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/js_code/__init__.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/js_code/active_css_js.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/js_code/live_js.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/js_code/recorder_js.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/masterqa/__init__.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/masterqa/master_qa.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/plugins/__init__.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/plugins/base_plugin.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/plugins/basic_test_info.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/plugins/page_source.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/plugins/pytest_plugin.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/plugins/screen_shots.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/plugins/selenium_plugin.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/resources/__init__.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/translate/__init__.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/translate/chinese.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/translate/dutch.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/translate/french.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/translate/italian.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/translate/japanese.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/translate/korean.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/translate/master_dict.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/translate/portuguese.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/translate/russian.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/translate/spanish.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/translate/translator.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/undetected/cdp.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/undetected/cdp_driver/__init__.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/undetected/cdp_driver/cdp_util.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/undetected/cdp_driver/config.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/undetected/cdp_driver/connection.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/undetected/cdp_driver/element.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/undetected/cdp_driver/tab.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/undetected/dprocess.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/undetected/options.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/undetected/patcher.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/undetected/reactor.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/undetected/webelement.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/utilities/__init__.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/utilities/selenium_grid/font_color +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase.egg-info/SOURCES.txt +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase.egg-info/dependency_links.txt +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase.egg-info/entry_points.txt +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase.egg-info/top_level.txt +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/setup.cfg +0 -0
- {seleniumbase-4.35.3 → seleniumbase-4.35.7}/virtualenv_install.sh +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.2
|
2
2
|
Name: seleniumbase
|
3
|
-
Version: 4.35.
|
3
|
+
Version: 4.35.7
|
4
4
|
Summary: A complete web automation framework for end-to-end testing.
|
5
5
|
Home-page: https://github.com/seleniumbase/SeleniumBase
|
6
6
|
Author: Michael Mintz
|
@@ -62,24 +62,24 @@ License-File: LICENSE
|
|
62
62
|
Requires-Dist: pip>=25.0.1
|
63
63
|
Requires-Dist: packaging>=24.2
|
64
64
|
Requires-Dist: setuptools~=70.2; python_version < "3.10"
|
65
|
-
Requires-Dist: setuptools>=
|
65
|
+
Requires-Dist: setuptools>=76.0.0; python_version >= "3.10"
|
66
66
|
Requires-Dist: wheel>=0.45.1
|
67
67
|
Requires-Dist: attrs>=25.1.0
|
68
68
|
Requires-Dist: certifi>=2025.1.31
|
69
69
|
Requires-Dist: exceptiongroup>=1.2.2
|
70
70
|
Requires-Dist: websockets~=13.1; python_version < "3.9"
|
71
|
-
Requires-Dist: websockets>=15.0; python_version >= "3.9"
|
71
|
+
Requires-Dist: websockets>=15.0.1; python_version >= "3.9"
|
72
72
|
Requires-Dist: filelock~=3.16.1; python_version < "3.9"
|
73
73
|
Requires-Dist: filelock>=3.17.0; python_version >= "3.9"
|
74
74
|
Requires-Dist: fasteners>=0.19
|
75
|
-
Requires-Dist: mycdp>=1.1.
|
75
|
+
Requires-Dist: mycdp>=1.1.1
|
76
76
|
Requires-Dist: pynose>=1.5.4
|
77
77
|
Requires-Dist: platformdirs>=4.3.6
|
78
78
|
Requires-Dist: typing-extensions>=4.12.2
|
79
79
|
Requires-Dist: sbvirtualdisplay>=1.4.0
|
80
80
|
Requires-Dist: MarkupSafe==2.1.5; python_version < "3.9"
|
81
81
|
Requires-Dist: MarkupSafe>=3.0.2; python_version >= "3.9"
|
82
|
-
Requires-Dist: Jinja2>=3.1.
|
82
|
+
Requires-Dist: Jinja2>=3.1.6
|
83
83
|
Requires-Dist: six>=1.17.0
|
84
84
|
Requires-Dist: parse>=1.20.2
|
85
85
|
Requires-Dist: parse-type>=0.6.4
|
@@ -105,7 +105,8 @@ Requires-Dist: wsproto==1.2.0
|
|
105
105
|
Requires-Dist: websocket-client==1.8.0
|
106
106
|
Requires-Dist: selenium==4.27.1; python_version < "3.9"
|
107
107
|
Requires-Dist: selenium==4.29.0; python_version >= "3.9"
|
108
|
-
Requires-Dist: cssselect==1.2.0
|
108
|
+
Requires-Dist: cssselect==1.2.0; python_version < "3.9"
|
109
|
+
Requires-Dist: cssselect==1.3.0; python_version >= "3.9"
|
109
110
|
Requires-Dist: sortedcontainers==2.4.0
|
110
111
|
Requires-Dist: execnet==2.1.1
|
111
112
|
Requires-Dist: iniconfig==2.0.0
|
@@ -205,7 +206,6 @@ Dynamic: summary
|
|
205
206
|
|
206
207
|
<p align="center"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/super_logo_sb3.png" alt="SeleniumBase" title="SeleniumBase" width="350" /></a></p>
|
207
208
|
|
208
|
-
|
209
209
|
<p align="center" class="hero__title"><b>All-in-one Browser Automation Framework:<br />Web Crawling / Testing / Scraping / Stealth</b></p>
|
210
210
|
|
211
211
|
<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/releases" target="_blank"><img src="https://img.shields.io/github/v/release/seleniumbase/SeleniumBase.svg?color=22AAEE" alt="GitHub version" /></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://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://discord.gg/EdhQTn3EyE" target="_blank"><img src="https://img.shields.io/badge/join-discord-infomational" alt="Join the SeleniumBase chat on Discord"/></a></p>
|
@@ -248,7 +248,9 @@ Dynamic: summary
|
|
248
248
|
<br />
|
249
249
|
</p>
|
250
250
|
|
251
|
-
<p
|
251
|
+
<p align="center"><a href="https://trendshift.io/repositories/12493" target="_blank"><img src="https://trendshift.io/api/badge/repositories/12493" alt="seleniumbase%2FSeleniumBase | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a></p>
|
252
|
+
|
253
|
+
<p>SeleniumBase is the professional toolkit for web automation. Built for testing websites, bypassing CAPTCHAs, completing tasks, and scaling your business.</p>
|
252
254
|
|
253
255
|
--------
|
254
256
|
|
@@ -275,7 +277,7 @@ with SB(test=True, uc=True) as sb:
|
|
275
277
|
|
276
278
|
> `python raw_google.py`
|
277
279
|
|
278
|
-
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_google.py"><img src="https://seleniumbase.github.io/cdn/gif/google_search.gif" alt="SeleniumBase Test" title="SeleniumBase Test" width="
|
280
|
+
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_google.py"><img src="https://seleniumbase.github.io/cdn/gif/google_search.gif" alt="SeleniumBase Test" title="SeleniumBase Test" width="480" /></a>
|
279
281
|
|
280
282
|
--------
|
281
283
|
|
@@ -1587,5 +1589,5 @@ pytest --reruns=1 --reruns-delay=1
|
|
1587
1589
|
<div><a href="https://seleniumbase.io"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg" alt="SeleniumBase Docs" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/LICENSE"><img src="https://img.shields.io/badge/license-MIT-22BBCC.svg" title="SeleniumBase" /></a></div>
|
1588
1590
|
<div><a href="https://github.com/seleniumbase/SeleniumBase"><img src="https://img.shields.io/badge/tested%20with-SeleniumBase-04C38E.svg" alt="Tested with SeleniumBase" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/stargazers"><img src="https://img.shields.io/github/stars/seleniumbase/seleniumbase.svg?color=19A57B" title="Stargazers" /></a></div>
|
1589
1591
|
<div><a href="https://hellogithub.com/repository/c6be2d0f1969448697683d11a4ff915e" target="_blank"><img src="https://abroad.hellogithub.com/v1/widgets/recommend.svg?rid=c6be2d0f1969448697683d11a4ff915e&claim_uid=xcrm4p9j3d6JCO5&theme=small" alt="Featured|HelloGitHub" /></a> <a href="https://discord.gg/EdhQTn3EyE" target="_blank"><img src="https://img.shields.io/badge/join-discord-infomational" alt="Join the SeleniumBase chat on Discord"/></a> <a href="https://gitter.im/seleniumbase/SeleniumBase" target="_blank"><img src="https://img.shields.io/gitter/room/seleniumbase/SeleniumBase.svg" alt="Gitter chat"/></a></div>
|
1590
|
-
<div><a href="https://pepy.tech/
|
1592
|
+
<div><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> <img src="https://views.whatilearened.today/views/github/seleniumbase/SeleniumBase.svg" width="98px" height="20px" alt="Views" /></div>
|
1591
1593
|
<div align="left"></div>
|
@@ -11,7 +11,6 @@
|
|
11
11
|
|
12
12
|
<p align="center"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/super_logo_sb3.png" alt="SeleniumBase" title="SeleniumBase" width="350" /></a></p>
|
13
13
|
|
14
|
-
|
15
14
|
<p align="center" class="hero__title"><b>All-in-one Browser Automation Framework:<br />Web Crawling / Testing / Scraping / Stealth</b></p>
|
16
15
|
|
17
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/releases" target="_blank"><img src="https://img.shields.io/github/v/release/seleniumbase/SeleniumBase.svg?color=22AAEE" alt="GitHub version" /></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://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://discord.gg/EdhQTn3EyE" target="_blank"><img src="https://img.shields.io/badge/join-discord-infomational" alt="Join the SeleniumBase chat on Discord"/></a></p>
|
@@ -54,7 +53,9 @@
|
|
54
53
|
<br />
|
55
54
|
</p>
|
56
55
|
|
57
|
-
<p
|
56
|
+
<p align="center"><a href="https://trendshift.io/repositories/12493" target="_blank"><img src="https://trendshift.io/api/badge/repositories/12493" alt="seleniumbase%2FSeleniumBase | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a></p>
|
57
|
+
|
58
|
+
<p>SeleniumBase is the professional toolkit for web automation. Built for testing websites, bypassing CAPTCHAs, completing tasks, and scaling your business.</p>
|
58
59
|
|
59
60
|
--------
|
60
61
|
|
@@ -81,7 +82,7 @@ with SB(test=True, uc=True) as sb:
|
|
81
82
|
|
82
83
|
> `python raw_google.py`
|
83
84
|
|
84
|
-
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_google.py"><img src="https://seleniumbase.github.io/cdn/gif/google_search.gif" alt="SeleniumBase Test" title="SeleniumBase Test" width="
|
85
|
+
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_google.py"><img src="https://seleniumbase.github.io/cdn/gif/google_search.gif" alt="SeleniumBase Test" title="SeleniumBase Test" width="480" /></a>
|
85
86
|
|
86
87
|
--------
|
87
88
|
|
@@ -1393,5 +1394,5 @@ pytest --reruns=1 --reruns-delay=1
|
|
1393
1394
|
<div><a href="https://seleniumbase.io"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg" alt="SeleniumBase Docs" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/LICENSE"><img src="https://img.shields.io/badge/license-MIT-22BBCC.svg" title="SeleniumBase" /></a></div>
|
1394
1395
|
<div><a href="https://github.com/seleniumbase/SeleniumBase"><img src="https://img.shields.io/badge/tested%20with-SeleniumBase-04C38E.svg" alt="Tested with SeleniumBase" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/stargazers"><img src="https://img.shields.io/github/stars/seleniumbase/seleniumbase.svg?color=19A57B" title="Stargazers" /></a></div>
|
1395
1396
|
<div><a href="https://hellogithub.com/repository/c6be2d0f1969448697683d11a4ff915e" target="_blank"><img src="https://abroad.hellogithub.com/v1/widgets/recommend.svg?rid=c6be2d0f1969448697683d11a4ff915e&claim_uid=xcrm4p9j3d6JCO5&theme=small" alt="Featured|HelloGitHub" /></a> <a href="https://discord.gg/EdhQTn3EyE" target="_blank"><img src="https://img.shields.io/badge/join-discord-infomational" alt="Join the SeleniumBase chat on Discord"/></a> <a href="https://gitter.im/seleniumbase/SeleniumBase" target="_blank"><img src="https://img.shields.io/gitter/room/seleniumbase/SeleniumBase.svg" alt="Gitter chat"/></a></div>
|
1396
|
-
<div><a href="https://pepy.tech/
|
1397
|
+
<div><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> <img src="https://views.whatilearened.today/views/github/seleniumbase/SeleniumBase.svg" width="98px" height="20px" alt="Views" /></div>
|
1397
1398
|
<div align="left"></div>
|
@@ -1,24 +1,24 @@
|
|
1
1
|
pip>=25.0.1
|
2
2
|
packaging>=24.2
|
3
3
|
setuptools~=70.2;python_version<"3.10"
|
4
|
-
setuptools>=
|
4
|
+
setuptools>=76.0.0;python_version>="3.10"
|
5
5
|
wheel>=0.45.1
|
6
6
|
attrs>=25.1.0
|
7
7
|
certifi>=2025.1.31
|
8
8
|
exceptiongroup>=1.2.2
|
9
9
|
websockets~=13.1;python_version<"3.9"
|
10
|
-
websockets>=15.0;python_version>="3.9"
|
10
|
+
websockets>=15.0.1;python_version>="3.9"
|
11
11
|
filelock~=3.16.1;python_version<"3.9"
|
12
12
|
filelock>=3.17.0;python_version>="3.9"
|
13
13
|
fasteners>=0.19
|
14
|
-
mycdp>=1.1.
|
14
|
+
mycdp>=1.1.1
|
15
15
|
pynose>=1.5.4
|
16
16
|
platformdirs>=4.3.6
|
17
17
|
typing-extensions>=4.12.2
|
18
18
|
sbvirtualdisplay>=1.4.0
|
19
19
|
MarkupSafe==2.1.5;python_version<"3.9"
|
20
20
|
MarkupSafe>=3.0.2;python_version>="3.9"
|
21
|
-
Jinja2>=3.1.
|
21
|
+
Jinja2>=3.1.6
|
22
22
|
six>=1.17.0
|
23
23
|
parse>=1.20.2
|
24
24
|
parse-type>=0.6.4
|
@@ -44,7 +44,8 @@ wsproto==1.2.0
|
|
44
44
|
websocket-client==1.8.0
|
45
45
|
selenium==4.27.1;python_version<"3.9"
|
46
46
|
selenium==4.29.0;python_version>="3.9"
|
47
|
-
cssselect==1.2.0
|
47
|
+
cssselect==1.2.0;python_version<"3.9"
|
48
|
+
cssselect==1.3.0;python_version>="3.9"
|
48
49
|
sortedcontainers==2.4.0
|
49
50
|
execnet==2.1.1
|
50
51
|
iniconfig==2.0.0
|
@@ -1,2 +1,2 @@
|
|
1
1
|
# seleniumbase package
|
2
|
-
__version__ = "4.35.
|
2
|
+
__version__ = "4.35.7"
|
@@ -662,6 +662,7 @@ def uc_open_with_cdp_mode(driver, url=None):
|
|
662
662
|
cdp.press_keys = CDPM.press_keys
|
663
663
|
cdp.type = CDPM.type
|
664
664
|
cdp.set_value = CDPM.set_value
|
665
|
+
cdp.submit = CDPM.submit
|
665
666
|
cdp.evaluate = CDPM.evaluate
|
666
667
|
cdp.js_dumps = CDPM.js_dumps
|
667
668
|
cdp.maximize = CDPM.maximize
|
@@ -670,6 +671,8 @@ def uc_open_with_cdp_mode(driver, url=None):
|
|
670
671
|
cdp.set_window_rect = CDPM.set_window_rect
|
671
672
|
cdp.reset_window_size = CDPM.reset_window_size
|
672
673
|
cdp.set_locale = CDPM.set_locale
|
674
|
+
cdp.set_local_storage_item = CDPM.set_local_storage_item
|
675
|
+
cdp.set_session_storage_item = CDPM.set_session_storage_item
|
673
676
|
cdp.set_attributes = CDPM.set_attributes
|
674
677
|
cdp.gui_press_key = CDPM.gui_press_key
|
675
678
|
cdp.gui_press_keys = CDPM.gui_press_keys
|
@@ -682,8 +685,10 @@ def uc_open_with_cdp_mode(driver, url=None):
|
|
682
685
|
cdp.gui_hover_element = CDPM.gui_hover_element
|
683
686
|
cdp.gui_hover_and_click = CDPM.gui_hover_and_click
|
684
687
|
cdp.internalize_links = CDPM.internalize_links
|
688
|
+
cdp.open_new_window = CDPM.open_new_window
|
685
689
|
cdp.switch_to_window = CDPM.switch_to_window
|
686
690
|
cdp.switch_to_newest_window = CDPM.switch_to_newest_window
|
691
|
+
cdp.open_new_tab = CDPM.open_new_tab
|
687
692
|
cdp.switch_to_tab = CDPM.switch_to_tab
|
688
693
|
cdp.switch_to_newest_tab = CDPM.switch_to_newest_tab
|
689
694
|
cdp.close_active_tab = CDPM.close_active_tab
|
@@ -703,6 +708,8 @@ def uc_open_with_cdp_mode(driver, url=None):
|
|
703
708
|
cdp.get_user_agent = CDPM.get_user_agent
|
704
709
|
cdp.get_cookie_string = CDPM.get_cookie_string
|
705
710
|
cdp.get_locale_code = CDPM.get_locale_code
|
711
|
+
cdp.get_local_storage_item = CDPM.get_local_storage_item
|
712
|
+
cdp.get_session_storage_item = CDPM.get_session_storage_item
|
706
713
|
cdp.get_text = CDPM.get_text
|
707
714
|
cdp.get_title = CDPM.get_title
|
708
715
|
cdp.get_page_title = CDPM.get_title
|
@@ -1286,6 +1293,13 @@ def _uc_gui_click_captcha(
|
|
1286
1293
|
and driver.is_element_present("form div:not(:has(*))")
|
1287
1294
|
):
|
1288
1295
|
frame = "form div:not(:has(*))"
|
1296
|
+
elif (
|
1297
|
+
driver.is_element_present('[src*="/turnstile/"]')
|
1298
|
+
and driver.is_element_present(
|
1299
|
+
"body > div#check > div:not([class])"
|
1300
|
+
)
|
1301
|
+
):
|
1302
|
+
frame = "body > div#check > div:not([class])"
|
1289
1303
|
elif driver.is_element_present(".cf-turnstile-wrapper"):
|
1290
1304
|
frame = ".cf-turnstile-wrapper"
|
1291
1305
|
elif driver.is_element_present(
|
@@ -1317,15 +1331,36 @@ def _uc_gui_click_captcha(
|
|
1317
1331
|
driver.cdp.evaluate(script)
|
1318
1332
|
else:
|
1319
1333
|
driver.execute_script(script)
|
1334
|
+
elif (
|
1335
|
+
driver.is_element_present("form")
|
1336
|
+
and (
|
1337
|
+
driver.is_element_present('form div[style*="center"]')
|
1338
|
+
or driver.is_element_present('form div[style*="right"]')
|
1339
|
+
)
|
1340
|
+
):
|
1341
|
+
script = (
|
1342
|
+
"""var $elements = document.querySelectorAll(
|
1343
|
+
'form[style], form div[style]');
|
1344
|
+
var index = 0, length = $elements.length;
|
1345
|
+
for(; index < length; index++){
|
1346
|
+
the_style = $elements[index].getAttribute('style');
|
1347
|
+
new_style = the_style.replaceAll('center', 'left');
|
1348
|
+
new_style = new_style.replaceAll('right', 'left');
|
1349
|
+
$elements[index].setAttribute('style', new_style);}"""
|
1350
|
+
)
|
1351
|
+
if __is_cdp_swap_needed(driver):
|
1352
|
+
driver.cdp.evaluate(script)
|
1353
|
+
else:
|
1354
|
+
driver.execute_script(script)
|
1320
1355
|
elif (
|
1321
1356
|
driver.is_element_present("form")
|
1322
1357
|
and driver.is_element_present(
|
1323
|
-
|
1358
|
+
'form [id*="turnstile"] > div:not([class])'
|
1324
1359
|
)
|
1325
1360
|
):
|
1326
1361
|
script = (
|
1327
1362
|
"""var $elements = document.querySelectorAll(
|
1328
|
-
'form
|
1363
|
+
'form [id*="turnstile"]');
|
1329
1364
|
var index = 0, length = $elements.length;
|
1330
1365
|
for(; index < length; index++){
|
1331
1366
|
$elements[index].setAttribute('align', 'left');}"""
|
@@ -1575,6 +1610,13 @@ def _uc_gui_handle_captcha_(driver, frame="iframe", ctype=None):
|
|
1575
1610
|
):
|
1576
1611
|
frame = "form div:not(:has(*))"
|
1577
1612
|
tab_up_first = True
|
1613
|
+
elif (
|
1614
|
+
driver.is_element_present('[src*="/turnstile/"]')
|
1615
|
+
and driver.is_element_present(
|
1616
|
+
"body > div#check > div:not([class])"
|
1617
|
+
)
|
1618
|
+
):
|
1619
|
+
frame = "body > div#check > div:not([class])"
|
1578
1620
|
else:
|
1579
1621
|
return
|
1580
1622
|
else:
|
@@ -106,7 +106,7 @@ class CDPMethods():
|
|
106
106
|
driver = self.driver
|
107
107
|
if hasattr(driver, "cdp_base"):
|
108
108
|
driver = driver.cdp_base
|
109
|
-
self.
|
109
|
+
self.loop.run_until_complete(self.page.get(url))
|
110
110
|
url_protocol = url.split(":")[0]
|
111
111
|
safe_url = True
|
112
112
|
if url_protocol not in ["about", "data", "chrome"]:
|
@@ -955,6 +955,20 @@ class CDPMethods():
|
|
955
955
|
self.__slow_mode_pause_if_set()
|
956
956
|
self.loop.run_until_complete(self.page.sleep(0.025))
|
957
957
|
|
958
|
+
def submit(self, selector):
|
959
|
+
submit_script = (
|
960
|
+
"""elm = document.querySelector('%s');
|
961
|
+
const event = new KeyboardEvent("keydown", {
|
962
|
+
key: "Enter",
|
963
|
+
keyCode: 13,
|
964
|
+
code: "Enter",
|
965
|
+
which: 13,
|
966
|
+
bubbles: true
|
967
|
+
});
|
968
|
+
elm.dispatchEvent(event);""" % selector
|
969
|
+
)
|
970
|
+
self.loop.run_until_complete(self.page.evaluate(submit_script))
|
971
|
+
|
958
972
|
def evaluate(self, expression):
|
959
973
|
"""Run a JavaScript expression and return the result."""
|
960
974
|
expression = expression.strip()
|
@@ -1014,12 +1028,22 @@ class CDPMethods():
|
|
1014
1028
|
self.set_window_rect(x, y, width, height)
|
1015
1029
|
self.__add_light_pause()
|
1016
1030
|
|
1031
|
+
def open_new_window(self, url=None, switch_to=True):
|
1032
|
+
return self.open_new_tab(url=url, switch_to=switch_to)
|
1033
|
+
|
1017
1034
|
def switch_to_window(self, window):
|
1018
1035
|
self.switch_to_tab(window)
|
1019
1036
|
|
1020
1037
|
def switch_to_newest_window(self):
|
1021
1038
|
self.switch_to_tab(-1)
|
1022
1039
|
|
1040
|
+
def open_new_tab(self, url=None, switch_to=True):
|
1041
|
+
if not isinstance(url, str):
|
1042
|
+
url = "about:blank"
|
1043
|
+
self.loop.run_until_complete(self.page.get(url, new_tab=True))
|
1044
|
+
if switch_to:
|
1045
|
+
self.switch_to_newest_tab()
|
1046
|
+
|
1023
1047
|
def switch_to_tab(self, tab):
|
1024
1048
|
driver = self.driver
|
1025
1049
|
if hasattr(driver, "cdp_base"):
|
@@ -1105,6 +1129,16 @@ class CDPMethods():
|
|
1105
1129
|
self.page.evaluate("navigator.language || navigator.languages[0]")
|
1106
1130
|
)
|
1107
1131
|
|
1132
|
+
def get_local_storage_item(self, key):
|
1133
|
+
js_code = """localStorage.getItem('%s');""" % key
|
1134
|
+
with suppress(Exception):
|
1135
|
+
return self.loop.run_until_complete(self.page.evaluate(js_code))
|
1136
|
+
|
1137
|
+
def get_session_storage_item(self, key):
|
1138
|
+
js_code = """sessionStorage.getItem('%s');""" % key
|
1139
|
+
with suppress(Exception):
|
1140
|
+
return self.loop.run_until_complete(self.page.evaluate(js_code))
|
1141
|
+
|
1108
1142
|
def get_screen_rect(self):
|
1109
1143
|
coordinates = self.loop.run_until_complete(
|
1110
1144
|
self.page.js_dumps("window.screen")
|
@@ -1292,6 +1326,16 @@ class CDPMethods():
|
|
1292
1326
|
"""(Settings will take effect on the next page load)"""
|
1293
1327
|
self.loop.run_until_complete(self.page.set_locale(locale))
|
1294
1328
|
|
1329
|
+
def set_local_storage_item(self, key, value):
|
1330
|
+
js_code = """localStorage.setItem('%s','%s');""" % (key, value)
|
1331
|
+
with suppress(Exception):
|
1332
|
+
self.loop.run_until_complete(self.page.evaluate(js_code))
|
1333
|
+
|
1334
|
+
def set_session_storage_item(self, key, value):
|
1335
|
+
js_code = """sessionStorage.setItem('%s','%s');""" % (key, value)
|
1336
|
+
with suppress(Exception):
|
1337
|
+
self.loop.run_until_complete(self.page.evaluate(js_code))
|
1338
|
+
|
1295
1339
|
def set_attributes(self, selector, attribute, value):
|
1296
1340
|
"""This method uses JavaScript to set/update a common attribute.
|
1297
1341
|
All matching selectors from querySelectorAll() are used.
|
@@ -1164,6 +1164,9 @@ class BaseCase(unittest.TestCase):
|
|
1164
1164
|
"""Alternative to self.driver.find_element_by_*(SELECTOR).submit()"""
|
1165
1165
|
self.__check_scope()
|
1166
1166
|
selector, by = self.__recalculate_selector(selector, by)
|
1167
|
+
if self.__is_cdp_swap_needed():
|
1168
|
+
self.cdp.submit(selector)
|
1169
|
+
return
|
1167
1170
|
element = self.wait_for_element_clickable(
|
1168
1171
|
selector, by=by, timeout=settings.SMALL_TIMEOUT
|
1169
1172
|
)
|
@@ -3896,6 +3899,9 @@ class BaseCase(unittest.TestCase):
|
|
3896
3899
|
|
3897
3900
|
def open_new_window(self, switch_to=True):
|
3898
3901
|
"""Opens a new browser tab/window and switches to it by default."""
|
3902
|
+
if self.__is_cdp_swap_needed():
|
3903
|
+
self.cdp.open_new_tab(switch_to=switch_to)
|
3904
|
+
return
|
3899
3905
|
self.wait_for_ready_state_complete()
|
3900
3906
|
if switch_to:
|
3901
3907
|
try:
|
@@ -8067,10 +8073,6 @@ class BaseCase(unittest.TestCase):
|
|
8067
8073
|
else:
|
8068
8074
|
found = False
|
8069
8075
|
message = entry["message"]
|
8070
|
-
if message.count(" - Failed to load resource") == 1:
|
8071
|
-
message = message.split(
|
8072
|
-
" - Failed to load resource"
|
8073
|
-
)[0]
|
8074
8076
|
for substring in exclude:
|
8075
8077
|
substring = str(substring)
|
8076
8078
|
if (
|
@@ -8088,7 +8090,30 @@ class BaseCase(unittest.TestCase):
|
|
8088
8090
|
u_c_t_e = " Uncaught TypeError: "
|
8089
8091
|
if f_t_l_r in errors[n]["message"]:
|
8090
8092
|
url = errors[n]["message"].split(f_t_l_r)[0]
|
8091
|
-
|
8093
|
+
if "status of 400" in errors[n]["message"]:
|
8094
|
+
errors[n] = {"Error 400 (Bad Request)": url}
|
8095
|
+
elif "status of 401" in errors[n]["message"]:
|
8096
|
+
errors[n] = {"Error 401 (Unauthorized)": url}
|
8097
|
+
elif "status of 402" in errors[n]["message"]:
|
8098
|
+
errors[n] = {"Error 402 (Payment Required)": url}
|
8099
|
+
elif "status of 403" in errors[n]["message"]:
|
8100
|
+
errors[n] = {"Error 403 (Forbidden)": url}
|
8101
|
+
elif "status of 404" in errors[n]["message"]:
|
8102
|
+
errors[n] = {"Error 404 (Not Found)": url}
|
8103
|
+
elif "status of 405" in errors[n]["message"]:
|
8104
|
+
errors[n] = {"Error 405 (Method Not Allowed)": url}
|
8105
|
+
elif "status of 406" in errors[n]["message"]:
|
8106
|
+
errors[n] = {"Error 406 (Not Acceptable)": url}
|
8107
|
+
elif "status of 407" in errors[n]["message"]:
|
8108
|
+
errors[n] = {"Error 407 (Proxy Auth Required)": url}
|
8109
|
+
elif "status of 408" in errors[n]["message"]:
|
8110
|
+
errors[n] = {"Error 408 (Request Timeout)": url}
|
8111
|
+
elif "status of 409" in errors[n]["message"]:
|
8112
|
+
errors[n] = {"Error 409 (Conflict)": url}
|
8113
|
+
elif "status of 410" in errors[n]["message"]:
|
8114
|
+
errors[n] = {"Error 410 (Gone)": url}
|
8115
|
+
else:
|
8116
|
+
errors[n] = {"Failed to load resource": url}
|
8092
8117
|
elif u_c_s_e in errors[n]["message"]:
|
8093
8118
|
url = errors[n]["message"].split(u_c_s_e)[0]
|
8094
8119
|
error = errors[n]["message"].split(u_c_s_e)[1]
|
@@ -8778,6 +8803,9 @@ class BaseCase(unittest.TestCase):
|
|
8778
8803
|
self.__check_scope()
|
8779
8804
|
if not self.__is_valid_storage_url():
|
8780
8805
|
raise WebDriverException("Local Storage is not available here!")
|
8806
|
+
if self.__is_cdp_swap_needed():
|
8807
|
+
self.cdp.set_local_storage_item(key, value)
|
8808
|
+
return
|
8781
8809
|
self.execute_script(
|
8782
8810
|
"window.localStorage.setItem('{}', '{}');".format(key, value)
|
8783
8811
|
)
|
@@ -8786,6 +8814,8 @@ class BaseCase(unittest.TestCase):
|
|
8786
8814
|
self.__check_scope()
|
8787
8815
|
if not self.__is_valid_storage_url():
|
8788
8816
|
raise WebDriverException("Local Storage is not available here!")
|
8817
|
+
if self.__is_cdp_swap_needed():
|
8818
|
+
return self.cdp.get_local_storage_item(key)
|
8789
8819
|
return self.execute_script(
|
8790
8820
|
"return window.localStorage.getItem('{}');".format(key)
|
8791
8821
|
)
|
@@ -8837,6 +8867,9 @@ class BaseCase(unittest.TestCase):
|
|
8837
8867
|
self.__check_scope()
|
8838
8868
|
if not self.__is_valid_storage_url():
|
8839
8869
|
raise WebDriverException("Session Storage is not available here!")
|
8870
|
+
if self.__is_cdp_swap_needed():
|
8871
|
+
self.cdp.set_session_storage_item(key, value)
|
8872
|
+
return
|
8840
8873
|
self.execute_script(
|
8841
8874
|
"window.sessionStorage.setItem('{}', '{}');".format(key, value)
|
8842
8875
|
)
|
@@ -8845,6 +8878,8 @@ class BaseCase(unittest.TestCase):
|
|
8845
8878
|
self.__check_scope()
|
8846
8879
|
if not self.__is_valid_storage_url():
|
8847
8880
|
raise WebDriverException("Session Storage is not available here!")
|
8881
|
+
if self.__is_cdp_swap_needed():
|
8882
|
+
return self.cdp.get_session_storage_item(key)
|
8848
8883
|
return self.execute_script(
|
8849
8884
|
"return window.sessionStorage.getItem('{}');".format(key)
|
8850
8885
|
)
|
@@ -10339,7 +10374,7 @@ class BaseCase(unittest.TestCase):
|
|
10339
10374
|
timeout = self.__get_new_timeout(timeout)
|
10340
10375
|
selector, by = self.__recalculate_selector(selector, by)
|
10341
10376
|
if self.__is_cdp_swap_needed():
|
10342
|
-
return self.cdp.
|
10377
|
+
return self.cdp.wait_for_text_not_visible(
|
10343
10378
|
text, selector=selector, timeout=timeout
|
10344
10379
|
)
|
10345
10380
|
return page_actions.wait_for_text_not_visible(
|
@@ -781,6 +781,23 @@ def Driver(
|
|
781
781
|
swiftshader = False
|
782
782
|
if locale is not None and locale_code is None:
|
783
783
|
locale_code = locale
|
784
|
+
if locale_code is None:
|
785
|
+
if '--locale="' in arg_join:
|
786
|
+
locale_code = (
|
787
|
+
arg_join.split('--locale="')[1].split('"')[0]
|
788
|
+
)
|
789
|
+
elif '--locale=' in arg_join:
|
790
|
+
locale_code = (
|
791
|
+
arg_join.split('--locale=')[1].split(' ')[0]
|
792
|
+
)
|
793
|
+
elif '--locale-code="' in arg_join:
|
794
|
+
locale_code = (
|
795
|
+
arg_join.split('--locale-code="')[1].split('"')[0]
|
796
|
+
)
|
797
|
+
elif '--locale-code=' in arg_join:
|
798
|
+
locale_code = (
|
799
|
+
arg_join.split('--locale-code=')[1].split(' ')[0]
|
800
|
+
)
|
784
801
|
if ad_block is not None and ad_block_on is None:
|
785
802
|
ad_block_on = ad_block
|
786
803
|
if ad_block_on is None:
|
@@ -942,6 +942,23 @@ def SB(
|
|
942
942
|
swiftshader = False
|
943
943
|
if locale is not None and locale_code is None:
|
944
944
|
locale_code = locale
|
945
|
+
if locale_code is None:
|
946
|
+
if '--locale="' in arg_join:
|
947
|
+
locale_code = (
|
948
|
+
arg_join.split('--locale="')[1].split('"')[0]
|
949
|
+
)
|
950
|
+
elif '--locale=' in arg_join:
|
951
|
+
locale_code = (
|
952
|
+
arg_join.split('--locale=')[1].split(' ')[0]
|
953
|
+
)
|
954
|
+
elif '--locale-code="' in arg_join:
|
955
|
+
locale_code = (
|
956
|
+
arg_join.split('--locale-code="')[1].split('"')[0]
|
957
|
+
)
|
958
|
+
elif '--locale-code=' in arg_join:
|
959
|
+
locale_code = (
|
960
|
+
arg_join.split('--locale-code=')[1].split(' ')[0]
|
961
|
+
)
|
945
962
|
if ad_block is not None and ad_block_on is None:
|
946
963
|
ad_block_on = ad_block
|
947
964
|
if ad_block_on is None:
|
@@ -792,7 +792,7 @@ class CookieJar:
|
|
792
792
|
connection = self._browser.connection
|
793
793
|
cookies = await connection.send(cdp.network.get_cookies())
|
794
794
|
if cookies:
|
795
|
-
await connection.send(cdp.
|
795
|
+
await connection.send(cdp.storage.clear_cookies())
|
796
796
|
|
797
797
|
|
798
798
|
class HTTPApi:
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.2
|
2
2
|
Name: seleniumbase
|
3
|
-
Version: 4.35.
|
3
|
+
Version: 4.35.7
|
4
4
|
Summary: A complete web automation framework for end-to-end testing.
|
5
5
|
Home-page: https://github.com/seleniumbase/SeleniumBase
|
6
6
|
Author: Michael Mintz
|
@@ -62,24 +62,24 @@ License-File: LICENSE
|
|
62
62
|
Requires-Dist: pip>=25.0.1
|
63
63
|
Requires-Dist: packaging>=24.2
|
64
64
|
Requires-Dist: setuptools~=70.2; python_version < "3.10"
|
65
|
-
Requires-Dist: setuptools>=
|
65
|
+
Requires-Dist: setuptools>=76.0.0; python_version >= "3.10"
|
66
66
|
Requires-Dist: wheel>=0.45.1
|
67
67
|
Requires-Dist: attrs>=25.1.0
|
68
68
|
Requires-Dist: certifi>=2025.1.31
|
69
69
|
Requires-Dist: exceptiongroup>=1.2.2
|
70
70
|
Requires-Dist: websockets~=13.1; python_version < "3.9"
|
71
|
-
Requires-Dist: websockets>=15.0; python_version >= "3.9"
|
71
|
+
Requires-Dist: websockets>=15.0.1; python_version >= "3.9"
|
72
72
|
Requires-Dist: filelock~=3.16.1; python_version < "3.9"
|
73
73
|
Requires-Dist: filelock>=3.17.0; python_version >= "3.9"
|
74
74
|
Requires-Dist: fasteners>=0.19
|
75
|
-
Requires-Dist: mycdp>=1.1.
|
75
|
+
Requires-Dist: mycdp>=1.1.1
|
76
76
|
Requires-Dist: pynose>=1.5.4
|
77
77
|
Requires-Dist: platformdirs>=4.3.6
|
78
78
|
Requires-Dist: typing-extensions>=4.12.2
|
79
79
|
Requires-Dist: sbvirtualdisplay>=1.4.0
|
80
80
|
Requires-Dist: MarkupSafe==2.1.5; python_version < "3.9"
|
81
81
|
Requires-Dist: MarkupSafe>=3.0.2; python_version >= "3.9"
|
82
|
-
Requires-Dist: Jinja2>=3.1.
|
82
|
+
Requires-Dist: Jinja2>=3.1.6
|
83
83
|
Requires-Dist: six>=1.17.0
|
84
84
|
Requires-Dist: parse>=1.20.2
|
85
85
|
Requires-Dist: parse-type>=0.6.4
|
@@ -105,7 +105,8 @@ Requires-Dist: wsproto==1.2.0
|
|
105
105
|
Requires-Dist: websocket-client==1.8.0
|
106
106
|
Requires-Dist: selenium==4.27.1; python_version < "3.9"
|
107
107
|
Requires-Dist: selenium==4.29.0; python_version >= "3.9"
|
108
|
-
Requires-Dist: cssselect==1.2.0
|
108
|
+
Requires-Dist: cssselect==1.2.0; python_version < "3.9"
|
109
|
+
Requires-Dist: cssselect==1.3.0; python_version >= "3.9"
|
109
110
|
Requires-Dist: sortedcontainers==2.4.0
|
110
111
|
Requires-Dist: execnet==2.1.1
|
111
112
|
Requires-Dist: iniconfig==2.0.0
|
@@ -205,7 +206,6 @@ Dynamic: summary
|
|
205
206
|
|
206
207
|
<p align="center"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/super_logo_sb3.png" alt="SeleniumBase" title="SeleniumBase" width="350" /></a></p>
|
207
208
|
|
208
|
-
|
209
209
|
<p align="center" class="hero__title"><b>All-in-one Browser Automation Framework:<br />Web Crawling / Testing / Scraping / Stealth</b></p>
|
210
210
|
|
211
211
|
<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/releases" target="_blank"><img src="https://img.shields.io/github/v/release/seleniumbase/SeleniumBase.svg?color=22AAEE" alt="GitHub version" /></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://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://discord.gg/EdhQTn3EyE" target="_blank"><img src="https://img.shields.io/badge/join-discord-infomational" alt="Join the SeleniumBase chat on Discord"/></a></p>
|
@@ -248,7 +248,9 @@ Dynamic: summary
|
|
248
248
|
<br />
|
249
249
|
</p>
|
250
250
|
|
251
|
-
<p
|
251
|
+
<p align="center"><a href="https://trendshift.io/repositories/12493" target="_blank"><img src="https://trendshift.io/api/badge/repositories/12493" alt="seleniumbase%2FSeleniumBase | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a></p>
|
252
|
+
|
253
|
+
<p>SeleniumBase is the professional toolkit for web automation. Built for testing websites, bypassing CAPTCHAs, completing tasks, and scaling your business.</p>
|
252
254
|
|
253
255
|
--------
|
254
256
|
|
@@ -275,7 +277,7 @@ with SB(test=True, uc=True) as sb:
|
|
275
277
|
|
276
278
|
> `python raw_google.py`
|
277
279
|
|
278
|
-
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_google.py"><img src="https://seleniumbase.github.io/cdn/gif/google_search.gif" alt="SeleniumBase Test" title="SeleniumBase Test" width="
|
280
|
+
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_google.py"><img src="https://seleniumbase.github.io/cdn/gif/google_search.gif" alt="SeleniumBase Test" title="SeleniumBase Test" width="480" /></a>
|
279
281
|
|
280
282
|
--------
|
281
283
|
|
@@ -1587,5 +1589,5 @@ pytest --reruns=1 --reruns-delay=1
|
|
1587
1589
|
<div><a href="https://seleniumbase.io"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg" alt="SeleniumBase Docs" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/LICENSE"><img src="https://img.shields.io/badge/license-MIT-22BBCC.svg" title="SeleniumBase" /></a></div>
|
1588
1590
|
<div><a href="https://github.com/seleniumbase/SeleniumBase"><img src="https://img.shields.io/badge/tested%20with-SeleniumBase-04C38E.svg" alt="Tested with SeleniumBase" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/stargazers"><img src="https://img.shields.io/github/stars/seleniumbase/seleniumbase.svg?color=19A57B" title="Stargazers" /></a></div>
|
1589
1591
|
<div><a href="https://hellogithub.com/repository/c6be2d0f1969448697683d11a4ff915e" target="_blank"><img src="https://abroad.hellogithub.com/v1/widgets/recommend.svg?rid=c6be2d0f1969448697683d11a4ff915e&claim_uid=xcrm4p9j3d6JCO5&theme=small" alt="Featured|HelloGitHub" /></a> <a href="https://discord.gg/EdhQTn3EyE" target="_blank"><img src="https://img.shields.io/badge/join-discord-infomational" alt="Join the SeleniumBase chat on Discord"/></a> <a href="https://gitter.im/seleniumbase/SeleniumBase" target="_blank"><img src="https://img.shields.io/gitter/room/seleniumbase/SeleniumBase.svg" alt="Gitter chat"/></a></div>
|
1590
|
-
<div><a href="https://pepy.tech/
|
1592
|
+
<div><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> <img src="https://views.whatilearened.today/views/github/seleniumbase/SeleniumBase.svg" width="98px" height="20px" alt="Views" /></div>
|
1591
1593
|
<div align="left"></div>
|