seleniumbase 4.44.1__tar.gz → 4.45.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.44.1/seleniumbase.egg-info → seleniumbase-4.45.1}/PKG-INFO +71 -92
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/README.md +22 -21
- seleniumbase-4.45.1/requirements.txt +84 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/__version__.py +1 -1
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/behave/behave_sb.py +8 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/console_scripts/sb_install.py +6 -10
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/console_scripts/sb_mkrec.py +20 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/console_scripts/sb_recorder.py +38 -3
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/core/browser_launcher.py +164 -95
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/core/detect_b_ver.py +8 -6
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/core/log_helper.py +11 -16
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/core/mysql.py +1 -1
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/core/report_helper.py +3 -7
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/core/sb_cdp.py +321 -85
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/core/sb_driver.py +36 -5
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/core/session_helper.py +2 -4
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/fixtures/base_case.py +208 -152
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/fixtures/constants.py +1 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/fixtures/js_utils.py +52 -14
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/fixtures/page_actions.py +18 -7
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/fixtures/page_utils.py +4 -2
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/fixtures/shared_utils.py +2 -4
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/masterqa/master_qa.py +16 -2
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/plugins/base_plugin.py +8 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/plugins/driver_manager.py +4 -1
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/plugins/pytest_plugin.py +24 -54
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/plugins/sb_manager.py +14 -15
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/plugins/selenium_plugin.py +5 -10
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/undetected/__init__.py +11 -10
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/undetected/cdp.py +1 -12
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/undetected/cdp_driver/browser.py +259 -106
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/undetected/cdp_driver/cdp_util.py +25 -1
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/undetected/cdp_driver/config.py +19 -11
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/undetected/cdp_driver/connection.py +4 -35
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/undetected/cdp_driver/element.py +81 -21
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/undetected/cdp_driver/tab.py +381 -39
- {seleniumbase-4.44.1 → seleniumbase-4.45.1/seleniumbase.egg-info}/PKG-INFO +71 -92
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase.egg-info/requires.txt +47 -87
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/setup.py +60 -79
- seleniumbase-4.44.1/requirements.txt +0 -101
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/.gitignore +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/LICENSE +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/MANIFEST.in +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/install.sh +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/pyproject.toml +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/pytest.ini +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/sbase/__init__.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/sbase/__main__.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/sbase/steps.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/__init__.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/__main__.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/behave/__init__.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/behave/behave_helper.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/behave/steps.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/common/__init__.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/common/decorators.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/common/encryption.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/common/exceptions.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/common/obfuscate.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/common/unobfuscate.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/config/__init__.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/config/ad_block_list.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/config/proxy_list.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/config/settings.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/console_scripts/__init__.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/console_scripts/logo_helper.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/console_scripts/rich_helper.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/console_scripts/run.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/console_scripts/sb_commander.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/console_scripts/sb_objectify.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/console_scripts/sb_print.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/core/__init__.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/core/application_manager.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/core/capabilities_parser.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/core/colored_traceback.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/core/create_db_tables.sql +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/core/download_helper.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/core/encoded_images.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/core/jqc_helper.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/core/proxy_helper.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/core/recorder_helper.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/core/s3_manager.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/core/settings_parser.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/core/style_sheet.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/core/testcase_manager.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/core/tour_helper.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/core/visual_helper.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/drivers/__init__.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/drivers/atlas_drivers/__init__.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/drivers/brave_drivers/__init__.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/drivers/cft_drivers/__init__.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/drivers/chs_drivers/__init__.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/drivers/comet_drivers/__init__.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/drivers/opera_drivers/__init__.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/extensions/__init__.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/extensions/ad_block.zip +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/extensions/disable_csp.zip +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/extensions/recorder.zip +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/extensions/sbase_ext.zip +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/fixtures/__init__.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/fixtures/css_to_xpath.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/fixtures/errors.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/fixtures/unittest_helper.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/fixtures/words.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/fixtures/xpath_to_css.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/js_code/__init__.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/js_code/active_css_js.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/js_code/live_js.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/js_code/recorder_js.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/masterqa/__init__.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/plugins/__init__.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/plugins/basic_test_info.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/plugins/page_source.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/plugins/screen_shots.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/resources/__init__.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/translate/__init__.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/translate/chinese.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/translate/dutch.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/translate/french.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/translate/italian.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/translate/japanese.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/translate/korean.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/translate/master_dict.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/translate/portuguese.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/translate/russian.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/translate/spanish.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/translate/translator.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/undetected/cdp_driver/__init__.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/undetected/dprocess.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/undetected/options.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/undetected/patcher.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/undetected/reactor.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/undetected/webelement.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/utilities/__init__.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/utilities/selenium_grid/font_color +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase.egg-info/SOURCES.txt +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase.egg-info/dependency_links.txt +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase.egg-info/entry_points.txt +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/seleniumbase.egg-info/top_level.txt +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/setup.cfg +0 -0
- {seleniumbase-4.44.1 → seleniumbase-4.45.1}/virtualenv_install.sh +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: seleniumbase
|
|
3
|
-
Version: 4.
|
|
3
|
+
Version: 4.45.1
|
|
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
|
|
@@ -33,7 +33,6 @@ Classifier: Operating System :: Microsoft :: Windows
|
|
|
33
33
|
Classifier: Operating System :: POSIX :: Linux
|
|
34
34
|
Classifier: Programming Language :: Python
|
|
35
35
|
Classifier: Programming Language :: Python :: 3
|
|
36
|
-
Classifier: Programming Language :: Python :: 3.8
|
|
37
36
|
Classifier: Programming Language :: Python :: 3.9
|
|
38
37
|
Classifier: Programming Language :: Python :: 3.10
|
|
39
38
|
Classifier: Programming Language :: Python :: 3.11
|
|
@@ -56,35 +55,28 @@ Classifier: Topic :: Software Development :: Testing
|
|
|
56
55
|
Classifier: Topic :: Software Development :: Testing :: Acceptance
|
|
57
56
|
Classifier: Topic :: Software Development :: Testing :: Traffic Generation
|
|
58
57
|
Classifier: Topic :: Utilities
|
|
59
|
-
Requires-Python: >=3.
|
|
58
|
+
Requires-Python: >=3.9
|
|
60
59
|
Description-Content-Type: text/markdown
|
|
61
60
|
License-File: LICENSE
|
|
62
|
-
Requires-Dist: pip>=25.
|
|
63
|
-
Requires-Dist: pip>=25.3; python_version >= "3.9"
|
|
61
|
+
Requires-Dist: pip>=25.3
|
|
64
62
|
Requires-Dist: packaging>=25.0
|
|
65
63
|
Requires-Dist: setuptools~=70.2; python_version < "3.10"
|
|
66
64
|
Requires-Dist: setuptools>=80.9.0; python_version >= "3.10"
|
|
67
65
|
Requires-Dist: wheel>=0.45.1
|
|
68
|
-
Requires-Dist: attrs
|
|
69
|
-
Requires-Dist:
|
|
70
|
-
Requires-Dist:
|
|
71
|
-
Requires-Dist:
|
|
72
|
-
Requires-Dist:
|
|
73
|
-
Requires-Dist: websockets>=15.0.1; python_version >= "3.9"
|
|
74
|
-
Requires-Dist: filelock~=3.16.1; python_version < "3.9"
|
|
75
|
-
Requires-Dist: filelock~=3.19.1; python_version >= "3.9" and python_version < "3.10"
|
|
66
|
+
Requires-Dist: attrs>=25.4.0
|
|
67
|
+
Requires-Dist: certifi>=2025.11.12
|
|
68
|
+
Requires-Dist: exceptiongroup>=1.3.1
|
|
69
|
+
Requires-Dist: websockets>=15.0.1
|
|
70
|
+
Requires-Dist: filelock~=3.19.1; python_version < "3.10"
|
|
76
71
|
Requires-Dist: filelock>=3.20.0; python_version >= "3.10"
|
|
77
72
|
Requires-Dist: fasteners>=0.20
|
|
78
|
-
Requires-Dist: mycdp>=1.2
|
|
73
|
+
Requires-Dist: mycdp>=1.3.2
|
|
79
74
|
Requires-Dist: pynose>=1.5.5
|
|
80
|
-
Requires-Dist: platformdirs~=4.
|
|
81
|
-
Requires-Dist: platformdirs
|
|
82
|
-
Requires-Dist:
|
|
83
|
-
Requires-Dist: typing-extensions~=4.13.2; python_version < "3.9"
|
|
84
|
-
Requires-Dist: typing-extensions>=4.15.0; python_version >= "3.9"
|
|
75
|
+
Requires-Dist: platformdirs~=4.4.0; python_version < "3.10"
|
|
76
|
+
Requires-Dist: platformdirs>=4.5.1; python_version >= "3.10"
|
|
77
|
+
Requires-Dist: typing-extensions>=4.15.0
|
|
85
78
|
Requires-Dist: sbvirtualdisplay>=1.4.0
|
|
86
|
-
Requires-Dist: MarkupSafe
|
|
87
|
-
Requires-Dist: MarkupSafe>=3.0.3; python_version >= "3.9"
|
|
79
|
+
Requires-Dist: MarkupSafe>=3.0.3
|
|
88
80
|
Requires-Dist: Jinja2>=3.1.6
|
|
89
81
|
Requires-Dist: six>=1.17.0
|
|
90
82
|
Requires-Dist: parse>=1.20.2
|
|
@@ -94,49 +86,44 @@ Requires-Dist: pyyaml>=6.0.3
|
|
|
94
86
|
Requires-Dist: pygments>=2.19.2
|
|
95
87
|
Requires-Dist: pyreadline3>=3.5.4; platform_system == "Windows"
|
|
96
88
|
Requires-Dist: tabcompleter>=1.4.0
|
|
97
|
-
Requires-Dist: pdbp>=1.8.
|
|
89
|
+
Requires-Dist: pdbp>=1.8.1
|
|
98
90
|
Requires-Dist: idna>=3.11
|
|
99
91
|
Requires-Dist: chardet==5.2.0
|
|
100
92
|
Requires-Dist: charset-normalizer<4,>=3.4.4
|
|
101
93
|
Requires-Dist: urllib3<2,>=1.26.20; python_version < "3.10"
|
|
102
|
-
Requires-Dist: urllib3<
|
|
103
|
-
Requires-Dist: requests
|
|
104
|
-
Requires-Dist: requests~=2.32.5; python_version >= "3.9"
|
|
94
|
+
Requires-Dist: urllib3<3,>=1.26.20; python_version >= "3.10"
|
|
95
|
+
Requires-Dist: requests~=2.32.5
|
|
105
96
|
Requires-Dist: sniffio==1.3.1
|
|
106
97
|
Requires-Dist: h11==0.16.0
|
|
107
98
|
Requires-Dist: outcome==1.3.0.post0
|
|
108
|
-
Requires-Dist: trio
|
|
109
|
-
Requires-Dist: trio<1,>=0.
|
|
99
|
+
Requires-Dist: trio<1,>=0.31.0; python_version < "3.10"
|
|
100
|
+
Requires-Dist: trio<1,>=0.32.0; python_version >= "3.10"
|
|
110
101
|
Requires-Dist: trio-websocket~=0.12.2
|
|
111
|
-
Requires-Dist: wsproto==1.2.0
|
|
112
|
-
Requires-Dist:
|
|
113
|
-
Requires-Dist: websocket-client~=1.9.0
|
|
114
|
-
Requires-Dist: selenium==4.
|
|
115
|
-
Requires-Dist: selenium==4.
|
|
116
|
-
Requires-Dist:
|
|
117
|
-
Requires-Dist:
|
|
118
|
-
Requires-Dist: cssselect==1.3.0; python_version >= "3.9"
|
|
102
|
+
Requires-Dist: wsproto==1.2.0; python_version < "3.10"
|
|
103
|
+
Requires-Dist: wsproto~=1.3.2; python_version >= "3.10"
|
|
104
|
+
Requires-Dist: websocket-client~=1.9.0
|
|
105
|
+
Requires-Dist: selenium==4.32.0; python_version < "3.10"
|
|
106
|
+
Requires-Dist: selenium==4.39.0; python_version >= "3.10"
|
|
107
|
+
Requires-Dist: cssselect==1.3.0
|
|
108
|
+
Requires-Dist: nest-asyncio==1.6.0
|
|
119
109
|
Requires-Dist: sortedcontainers==2.4.0
|
|
120
|
-
Requires-Dist: execnet==2.1.1
|
|
110
|
+
Requires-Dist: execnet==2.1.1; python_version < "3.10"
|
|
111
|
+
Requires-Dist: execnet==2.1.2; python_version >= "3.10"
|
|
121
112
|
Requires-Dist: iniconfig==2.1.0; python_version < "3.10"
|
|
122
113
|
Requires-Dist: iniconfig==2.3.0; python_version >= "3.10"
|
|
123
|
-
Requires-Dist: pluggy==1.
|
|
124
|
-
Requires-Dist:
|
|
125
|
-
Requires-Dist: pytest==
|
|
126
|
-
Requires-Dist: pytest==8.4.2; python_version >= "3.9"
|
|
114
|
+
Requires-Dist: pluggy==1.6.0
|
|
115
|
+
Requires-Dist: pytest==8.4.2; python_version < "3.11"
|
|
116
|
+
Requires-Dist: pytest==9.0.2; python_version >= "3.11"
|
|
127
117
|
Requires-Dist: pytest-html==4.0.2
|
|
128
118
|
Requires-Dist: pytest-metadata==3.1.1
|
|
129
119
|
Requires-Dist: pytest-ordering==0.6
|
|
130
|
-
Requires-Dist: pytest-rerunfailures==
|
|
131
|
-
Requires-Dist: pytest-rerunfailures==16.0.1; python_version >= "3.9" and python_version < "3.10"
|
|
120
|
+
Requires-Dist: pytest-rerunfailures==16.0.1; python_version < "3.10"
|
|
132
121
|
Requires-Dist: pytest-rerunfailures==16.1; python_version >= "3.10"
|
|
133
|
-
Requires-Dist: pytest-xdist==3.
|
|
134
|
-
Requires-Dist: pytest-xdist==3.8.0; python_version >= "3.9"
|
|
122
|
+
Requires-Dist: pytest-xdist==3.8.0
|
|
135
123
|
Requires-Dist: parameterized==0.9.0
|
|
136
124
|
Requires-Dist: behave==1.2.6
|
|
137
|
-
Requires-Dist: soupsieve
|
|
138
|
-
Requires-Dist:
|
|
139
|
-
Requires-Dist: beautifulsoup4~=4.14.2
|
|
125
|
+
Requires-Dist: soupsieve~=2.8
|
|
126
|
+
Requires-Dist: beautifulsoup4~=4.14.3
|
|
140
127
|
Requires-Dist: pyotp==2.9.0
|
|
141
128
|
Requires-Dist: python-xlib==0.33; platform_system == "Linux"
|
|
142
129
|
Requires-Dist: PyAutoGUI>=0.9.54; platform_system == "Linux"
|
|
@@ -149,44 +136,35 @@ Requires-Dist: allure-pytest>=2.13.5; extra == "allure"
|
|
|
149
136
|
Requires-Dist: allure-python-commons>=2.13.5; extra == "allure"
|
|
150
137
|
Requires-Dist: allure-behave>=2.13.5; extra == "allure"
|
|
151
138
|
Provides-Extra: coverage
|
|
152
|
-
Requires-Dist: coverage>=7.
|
|
153
|
-
Requires-Dist: coverage>=7.
|
|
154
|
-
Requires-Dist:
|
|
155
|
-
Requires-Dist: pytest-cov>=5.0.0; python_version < "3.9" and extra == "coverage"
|
|
156
|
-
Requires-Dist: pytest-cov>=7.0.0; python_version >= "3.9" and extra == "coverage"
|
|
139
|
+
Requires-Dist: coverage>=7.10.7; python_version < "3.10" and extra == "coverage"
|
|
140
|
+
Requires-Dist: coverage>=7.13.0; python_version >= "3.10" and extra == "coverage"
|
|
141
|
+
Requires-Dist: pytest-cov>=7.0.0; extra == "coverage"
|
|
157
142
|
Provides-Extra: flake8
|
|
158
|
-
Requires-Dist: flake8==
|
|
159
|
-
Requires-Dist: flake8==7.3.0; python_version >= "3.9" and extra == "flake8"
|
|
143
|
+
Requires-Dist: flake8==7.3.0; extra == "flake8"
|
|
160
144
|
Requires-Dist: mccabe==0.7.0; extra == "flake8"
|
|
161
|
-
Requires-Dist: pyflakes==
|
|
162
|
-
Requires-Dist:
|
|
163
|
-
Requires-Dist: pycodestyle==2.9.1; python_version < "3.9" and extra == "flake8"
|
|
164
|
-
Requires-Dist: pycodestyle==2.14.0; python_version >= "3.9" and extra == "flake8"
|
|
145
|
+
Requires-Dist: pyflakes==3.4.0; extra == "flake8"
|
|
146
|
+
Requires-Dist: pycodestyle==2.14.0; extra == "flake8"
|
|
165
147
|
Provides-Extra: ipdb
|
|
166
148
|
Requires-Dist: ipdb==0.13.13; extra == "ipdb"
|
|
167
149
|
Requires-Dist: ipython==7.34.0; extra == "ipdb"
|
|
168
150
|
Provides-Extra: mss
|
|
169
|
-
Requires-Dist: mss==
|
|
170
|
-
Requires-Dist: mss==10.0.0; python_version >= "3.9" and extra == "mss"
|
|
151
|
+
Requires-Dist: mss==10.1.0; extra == "mss"
|
|
171
152
|
Provides-Extra: pdfminer
|
|
172
|
-
Requires-Dist: pdfminer.six==
|
|
173
|
-
Requires-Dist:
|
|
174
|
-
Requires-Dist:
|
|
175
|
-
Requires-Dist:
|
|
176
|
-
Requires-Dist: cffi==1.17.1; python_version < "3.9" and extra == "pdfminer"
|
|
177
|
-
Requires-Dist: cffi==2.0.0; python_version >= "3.9" and extra == "pdfminer"
|
|
178
|
-
Requires-Dist: pycparser==2.22; python_version < "3.9" and extra == "pdfminer"
|
|
179
|
-
Requires-Dist: pycparser==2.23; python_version >= "3.9" and extra == "pdfminer"
|
|
153
|
+
Requires-Dist: pdfminer.six==20251107; extra == "pdfminer"
|
|
154
|
+
Requires-Dist: cryptography==46.0.3; extra == "pdfminer"
|
|
155
|
+
Requires-Dist: cffi==2.0.0; extra == "pdfminer"
|
|
156
|
+
Requires-Dist: pycparser==2.23; extra == "pdfminer"
|
|
180
157
|
Provides-Extra: pillow
|
|
181
|
-
Requires-Dist: Pillow>=
|
|
182
|
-
Requires-Dist: Pillow>=11.3.0; (python_version >= "3.9" and python_version < "3.10") and extra == "pillow"
|
|
158
|
+
Requires-Dist: Pillow>=11.3.0; python_version < "3.10" and extra == "pillow"
|
|
183
159
|
Requires-Dist: Pillow>=12.0.0; python_version >= "3.10" and extra == "pillow"
|
|
184
160
|
Provides-Extra: pip-system-certs
|
|
185
161
|
Requires-Dist: pip-system-certs==4.0; platform_system == "Windows" and extra == "pip-system-certs"
|
|
186
162
|
Provides-Extra: proxy
|
|
187
163
|
Requires-Dist: proxy.py==2.4.3; extra == "proxy"
|
|
164
|
+
Provides-Extra: playwright
|
|
165
|
+
Requires-Dist: playwright>=1.56.0; extra == "playwright"
|
|
188
166
|
Provides-Extra: psutil
|
|
189
|
-
Requires-Dist: psutil
|
|
167
|
+
Requires-Dist: psutil>=7.1.3; extra == "psutil"
|
|
190
168
|
Provides-Extra: pyautogui
|
|
191
169
|
Requires-Dist: PyAutoGUI>=0.9.54; platform_system != "Linux" and extra == "pyautogui"
|
|
192
170
|
Provides-Extra: selenium-stealth
|
|
@@ -243,11 +221,11 @@ Dynamic: summary
|
|
|
243
221
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/console_scripts/ReadMe.md">🌠 Scripts</a> |
|
|
244
222
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/mobile_testing.md">📱 Mobile</a>
|
|
245
223
|
<br />
|
|
246
|
-
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/method_summary.md">📘
|
|
247
|
-
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/syntax_formats.md"> 🔠
|
|
224
|
+
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/method_summary.md">📘 API</a> |
|
|
225
|
+
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/syntax_formats.md"> 🔠 Syntaxes</a> |
|
|
248
226
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/recorder_mode.md">🔴 Recorder</a> |
|
|
249
227
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/example_logs/ReadMe.md">📊 Dashboard</a> |
|
|
250
|
-
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/locale_codes.md">🗾
|
|
228
|
+
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/locale_codes.md">🗾 Locale</a> |
|
|
251
229
|
<a href="https://seleniumbase.io/devices/?url=seleniumbase.com">💻 Farm</a>
|
|
252
230
|
<br />
|
|
253
231
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/commander.md">🎖️ GUI</a> |
|
|
@@ -258,44 +236,45 @@ Dynamic: summary
|
|
|
258
236
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/utilities/selenium_grid/ReadMe.md">🌐 Grid</a>
|
|
259
237
|
<br />
|
|
260
238
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/how_it_works.md">👁️ How</a> |
|
|
261
|
-
<a href="https://github.com/seleniumbase/SeleniumBase/tree/master/examples/migration/raw_selenium">🚝
|
|
262
|
-
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/
|
|
263
|
-
<a href="https://github.com/seleniumbase/SeleniumBase/
|
|
264
|
-
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/master_qa/ReadMe.md">🧬 Hybrid</a> |
|
|
239
|
+
<a href="https://github.com/seleniumbase/SeleniumBase/tree/master/examples/migration/raw_selenium">🚝 Migration</a> |
|
|
240
|
+
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/ReadMe.md">🎭 Stealthy Playwright</a> |
|
|
241
|
+
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/master_qa/ReadMe.md">🛂 MasterQA</a> |
|
|
265
242
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/tour_examples/ReadMe.md">🚎 Tours</a>
|
|
266
243
|
<br />
|
|
267
244
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/integrations/github/workflows/ReadMe.md">🤖 CI/CD</a> |
|
|
268
245
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/js_package_manager.md">🕹️ JSMgr</a> |
|
|
269
246
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/translations.md">🌏 Translator</a> |
|
|
270
247
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/presenter/ReadMe.md">🎞️ Presenter</a> |
|
|
271
|
-
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/
|
|
272
|
-
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/
|
|
248
|
+
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/visual_testing/ReadMe.md">🖼️ Visual</a> |
|
|
249
|
+
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/case_plans.md">🗂️ CPlans</a>
|
|
273
250
|
<br />
|
|
274
251
|
</p>
|
|
275
252
|
|
|
276
|
-
<p>SeleniumBase is a browser automation framework
|
|
253
|
+
<p>SeleniumBase is a browser automation framework that empowers software teams to innovate faster and handle modern web challenges with ease. With stealth options like CDP Mode, you'll avoid the usual restrictions imposed by websites deploying bot-detection services.</p>
|
|
277
254
|
|
|
278
255
|
--------
|
|
279
256
|
|
|
280
257
|
📚 Learn from [**over 200 examples** in the **SeleniumBase/examples/** folder](https://github.com/seleniumbase/SeleniumBase/tree/master/examples).
|
|
281
258
|
|
|
282
|
-
🐙 Stealth modes: <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/uc_mode.md"><b>UC Mode</b></a> and <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md"><b>CDP Mode</b></a>
|
|
259
|
+
🐙 Stealth modes: <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/uc_mode.md"><b>UC Mode</b></a> and <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md"><b>CDP Mode</b></a> can bypass bot-detection, solve CAPTCHAs, and call advanced methods from the <a href="https://chromedevtools.github.io/devtools-protocol/" translate="no">Chrome Devtools Protocol</a>.
|
|
283
260
|
|
|
284
|
-
ℹ️
|
|
261
|
+
ℹ️ Many examples run with raw <code translate="no"><b>python</b></code>, although some use <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/syntax_formats.md">Syntax Formats</a> that expect <a href="https://docs.pytest.org/en/latest/how-to/usage.html" translate="no"><b>pytest</b></a> (a Python unit-testing framework included with SeleniumBase that can discover, collect, and run tests automatically).
|
|
285
262
|
|
|
286
263
|
--------
|
|
287
264
|
|
|
288
|
-
<p align="left">📗
|
|
265
|
+
<p align="left">📗 This script performs a Google Search using SeleniumBase UC Mode + CDP Mode:<br /><a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_google.py">SeleniumBase/examples/raw_google.py</a> (Results are saved as PDF, HTML, and PNG)</p>
|
|
289
266
|
|
|
290
267
|
```python
|
|
291
268
|
from seleniumbase import SB
|
|
292
269
|
|
|
293
|
-
with SB(
|
|
294
|
-
|
|
270
|
+
with SB(uc=True, test=True) as sb:
|
|
271
|
+
url = "https://google.com/ncr"
|
|
272
|
+
sb.activate_cdp_mode(url)
|
|
295
273
|
sb.type('[title="Search"]', "SeleniumBase GitHub page")
|
|
296
274
|
sb.click("div:not([jsname]) > * > input")
|
|
275
|
+
sb.sleep(2)
|
|
297
276
|
print(sb.get_page_title())
|
|
298
|
-
sb.sleep(
|
|
277
|
+
sb.sleep(1) # Wait for the "AI Overview" result
|
|
299
278
|
if sb.is_text_visible("Generating"):
|
|
300
279
|
sb.wait_for_text("AI Overview")
|
|
301
280
|
sb.save_as_pdf_to_logs() # Saved to ./latest_logs/
|
|
@@ -317,8 +296,8 @@ from seleniumbase import SB
|
|
|
317
296
|
with SB(uc=True, test=True, locale="en") as sb:
|
|
318
297
|
url = "https://gitlab.com/users/sign_in"
|
|
319
298
|
sb.activate_cdp_mode(url)
|
|
320
|
-
sb.sleep(2
|
|
321
|
-
sb.
|
|
299
|
+
sb.sleep(2)
|
|
300
|
+
sb.solve_captcha()
|
|
322
301
|
# (The rest is for testing and demo purposes)
|
|
323
302
|
sb.assert_text("Username", '[for="user_login"]', timeout=3)
|
|
324
303
|
sb.assert_element('label[for="user_login"]')
|
|
@@ -335,9 +314,9 @@ with SB(uc=True, test=True, locale="en") as sb:
|
|
|
335
314
|
from seleniumbase import sb_cdp
|
|
336
315
|
|
|
337
316
|
url = "https://gitlab.com/users/sign_in"
|
|
338
|
-
sb = sb_cdp.Chrome(url)
|
|
339
|
-
sb.sleep(2
|
|
340
|
-
sb.
|
|
317
|
+
sb = sb_cdp.Chrome(url, incognito=True)
|
|
318
|
+
sb.sleep(2)
|
|
319
|
+
sb.solve_captcha()
|
|
341
320
|
sb.highlight('h1:contains("GitLab")')
|
|
342
321
|
sb.highlight('button:contains("Sign in")')
|
|
343
322
|
sb.driver.stop()
|
|
@@ -24,11 +24,11 @@
|
|
|
24
24
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/console_scripts/ReadMe.md">🌠 Scripts</a> |
|
|
25
25
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/mobile_testing.md">📱 Mobile</a>
|
|
26
26
|
<br />
|
|
27
|
-
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/method_summary.md">📘
|
|
28
|
-
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/syntax_formats.md"> 🔠
|
|
27
|
+
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/method_summary.md">📘 API</a> |
|
|
28
|
+
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/syntax_formats.md"> 🔠 Syntaxes</a> |
|
|
29
29
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/recorder_mode.md">🔴 Recorder</a> |
|
|
30
30
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/example_logs/ReadMe.md">📊 Dashboard</a> |
|
|
31
|
-
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/locale_codes.md">🗾
|
|
31
|
+
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/locale_codes.md">🗾 Locale</a> |
|
|
32
32
|
<a href="https://seleniumbase.io/devices/?url=seleniumbase.com">💻 Farm</a>
|
|
33
33
|
<br />
|
|
34
34
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/commander.md">🎖️ GUI</a> |
|
|
@@ -39,44 +39,45 @@
|
|
|
39
39
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/utilities/selenium_grid/ReadMe.md">🌐 Grid</a>
|
|
40
40
|
<br />
|
|
41
41
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/how_it_works.md">👁️ How</a> |
|
|
42
|
-
<a href="https://github.com/seleniumbase/SeleniumBase/tree/master/examples/migration/raw_selenium">🚝
|
|
43
|
-
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/
|
|
44
|
-
<a href="https://github.com/seleniumbase/SeleniumBase/
|
|
45
|
-
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/master_qa/ReadMe.md">🧬 Hybrid</a> |
|
|
42
|
+
<a href="https://github.com/seleniumbase/SeleniumBase/tree/master/examples/migration/raw_selenium">🚝 Migration</a> |
|
|
43
|
+
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/ReadMe.md">🎭 Stealthy Playwright</a> |
|
|
44
|
+
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/master_qa/ReadMe.md">🛂 MasterQA</a> |
|
|
46
45
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/tour_examples/ReadMe.md">🚎 Tours</a>
|
|
47
46
|
<br />
|
|
48
47
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/integrations/github/workflows/ReadMe.md">🤖 CI/CD</a> |
|
|
49
48
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/js_package_manager.md">🕹️ JSMgr</a> |
|
|
50
49
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/translations.md">🌏 Translator</a> |
|
|
51
50
|
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/presenter/ReadMe.md">🎞️ Presenter</a> |
|
|
52
|
-
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/
|
|
53
|
-
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/
|
|
51
|
+
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/visual_testing/ReadMe.md">🖼️ Visual</a> |
|
|
52
|
+
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/case_plans.md">🗂️ CPlans</a>
|
|
54
53
|
<br />
|
|
55
54
|
</p>
|
|
56
55
|
|
|
57
|
-
<p>SeleniumBase is a browser automation framework
|
|
56
|
+
<p>SeleniumBase is a browser automation framework that empowers software teams to innovate faster and handle modern web challenges with ease. With stealth options like CDP Mode, you'll avoid the usual restrictions imposed by websites deploying bot-detection services.</p>
|
|
58
57
|
|
|
59
58
|
--------
|
|
60
59
|
|
|
61
60
|
📚 Learn from [**over 200 examples** in the **SeleniumBase/examples/** folder](https://github.com/seleniumbase/SeleniumBase/tree/master/examples).
|
|
62
61
|
|
|
63
|
-
🐙 Stealth modes: <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/uc_mode.md"><b>UC Mode</b></a> and <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md"><b>CDP Mode</b></a>
|
|
62
|
+
🐙 Stealth modes: <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/uc_mode.md"><b>UC Mode</b></a> and <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md"><b>CDP Mode</b></a> can bypass bot-detection, solve CAPTCHAs, and call advanced methods from the <a href="https://chromedevtools.github.io/devtools-protocol/" translate="no">Chrome Devtools Protocol</a>.
|
|
64
63
|
|
|
65
|
-
ℹ️
|
|
64
|
+
ℹ️ Many examples run with raw <code translate="no"><b>python</b></code>, although some use <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/syntax_formats.md">Syntax Formats</a> that expect <a href="https://docs.pytest.org/en/latest/how-to/usage.html" translate="no"><b>pytest</b></a> (a Python unit-testing framework included with SeleniumBase that can discover, collect, and run tests automatically).
|
|
66
65
|
|
|
67
66
|
--------
|
|
68
67
|
|
|
69
|
-
<p align="left">📗
|
|
68
|
+
<p align="left">📗 This script performs a Google Search using SeleniumBase UC Mode + CDP Mode:<br /><a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_google.py">SeleniumBase/examples/raw_google.py</a> (Results are saved as PDF, HTML, and PNG)</p>
|
|
70
69
|
|
|
71
70
|
```python
|
|
72
71
|
from seleniumbase import SB
|
|
73
72
|
|
|
74
|
-
with SB(
|
|
75
|
-
|
|
73
|
+
with SB(uc=True, test=True) as sb:
|
|
74
|
+
url = "https://google.com/ncr"
|
|
75
|
+
sb.activate_cdp_mode(url)
|
|
76
76
|
sb.type('[title="Search"]', "SeleniumBase GitHub page")
|
|
77
77
|
sb.click("div:not([jsname]) > * > input")
|
|
78
|
+
sb.sleep(2)
|
|
78
79
|
print(sb.get_page_title())
|
|
79
|
-
sb.sleep(
|
|
80
|
+
sb.sleep(1) # Wait for the "AI Overview" result
|
|
80
81
|
if sb.is_text_visible("Generating"):
|
|
81
82
|
sb.wait_for_text("AI Overview")
|
|
82
83
|
sb.save_as_pdf_to_logs() # Saved to ./latest_logs/
|
|
@@ -98,8 +99,8 @@ from seleniumbase import SB
|
|
|
98
99
|
with SB(uc=True, test=True, locale="en") as sb:
|
|
99
100
|
url = "https://gitlab.com/users/sign_in"
|
|
100
101
|
sb.activate_cdp_mode(url)
|
|
101
|
-
sb.sleep(2
|
|
102
|
-
sb.
|
|
102
|
+
sb.sleep(2)
|
|
103
|
+
sb.solve_captcha()
|
|
103
104
|
# (The rest is for testing and demo purposes)
|
|
104
105
|
sb.assert_text("Username", '[for="user_login"]', timeout=3)
|
|
105
106
|
sb.assert_element('label[for="user_login"]')
|
|
@@ -116,9 +117,9 @@ with SB(uc=True, test=True, locale="en") as sb:
|
|
|
116
117
|
from seleniumbase import sb_cdp
|
|
117
118
|
|
|
118
119
|
url = "https://gitlab.com/users/sign_in"
|
|
119
|
-
sb = sb_cdp.Chrome(url)
|
|
120
|
-
sb.sleep(2
|
|
121
|
-
sb.
|
|
120
|
+
sb = sb_cdp.Chrome(url, incognito=True)
|
|
121
|
+
sb.sleep(2)
|
|
122
|
+
sb.solve_captcha()
|
|
122
123
|
sb.highlight('h1:contains("GitLab")')
|
|
123
124
|
sb.highlight('button:contains("Sign in")')
|
|
124
125
|
sb.driver.stop()
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
pip>=25.3
|
|
2
|
+
packaging>=25.0
|
|
3
|
+
setuptools~=70.2;python_version<"3.10"
|
|
4
|
+
setuptools>=80.9.0;python_version>="3.10"
|
|
5
|
+
wheel>=0.45.1
|
|
6
|
+
attrs>=25.4.0
|
|
7
|
+
certifi>=2025.11.12
|
|
8
|
+
exceptiongroup>=1.3.1
|
|
9
|
+
websockets>=15.0.1
|
|
10
|
+
filelock~=3.19.1;python_version<"3.10"
|
|
11
|
+
filelock>=3.20.0;python_version>="3.10"
|
|
12
|
+
fasteners>=0.20
|
|
13
|
+
mycdp>=1.3.2
|
|
14
|
+
pynose>=1.5.5
|
|
15
|
+
platformdirs~=4.4.0;python_version<"3.10"
|
|
16
|
+
platformdirs>=4.5.1;python_version>="3.10"
|
|
17
|
+
typing-extensions>=4.15.0
|
|
18
|
+
sbvirtualdisplay>=1.4.0
|
|
19
|
+
MarkupSafe>=3.0.3
|
|
20
|
+
Jinja2>=3.1.6
|
|
21
|
+
six>=1.17.0
|
|
22
|
+
parse>=1.20.2
|
|
23
|
+
parse-type>=0.6.6
|
|
24
|
+
colorama>=0.4.6
|
|
25
|
+
pyyaml>=6.0.3
|
|
26
|
+
pygments>=2.19.2
|
|
27
|
+
pyreadline3>=3.5.4;platform_system=="Windows"
|
|
28
|
+
tabcompleter>=1.4.0
|
|
29
|
+
pdbp>=1.8.1
|
|
30
|
+
idna>=3.11
|
|
31
|
+
chardet==5.2.0
|
|
32
|
+
charset-normalizer>=3.4.4,<4
|
|
33
|
+
urllib3>=1.26.20,<2;python_version<"3.10"
|
|
34
|
+
urllib3>=1.26.20,<3;python_version>="3.10"
|
|
35
|
+
requests~=2.32.5
|
|
36
|
+
sniffio==1.3.1
|
|
37
|
+
h11==0.16.0
|
|
38
|
+
outcome==1.3.0.post0
|
|
39
|
+
trio>=0.31.0,<1;python_version<"3.10"
|
|
40
|
+
trio>=0.32.0,<1;python_version>="3.10"
|
|
41
|
+
trio-websocket~=0.12.2
|
|
42
|
+
wsproto==1.2.0;python_version<"3.10"
|
|
43
|
+
wsproto~=1.3.2;python_version>="3.10"
|
|
44
|
+
websocket-client~=1.9.0
|
|
45
|
+
selenium==4.32.0;python_version<"3.10"
|
|
46
|
+
selenium==4.39.0;python_version>="3.10"
|
|
47
|
+
cssselect==1.3.0
|
|
48
|
+
nest-asyncio==1.6.0
|
|
49
|
+
sortedcontainers==2.4.0
|
|
50
|
+
execnet==2.1.1;python_version<"3.10"
|
|
51
|
+
execnet==2.1.2;python_version>="3.10"
|
|
52
|
+
iniconfig==2.1.0;python_version<"3.10"
|
|
53
|
+
iniconfig==2.3.0;python_version>="3.10"
|
|
54
|
+
pluggy==1.6.0
|
|
55
|
+
pytest==8.4.2;python_version<"3.11"
|
|
56
|
+
pytest==9.0.2;python_version>="3.11"
|
|
57
|
+
pytest-html==4.0.2
|
|
58
|
+
pytest-metadata==3.1.1
|
|
59
|
+
pytest-ordering==0.6
|
|
60
|
+
pytest-rerunfailures==16.0.1;python_version<"3.10"
|
|
61
|
+
pytest-rerunfailures==16.1;python_version>="3.10"
|
|
62
|
+
pytest-xdist==3.8.0
|
|
63
|
+
parameterized==0.9.0
|
|
64
|
+
behave==1.2.6
|
|
65
|
+
soupsieve~=2.8
|
|
66
|
+
beautifulsoup4~=4.14.3
|
|
67
|
+
pyotp==2.9.0
|
|
68
|
+
python-xlib==0.33;platform_system=="Linux"
|
|
69
|
+
PyAutoGUI>=0.9.54;platform_system=="Linux"
|
|
70
|
+
markdown-it-py==3.0.0;python_version<"3.10"
|
|
71
|
+
markdown-it-py==4.0.0;python_version>="3.10"
|
|
72
|
+
mdurl==0.1.2
|
|
73
|
+
rich>=14.2.0,<15
|
|
74
|
+
|
|
75
|
+
# --- Testing Requirements --- #
|
|
76
|
+
# ("pip install -r requirements.txt" also installs this, but "pip install -e ." won't.)
|
|
77
|
+
|
|
78
|
+
coverage>=7.10.7;python_version<"3.10"
|
|
79
|
+
coverage>=7.13.0;python_version>="3.10"
|
|
80
|
+
pytest-cov>=7.0.0
|
|
81
|
+
flake8==7.3.0
|
|
82
|
+
mccabe==0.7.0
|
|
83
|
+
pyflakes==3.4.0
|
|
84
|
+
pycodestyle==2.14.0
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
# seleniumbase package
|
|
2
|
-
__version__ = "4.
|
|
2
|
+
__version__ = "4.45.1"
|
|
@@ -113,6 +113,7 @@ import sys
|
|
|
113
113
|
from contextlib import suppress
|
|
114
114
|
from seleniumbase import config as sb_config
|
|
115
115
|
from seleniumbase.config import settings
|
|
116
|
+
from seleniumbase.core import detect_b_ver
|
|
116
117
|
from seleniumbase.core import download_helper
|
|
117
118
|
from seleniumbase.core import log_helper
|
|
118
119
|
from seleniumbase.core import proxy_helper
|
|
@@ -890,6 +891,13 @@ def get_configured_sb(context):
|
|
|
890
891
|
"\nOnly ONE default browser is allowed!\n"
|
|
891
892
|
"%s browsers were selected: %s" % (len(browsers), browsers)
|
|
892
893
|
)
|
|
894
|
+
if sb.browser in ["opera", "brave", "comet", "atlas"]:
|
|
895
|
+
bin_loc = detect_b_ver.get_binary_location(sb.browser)
|
|
896
|
+
if bin_loc and os.path.exists(bin_loc):
|
|
897
|
+
sb_config._cdp_browser = sb.browser
|
|
898
|
+
sb_config._cdp_bin_loc = bin_loc
|
|
899
|
+
sb_config.binary_location = bin_loc
|
|
900
|
+
sb.binary_location = bin_loc
|
|
893
901
|
# Recorder Mode can still optimize scripts in "-D headless2" mode.
|
|
894
902
|
if sb.recorder_ext and sb.headless:
|
|
895
903
|
sb.headless = False
|
|
@@ -177,7 +177,7 @@ def requests_get_with_retry(url):
|
|
|
177
177
|
|
|
178
178
|
|
|
179
179
|
def get_cft_known_good_versions():
|
|
180
|
-
if
|
|
180
|
+
if getattr(sb_config, "cft_kgv_json", None):
|
|
181
181
|
return sb_config.cft_kgv_json
|
|
182
182
|
cft_ngv_url = (
|
|
183
183
|
"https://googlechromelabs.github.io/"
|
|
@@ -188,7 +188,7 @@ def get_cft_known_good_versions():
|
|
|
188
188
|
|
|
189
189
|
|
|
190
190
|
def get_cft_latest_versions_per_milestone():
|
|
191
|
-
if
|
|
191
|
+
if getattr(sb_config, "cft_lvpm_json", None):
|
|
192
192
|
return sb_config.cft_lvpm_json
|
|
193
193
|
cft_lvpm_url = (
|
|
194
194
|
"https://googlechromelabs.github.io/"
|
|
@@ -205,7 +205,7 @@ def get_cft_latest_version_from_milestone(milestone):
|
|
|
205
205
|
|
|
206
206
|
def get_latest_chromedriver_version(channel="Stable"):
|
|
207
207
|
try:
|
|
208
|
-
if
|
|
208
|
+
if getattr(sb_config, "cft_lkgv_json", None):
|
|
209
209
|
return sb_config.cft_lkgv_json["channels"][channel]["version"]
|
|
210
210
|
req = requests_get(
|
|
211
211
|
"https://googlechromelabs.github.io/"
|
|
@@ -239,10 +239,7 @@ def get_latest_canary_chromedriver_version():
|
|
|
239
239
|
def log_d(message):
|
|
240
240
|
"""If setting sb_config.settings.HIDE_DRIVER_DOWNLOADS to True,
|
|
241
241
|
output from driver downloads are logged instead of printed."""
|
|
242
|
-
if (
|
|
243
|
-
hasattr(sb_config.settings, "HIDE_DRIVER_DOWNLOADS")
|
|
244
|
-
and sb_config.settings.HIDE_DRIVER_DOWNLOADS
|
|
245
|
-
):
|
|
242
|
+
if getattr(sb_config.settings, "HIDE_DRIVER_DOWNLOADS", None):
|
|
246
243
|
logging.debug(message)
|
|
247
244
|
else:
|
|
248
245
|
print(message)
|
|
@@ -251,7 +248,7 @@ def log_d(message):
|
|
|
251
248
|
def main(override=None, intel_for_uc=None, force_uc=None):
|
|
252
249
|
if override:
|
|
253
250
|
found_proxy = None
|
|
254
|
-
if
|
|
251
|
+
if getattr(sb_config, "proxy_driver", None):
|
|
255
252
|
if " --proxy=" in " ".join(sys.argv):
|
|
256
253
|
for arg in sys.argv:
|
|
257
254
|
if arg.startswith("--proxy="):
|
|
@@ -311,8 +308,7 @@ def main(override=None, intel_for_uc=None, force_uc=None):
|
|
|
311
308
|
downloads_folder = DRIVER_DIR
|
|
312
309
|
if (
|
|
313
310
|
hasattr(sb_config, "settings")
|
|
314
|
-
and
|
|
315
|
-
and sb_config.settings.NEW_DRIVER_DIR
|
|
311
|
+
and getattr(sb_config.settings, "NEW_DRIVER_DIR", None)
|
|
316
312
|
and os.path.exists(sb_config.settings.NEW_DRIVER_DIR)
|
|
317
313
|
):
|
|
318
314
|
downloads_folder = sb_config.settings.NEW_DRIVER_DIR
|
|
@@ -84,6 +84,10 @@ def main():
|
|
|
84
84
|
error_msg = None
|
|
85
85
|
invalid_cmd = None
|
|
86
86
|
use_edge = False
|
|
87
|
+
use_opera = False
|
|
88
|
+
use_brave = False
|
|
89
|
+
use_comet = False
|
|
90
|
+
use_atlas = False
|
|
87
91
|
use_uc = False
|
|
88
92
|
esc_end = False
|
|
89
93
|
start_page = None
|
|
@@ -138,6 +142,14 @@ def main():
|
|
|
138
142
|
help_me = True
|
|
139
143
|
elif option.lower() == "--edge":
|
|
140
144
|
use_edge = True
|
|
145
|
+
elif option.lower() == "--opera":
|
|
146
|
+
use_opera = True
|
|
147
|
+
elif option.lower() == "--brave":
|
|
148
|
+
use_brave = True
|
|
149
|
+
elif option.lower() == "--comet":
|
|
150
|
+
use_comet = True
|
|
151
|
+
elif option.lower() == "--atlas":
|
|
152
|
+
use_atlas = True
|
|
141
153
|
elif option.lower() == "--ee":
|
|
142
154
|
esc_end = True
|
|
143
155
|
elif option.lower() in ("--gui", "--headed"):
|
|
@@ -275,6 +287,14 @@ def main():
|
|
|
275
287
|
)
|
|
276
288
|
if use_edge:
|
|
277
289
|
run_cmd += " --edge"
|
|
290
|
+
elif use_opera:
|
|
291
|
+
run_cmd += " --opera"
|
|
292
|
+
elif use_brave:
|
|
293
|
+
run_cmd += " --brave"
|
|
294
|
+
elif use_comet:
|
|
295
|
+
run_cmd += " --comet"
|
|
296
|
+
elif use_atlas:
|
|
297
|
+
run_cmd += " --atlas"
|
|
278
298
|
if force_gui:
|
|
279
299
|
run_cmd += " --gui"
|
|
280
300
|
if use_uc:
|