seleniumbase 4.49.1__tar.gz → 4.49.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {seleniumbase-4.49.1/seleniumbase.egg-info → seleniumbase-4.49.3}/PKG-INFO +108 -72
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/README.md +98 -64
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/requirements.txt +7 -7
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/__version__.py +1 -1
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/browser_launcher.py +9 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/sb_cdp.py +81 -36
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/sb_driver.py +18 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/fixtures/base_case.py +137 -3
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/fixtures/js_utils.py +14 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/undetected/cdp_driver/browser.py +11 -1
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/undetected/cdp_driver/element.py +5 -5
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/undetected/cdp_driver/tab.py +7 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3/seleniumbase.egg-info}/PKG-INFO +108 -72
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase.egg-info/requires.txt +13 -7
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/setup.py +10 -8
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/.gitignore +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/LICENSE +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/MANIFEST.in +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/install.sh +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/pyproject.toml +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/pytest.ini +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/sbase/__init__.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/sbase/__main__.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/sbase/steps.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/__init__.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/__main__.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/behave/__init__.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/behave/behave_helper.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/behave/behave_sb.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/behave/steps.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/common/__init__.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/common/decorators.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/common/encryption.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/common/exceptions.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/common/obfuscate.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/common/unobfuscate.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/config/__init__.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/config/ad_block_list.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/config/proxy_list.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/config/settings.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/console_scripts/__init__.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/console_scripts/logo_helper.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/console_scripts/rich_helper.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/console_scripts/run.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/console_scripts/sb_commander.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/console_scripts/sb_install.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/console_scripts/sb_objectify.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/console_scripts/sb_print.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/console_scripts/sb_recorder.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/__init__.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/application_manager.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/capabilities_parser.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/colored_traceback.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/create_db_tables.sql +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/detect_b_ver.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/download_helper.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/encoded_images.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/jqc_helper.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/log_helper.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/mysql.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/nest_asyncio.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/proxy_helper.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/recorder_helper.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/report_helper.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/s3_manager.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/session_helper.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/settings_parser.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/style_sheet.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/testcase_manager.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/tour_helper.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/visual_helper.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/drivers/__init__.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/drivers/atlas_drivers/__init__.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/drivers/brave_drivers/__init__.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/drivers/cft_drivers/__init__.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/drivers/chromium_drivers/__init__.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/drivers/chs_drivers/__init__.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/drivers/comet_drivers/__init__.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/drivers/opera_drivers/__init__.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/extensions/__init__.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/extensions/ad_block.zip +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/extensions/disable_csp.zip +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/extensions/recorder.zip +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/extensions/sbase_ext.zip +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/fixtures/__init__.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/fixtures/constants.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/fixtures/css_to_xpath.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/fixtures/errors.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/fixtures/page_actions.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/fixtures/page_utils.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/fixtures/shared_utils.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/fixtures/unittest_helper.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/fixtures/words.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/fixtures/xpath_to_css.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/js_code/__init__.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/js_code/active_css_js.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/js_code/live_js.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/js_code/recorder_js.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/masterqa/__init__.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/masterqa/master_qa.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/plugins/__init__.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/plugins/base_plugin.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/plugins/basic_test_info.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/plugins/driver_manager.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/plugins/page_source.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/plugins/pytest_plugin.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/plugins/sb_manager.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/plugins/screen_shots.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/plugins/selenium_plugin.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/resources/__init__.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/translate/__init__.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/translate/chinese.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/translate/dutch.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/translate/french.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/translate/italian.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/translate/japanese.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/translate/korean.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/translate/master_dict.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/translate/portuguese.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/translate/russian.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/translate/spanish.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/translate/translator.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/undetected/__init__.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/undetected/cdp.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/undetected/cdp_driver/__init__.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/undetected/cdp_driver/cdp_util.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/undetected/cdp_driver/config.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/undetected/cdp_driver/connection.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/undetected/dprocess.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/undetected/options.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/undetected/patcher.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/undetected/reactor.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/undetected/webelement.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/utilities/__init__.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/utilities/selenium_grid/font_color +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase.egg-info/SOURCES.txt +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase.egg-info/dependency_links.txt +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase.egg-info/entry_points.txt +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase.egg-info/top_level.txt +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/setup.cfg +0 -0
- {seleniumbase-4.49.1 → seleniumbase-4.49.3}/virtualenv_install.sh +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: seleniumbase
|
|
3
|
-
Version: 4.49.
|
|
3
|
+
Version: 4.49.3
|
|
4
4
|
Summary: A framework for stealthy Chromium automation with CDP Mode. Includes CAPTCHA-bypass, E2E Testing, and a Playwright integration.
|
|
5
5
|
Home-page: https://github.com/seleniumbase/SeleniumBase
|
|
6
6
|
Author: Michael Mintz
|
|
@@ -65,7 +65,7 @@ Requires-Dist: setuptools~=70.2; python_version < "3.10"
|
|
|
65
65
|
Requires-Dist: setuptools>=82.0.1; python_version >= "3.10"
|
|
66
66
|
Requires-Dist: wheel>=0.47.0
|
|
67
67
|
Requires-Dist: attrs>=26.1.0
|
|
68
|
-
Requires-Dist: certifi>=2026.
|
|
68
|
+
Requires-Dist: certifi>=2026.5.20
|
|
69
69
|
Requires-Dist: exceptiongroup>=1.3.1
|
|
70
70
|
Requires-Dist: websockets~=15.0.1; python_version < "3.10"
|
|
71
71
|
Requires-Dist: websockets>=16.0; python_version >= "3.10"
|
|
@@ -75,13 +75,13 @@ Requires-Dist: fasteners>=0.20
|
|
|
75
75
|
Requires-Dist: mycdp>=1.3.7
|
|
76
76
|
Requires-Dist: pynose>=1.5.5
|
|
77
77
|
Requires-Dist: platformdirs~=4.4.0; python_version < "3.10"
|
|
78
|
-
Requires-Dist: platformdirs>=4.
|
|
78
|
+
Requires-Dist: platformdirs>=4.10.0; python_version >= "3.10"
|
|
79
79
|
Requires-Dist: typing-extensions>=4.15.0
|
|
80
80
|
Requires-Dist: sbvirtualdisplay>=1.4.0
|
|
81
81
|
Requires-Dist: MarkupSafe>=3.0.3
|
|
82
82
|
Requires-Dist: Jinja2>=3.1.6
|
|
83
83
|
Requires-Dist: six>=1.17.0
|
|
84
|
-
Requires-Dist: parse>=1.22.
|
|
84
|
+
Requires-Dist: parse>=1.22.1
|
|
85
85
|
Requires-Dist: parse-type>=0.6.6
|
|
86
86
|
Requires-Dist: colorama>=0.4.6
|
|
87
87
|
Requires-Dist: psutil>=7.2.2
|
|
@@ -90,7 +90,7 @@ Requires-Dist: pygments>=2.20.0
|
|
|
90
90
|
Requires-Dist: pyreadline3>=3.5.4; platform_system == "Windows"
|
|
91
91
|
Requires-Dist: tabcompleter>=1.4.1
|
|
92
92
|
Requires-Dist: pdbp>=1.8.2
|
|
93
|
-
Requires-Dist: idna>=3.
|
|
93
|
+
Requires-Dist: idna>=3.17
|
|
94
94
|
Requires-Dist: charset-normalizer<4,>=3.4.7
|
|
95
95
|
Requires-Dist: urllib3<2,>=1.26.20; python_version < "3.10"
|
|
96
96
|
Requires-Dist: urllib3<3,>=2.7.0; python_version >= "3.10"
|
|
@@ -121,11 +121,11 @@ Requires-Dist: pytest-html==4.0.2
|
|
|
121
121
|
Requires-Dist: pytest-metadata==3.1.1
|
|
122
122
|
Requires-Dist: pytest-ordering==0.6
|
|
123
123
|
Requires-Dist: pytest-rerunfailures==16.0.1; python_version < "3.10"
|
|
124
|
-
Requires-Dist: pytest-rerunfailures==16.
|
|
124
|
+
Requires-Dist: pytest-rerunfailures==16.3; python_version >= "3.10"
|
|
125
125
|
Requires-Dist: pytest-xdist==3.8.0
|
|
126
126
|
Requires-Dist: parameterized==0.9.0
|
|
127
127
|
Requires-Dist: behave==1.2.6
|
|
128
|
-
Requires-Dist: soupsieve~=2.8.
|
|
128
|
+
Requires-Dist: soupsieve~=2.8.4
|
|
129
129
|
Requires-Dist: beautifulsoup4~=4.14.3
|
|
130
130
|
Requires-Dist: pyotp==2.9.0
|
|
131
131
|
Requires-Dist: python-xlib==0.33; platform_system == "Linux"
|
|
@@ -140,7 +140,7 @@ Requires-Dist: allure-python-commons>=2.13.5; extra == "allure"
|
|
|
140
140
|
Requires-Dist: allure-behave>=2.13.5; extra == "allure"
|
|
141
141
|
Provides-Extra: coverage
|
|
142
142
|
Requires-Dist: coverage>=7.10.7; python_version < "3.10" and extra == "coverage"
|
|
143
|
-
Requires-Dist: coverage>=7.14.
|
|
143
|
+
Requires-Dist: coverage>=7.14.1; python_version >= "3.10" and extra == "coverage"
|
|
144
144
|
Requires-Dist: pytest-cov>=7.1.0; extra == "coverage"
|
|
145
145
|
Provides-Extra: flake8
|
|
146
146
|
Requires-Dist: flake8==7.3.0; extra == "flake8"
|
|
@@ -168,6 +168,8 @@ Provides-Extra: proxy
|
|
|
168
168
|
Requires-Dist: proxy.py==2.4.3; extra == "proxy"
|
|
169
169
|
Provides-Extra: playwright
|
|
170
170
|
Requires-Dist: playwright>=1.60.0; extra == "playwright"
|
|
171
|
+
Requires-Dist: greenlet>=3.2.5; python_version < "3.10" and extra == "playwright"
|
|
172
|
+
Requires-Dist: greenlet>=3.5.1; python_version >= "3.10" and extra == "playwright"
|
|
171
173
|
Provides-Extra: pyautogui
|
|
172
174
|
Requires-Dist: PyAutoGUI>=0.9.54; platform_system != "Linux" and extra == "pyautogui"
|
|
173
175
|
Provides-Extra: selenium-stealth
|
|
@@ -201,18 +203,17 @@ Dynamic: summary
|
|
|
201
203
|
<!-- SeleniumBase Docs -->
|
|
202
204
|
|
|
203
205
|
<meta property="og:site_name" content="SeleniumBase">
|
|
204
|
-
<meta property="og:title" content="SeleniumBase:
|
|
205
|
-
<meta property="og:description" content="
|
|
206
|
-
<meta property="og:keywords" content="Python, pytest, selenium, webdriver, testing, automation, seleniumbase, framework, dashboard, recorder, reports, screenshots">
|
|
206
|
+
<meta property="og:title" content="SeleniumBase: Stealthy Chromium Automation with Python; and E2E Testing." />
|
|
207
|
+
<meta property="og:description" content="Stealthy Chromium Automation, including fast, easy, and reliable Web/UI testing with Python." />
|
|
208
|
+
<meta property="og:keywords" content="Python, pytest, selenium, webdriver, testing, automation, seleniumbase, framework, dashboard, recorder, reports, screenshots, playwright, stealth, CAPTCHA">
|
|
207
209
|
<meta property="og:image" content="https://seleniumbase.github.io/cdn/img/mac_sb_logo_5b.png" />
|
|
208
|
-
<link rel="icon" href="https://seleniumbase.github.io/img/
|
|
210
|
+
<link rel="icon" href="https://seleniumbase.github.io/img/logo6.png" />
|
|
209
211
|
|
|
210
|
-
<p align="center"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/
|
|
212
|
+
<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>
|
|
211
213
|
|
|
212
|
-
<p align="center"
|
|
213
|
-
<p align="center"></p>
|
|
214
|
+
<p align="center" class="hero__title"><b>All-in-one Browser Automation Framework:<br />Web Crawling / Testing / Scraping / Stealth</b></p>
|
|
214
215
|
|
|
215
|
-
<
|
|
216
|
+
<p align="center"><a href="https://pypi.python.org/pypi/seleniumbase" target="_blank"><img src="https://img.shields.io/pypi/v/seleniumbase.svg?color=3399EE" alt="PyPI version" /></a> <a href="https://pepy.tech/projects/seleniumbase?timeRange=threeMonths&category=version&includeCIDownloads=true&granularity=daily&viewType=line&versions=*" target="_blank"><img src="https://static.pepy.tech/badge/seleniumbase" alt="SeleniumBase PyPI downloads" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/LICENSE"><img src="https://img.shields.io/badge/license-MIT-22BBCC.svg" title="SeleniumBase" /></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/Tests/badge.svg" alt="SeleniumBase GitHub Actions" /></a> <a href="https://www.youtube.com/@MichaelMintz"><img src="https://img.shields.io/youtube/channel/subscribers/UCSQElO8vQmNPuTgdd83BHdw?style=flat&logo=youtube&logoColor=white&label=YouTube%20Subscribers&color=red" alt="YouTube Subscribers"></a></p>
|
|
216
217
|
|
|
217
218
|
<p align="center">
|
|
218
219
|
<a href="#python_installation">🚀 Start</a> |
|
|
@@ -250,80 +251,70 @@ Dynamic: summary
|
|
|
250
251
|
<br />
|
|
251
252
|
</p>
|
|
252
253
|
|
|
253
|
-
🐙 <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md"><b>CDP Mode</b></a> bypasses bot-detection and handles CAPTCHAs by driving the browser directly through the <a href="https://chromedevtools.github.io/devtools-protocol/" translate="no">Chrome DevTools Protocol</a>. Includes <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/ReadMe.md"><b><span translate="no">Stealthy Playwright Mode</span></b></a>, which extends these advanced anti-detection patches to Playwright scripts.
|
|
254
|
-
|
|
255
|
-
📚 The [SeleniumBase/examples/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples) folder includes over 100 ready-to-run examples of E2E testing. Examples that start with `test_` or end with `_test.py`/`_tests.py` are specifically designed to run with `pytest`. Other examples run directly with raw `python` (those files generally start with `raw_` to avoid confusion).
|
|
256
|
-
|
|
257
|
-
🥷 Stealthy CDP Mode examples are located in [./examples/cdp_mode/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples/cdp_mode).
|
|
258
|
-
|
|
259
|
-
🎭 Stealthy Playwright examples are located in [./examples/cdp_mode/playwright/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/).
|
|
260
|
-
|
|
261
254
|
--------
|
|
262
255
|
|
|
263
|
-
<
|
|
264
|
-
|
|
265
|
-
<
|
|
266
|
-
|
|
267
|
-
|
|
256
|
+
<ul>
|
|
257
|
+
<li>🐙 <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md"><b>CDP Mode</b></a> <b>bypasses bot-detection with Chromium-based browsers.</b></li>
|
|
258
|
+
<li>🎭 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/ReadMe.md"><b><span translate="no">Stealthy Playwright Mode</span></b></a> <b>extends CDP Mode's stealth to Playwright.</b></li>
|
|
259
|
+
<li><b><code>pip install seleniumbase</code></b> for the main framework.</li>
|
|
260
|
+
<li><b><code>pip install playwright</code></b> for the Playwright integration.</li>
|
|
261
|
+
</ul>
|
|
268
262
|
|
|
269
263
|
--------
|
|
270
264
|
|
|
271
|
-
<
|
|
265
|
+
<b>📝 Here's a Python example that uses <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md#-pure-cdp-mode-sb_cdp">Pure CDP Mode</a> (<code>sb_cdp</code>):</b><br />(It navigates to Browserscan to show it bypassing bot-detection.)
|
|
272
266
|
|
|
273
267
|
```python
|
|
274
268
|
from seleniumbase import sb_cdp
|
|
275
269
|
|
|
276
|
-
|
|
277
|
-
sb
|
|
278
|
-
sb.
|
|
279
|
-
sb.
|
|
280
|
-
print("Bot Not Detected")
|
|
281
|
-
sb.flash('strong:contains("Normal")', duration=3, pause=2)
|
|
270
|
+
sb = sb_cdp.Chrome()
|
|
271
|
+
sb.open("https://browserscan.net/bot-detection")
|
|
272
|
+
sb.sleep(3)
|
|
273
|
+
sb.quit()
|
|
282
274
|
```
|
|
283
275
|
|
|
284
|
-
<
|
|
276
|
+
<p align="center">
|
|
277
|
+
<img src="https://seleniumbase.github.io/cdn/img/results_normal.jpg" width="578" alt="BrowserScan Test Results: Normal">
|
|
278
|
+
<br><em>(All BrowserScan bot-detection checks were passed successfully.)</em>
|
|
279
|
+
</p>
|
|
285
280
|
|
|
286
|
-
|
|
281
|
+
<b>🎭 Here's an example script that uses <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/ReadMe.md"><span translate="no">Stealthy Playwright Mode</span></a>:</b><br />(Playwright connects to a stealthy SeleniumBase browser session.)
|
|
287
282
|
|
|
288
283
|
```python
|
|
289
284
|
from playwright.sync_api import sync_playwright
|
|
290
285
|
from seleniumbase import sb_cdp
|
|
291
286
|
|
|
292
|
-
sb = sb_cdp.Chrome(
|
|
287
|
+
sb = sb_cdp.Chrome()
|
|
293
288
|
endpoint_url = sb.get_endpoint_url()
|
|
294
289
|
|
|
295
290
|
with sync_playwright() as p:
|
|
296
291
|
browser = p.chromium.connect_over_cdp(endpoint_url)
|
|
297
292
|
page = browser.contexts[0].pages[0]
|
|
298
|
-
page.goto("https://
|
|
299
|
-
page.wait_for_timeout(500)
|
|
300
|
-
sb.flash("Test Results", duration=3, pause=1)
|
|
301
|
-
sb.assert_element('strong:contains("Normal")')
|
|
302
|
-
sb.flash('strong:contains("Normal")', duration=3, pause=2)
|
|
303
|
-
```
|
|
304
|
-
|
|
305
|
-
--------
|
|
306
|
-
|
|
307
|
-
💡 You can set which Chromium browser to use via command-line options:
|
|
293
|
+
page.goto("https://browserscan.net/bot-detection")
|
|
308
294
|
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
python SCRIPT.py --cft # Use Chrome-for-testing
|
|
312
|
-
python SCRIPT.py --edge # Use Microsoft Edge
|
|
313
|
-
python SCRIPT.py --brave # Use Brave browser
|
|
295
|
+
sb.sleep(3)
|
|
296
|
+
sb.quit()
|
|
314
297
|
```
|
|
315
298
|
|
|
316
|
-
|
|
299
|
+
--------
|
|
317
300
|
|
|
318
|
-
|
|
301
|
+
<b>**📝** The Browserscan example can be expanded into a <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_browserscan.py">test demo</a>:</b><br />(Assertions added and a few elements highlighted with JavaScript)
|
|
319
302
|
|
|
320
303
|
```python
|
|
321
|
-
|
|
304
|
+
from seleniumbase import sb_cdp
|
|
305
|
+
|
|
306
|
+
sb = sb_cdp.Chrome(locale="en", ad_block=True)
|
|
307
|
+
sb.open("https://browserscan.net/bot-detection")
|
|
308
|
+
sb.flash("Test Results", duration=1.5, pause=0.5)
|
|
309
|
+
sb.assert_element('strong:contains("Normal")')
|
|
310
|
+
print("Bot Not Detected")
|
|
311
|
+
sb.flash('strong:contains("Normal")', pause=1)
|
|
312
|
+
sb.quit()
|
|
322
313
|
```
|
|
323
314
|
|
|
324
315
|
--------
|
|
325
316
|
|
|
326
|
-
<p align="left">📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_yc_news.py" target="_blank">This example</a> scrapes Hacker News listings
|
|
317
|
+
<p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_yc_news.py" target="_blank">This example</a> scrapes Hacker News listings:</b></p>
|
|
327
318
|
|
|
328
319
|
```python
|
|
329
320
|
from seleniumbase import sb_cdp
|
|
@@ -337,7 +328,43 @@ for element in elements:
|
|
|
337
328
|
|
|
338
329
|
--------
|
|
339
330
|
|
|
340
|
-
|
|
331
|
+
🐙 Stealthy CDP Mode examples are located in [./examples/cdp_mode/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples/cdp_mode).
|
|
332
|
+
|
|
333
|
+
🎭 Stealthy Playwright examples are located in [./examples/cdp_mode/playwright/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/).
|
|
334
|
+
|
|
335
|
+
--------
|
|
336
|
+
|
|
337
|
+
<h3 align="left">⚙️ Stealthy architecture flowchart:</h3>
|
|
338
|
+
|
|
339
|
+
<p align="center">
|
|
340
|
+
<img src="https://seleniumbase.github.io/other/sb_architecture.png" width="646" alt="Stealthy architecture flowchart">
|
|
341
|
+
<br><em>(For maximum stealth, use <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md">CDP Mode</a>, which includes <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/ReadMe.md">Stealthy Playwright Mode</a>)</em>
|
|
342
|
+
</p>
|
|
343
|
+
|
|
344
|
+
--------
|
|
345
|
+
|
|
346
|
+
<h3 align="left">🌐 CLI Options for Supported Chromium Browsers</h3>
|
|
347
|
+
|
|
348
|
+
<p>💡 You can set the Chromium browser to use via command line parameters:</p>
|
|
349
|
+
|
|
350
|
+
```zsh
|
|
351
|
+
python SCRIPT.py --use-chromium # Use the unbranded Chromium browser
|
|
352
|
+
python SCRIPT.py --cft # Use Chrome-for-testing
|
|
353
|
+
python SCRIPT.py --edge # Use Microsoft Edge
|
|
354
|
+
python SCRIPT.py --brave # Use Brave browser
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
Google Chrome is the default browser. Only unbranded Chromium and Chrome-for-Testing get installed automatically if not already installed.
|
|
358
|
+
|
|
359
|
+
The Chromium browser can also be set via method args, eg: `cft=True`, `use_chromium=True`, `browser="edge"`, `browser="brave"`, etc. Eg:
|
|
360
|
+
|
|
361
|
+
```python
|
|
362
|
+
sb = sb_cdp.Chrome(url, use_chromium=True)
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
--------
|
|
366
|
+
|
|
367
|
+
<p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_google.py" target="_blank">This example</a> saves Google Search results with UC + CDP Mode:</b><br />(Results are saved as PDF, HTML, and PNG files)</p>
|
|
341
368
|
|
|
342
369
|
```python
|
|
343
370
|
from seleniumbase import SB
|
|
@@ -358,7 +385,7 @@ with SB(uc=True, test=True) as sb:
|
|
|
358
385
|
|
|
359
386
|
--------
|
|
360
387
|
|
|
361
|
-
<p align="left">📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_gitlab.py" target="_blank">This example</a> bypasses Cloudflare's challenge page with UC + CDP Mode
|
|
388
|
+
<p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_gitlab.py" target="_blank">This example</a> bypasses Cloudflare's challenge page with UC + CDP Mode:</b></p>
|
|
362
389
|
|
|
363
390
|
```python
|
|
364
391
|
from seleniumbase import SB
|
|
@@ -376,11 +403,13 @@ with SB(uc=True, test=True, locale="en") as sb:
|
|
|
376
403
|
sb.post_message("SeleniumBase wasn't detected", duration=4)
|
|
377
404
|
```
|
|
378
405
|
|
|
379
|
-
<img src="https://seleniumbase.github.io/other/cf_sec.jpg" alt="SeleniumBase" width="
|
|
406
|
+
<img src="https://seleniumbase.github.io/other/cf_sec.jpg" alt="SeleniumBase" width="346"> <img src="https://seleniumbase.github.io/other/gitlab_bypass.png" alt="SeleniumBase" width="300">
|
|
407
|
+
|
|
408
|
+
(<b><code>sb.solve_captcha()</code></b> <b>handles CAPTCHAs</b> that aren't bypassed automatically.)
|
|
380
409
|
|
|
381
|
-
|
|
410
|
+
--------
|
|
382
411
|
|
|
383
|
-
<p align="left">📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_gitlab.py" target="_blank">This example</a> handles a CAPTCHA page with Pure CDP Mode
|
|
412
|
+
<p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_gitlab.py" target="_blank">This example</a> handles a CAPTCHA page with Pure CDP Mode:</b></p>
|
|
384
413
|
|
|
385
414
|
```python
|
|
386
415
|
from seleniumbase import sb_cdp
|
|
@@ -395,7 +424,13 @@ sb.highlight('button:contains("Sign in")')
|
|
|
395
424
|
|
|
396
425
|
--------
|
|
397
426
|
|
|
398
|
-
<
|
|
427
|
+
<h3>🧪 Comprehensive E2E Testing with <code>pytest</code>:</h3>
|
|
428
|
+
|
|
429
|
+
📚 The [SeleniumBase/examples/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples) folder includes over 150 ready-to-run examples of E2E testing. Examples that start with `test_` or end with `_test.py`/`_tests.py` run with `pytest`. Other examples run directly with raw `python` (those generally start with `raw_` to avoid confusion).
|
|
430
|
+
|
|
431
|
+
|
|
432
|
+
|
|
433
|
+
<p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_get_swag.py" target="_blank">This example</a> tests an e-commerce site with <code>pytest</code>:</b></p>
|
|
399
434
|
|
|
400
435
|
```python
|
|
401
436
|
from seleniumbase import BaseCase
|
|
@@ -421,17 +456,17 @@ class MyTestClass(BaseCase):
|
|
|
421
456
|
|
|
422
457
|
> `pytest test_get_swag.py`
|
|
423
458
|
|
|
424
|
-
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_get_swag.py"><img src="https://seleniumbase.github.io/cdn/gif/fast_swag_2.gif" alt="SeleniumBase Test" width="
|
|
459
|
+
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_get_swag.py"><img src="https://seleniumbase.github.io/cdn/gif/fast_swag_2.gif" alt="SeleniumBase Test" width="500" /></a>
|
|
425
460
|
|
|
426
461
|
--------
|
|
427
462
|
|
|
428
|
-
<p align="left">📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_coffee_cart.py" target="_blank">This example</a> tests another e-commerce site with <code>pytest</code
|
|
463
|
+
<p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_coffee_cart.py" target="_blank">This example</a> tests another e-commerce site with <code>pytest</code>:</b></p>
|
|
429
464
|
|
|
430
465
|
```zsh
|
|
431
466
|
pytest test_coffee_cart.py --demo
|
|
432
467
|
```
|
|
433
468
|
|
|
434
|
-
<p align="left"><a href="https://seleniumbase.io/coffee/" target="_blank"><img src="https://seleniumbase.github.io/cdn/gif/coffee_cart.gif" width="
|
|
469
|
+
<p align="left"><a href="https://seleniumbase.io/coffee/" target="_blank"><img src="https://seleniumbase.github.io/cdn/gif/coffee_cart.gif" width="500" alt="SeleniumBase Coffee Cart Test" /></a></p>
|
|
435
470
|
|
|
436
471
|
> <p>(<code translate="no">--demo</code> mode slows down tests and highlights actions)</p>
|
|
437
472
|
|
|
@@ -439,13 +474,13 @@ pytest test_coffee_cart.py --demo
|
|
|
439
474
|
|
|
440
475
|
<a id="multiple_examples"></a>
|
|
441
476
|
|
|
442
|
-
<p align="left">📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_demo_site.py" target="_blank">This example</a> covers multiple actions with <code>pytest</code
|
|
477
|
+
<p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_demo_site.py" target="_blank">This example</a> covers multiple actions with <code>pytest</code>:</b></p>
|
|
443
478
|
|
|
444
479
|
```zsh
|
|
445
480
|
pytest test_demo_site.py
|
|
446
481
|
```
|
|
447
482
|
|
|
448
|
-
<p align="left"><a href="https://seleniumbase.io/demo_page" target="_blank"><img src="https://seleniumbase.github.io/cdn/gif/demo_page_5.gif" width="
|
|
483
|
+
<p align="left"><a href="https://seleniumbase.io/demo_page" target="_blank"><img src="https://seleniumbase.github.io/cdn/gif/demo_page_5.gif" width="500" alt="SeleniumBase Example" /></a></p>
|
|
449
484
|
|
|
450
485
|
> Easy to type, click, select, toggle, drag & drop, and more.
|
|
451
486
|
|
|
@@ -576,7 +611,7 @@ finally:
|
|
|
576
611
|
<a id="python_installation"></a>
|
|
577
612
|
<h2><img src="https://seleniumbase.github.io/cdn/img/python_logo.png" title="SeleniumBase" width="42" /> Set up Python & Git:</h2>
|
|
578
613
|
|
|
579
|
-
<a href="https://
|
|
614
|
+
<a href="https://pypi.org/project/seleniumbase/" target="_blank"><img src="https://img.shields.io/pypi/pyversions/seleniumbase.svg?color=22AAEE&logo=python&logoColor=FEDC54" title="Supported Python Versions" /></a>
|
|
580
615
|
|
|
581
616
|
🔵 Add <b><a href="https://www.python.org/downloads/">Python</a></b> and <b><a href="https://git-scm.com/">Git</a></b> to your System PATH.
|
|
582
617
|
|
|
@@ -700,7 +735,7 @@ cd examples/
|
|
|
700
735
|
pytest my_first_test.py
|
|
701
736
|
```
|
|
702
737
|
|
|
703
|
-
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/my_first_test.py"><img src="https://seleniumbase.github.io/cdn/gif/fast_swag_2.gif" alt="SeleniumBase Test" width="
|
|
738
|
+
<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/my_first_test.py"><img src="https://seleniumbase.github.io/cdn/gif/fast_swag_2.gif" alt="SeleniumBase Test" width="500" /></a>
|
|
704
739
|
|
|
705
740
|
<p align="left"><b>Here's the full code for <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/my_first_test.py">my_first_test.py</a>:</b></p>
|
|
706
741
|
|
|
@@ -1693,7 +1728,8 @@ pytest --reruns=1 --reruns-delay=1
|
|
|
1693
1728
|
<p><div><b><a href="https://github.com/mdmintz">https://github.com/mdmintz</a></b></div></p>
|
|
1694
1729
|
|
|
1695
1730
|
<div><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/super_logo_sb3.png" title="SeleniumBase" width="310" /></a></div>
|
|
1696
|
-
<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> <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>
|
|
1697
1731
|
<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> <img src="https://views.whatilearened.today/views/github/seleniumbase/SeleniumBase.svg" width="98px" height="20px" alt="Views" /></div>
|
|
1732
|
+
<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>
|
|
1698
1733
|
<div align="left"></div>
|
|
1699
1734
|
<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> <a href="https://discord.gg/EdhQTn3EyE" target="_blank"><img src="https://img.shields.io/discord/727927627830001734?color=7289DA&label=Discord&logo=discord&logoColor=white"/></a></div>
|
|
1735
|
+
<div><a href="https://www.youtube.com/@MichaelMintz"><img src="https://img.shields.io/youtube/channel/subscribers/UCSQElO8vQmNPuTgdd83BHdw?style=flat&logo=youtube&logoColor=white&label=YouTube%20Subscribers&color=red" alt="YouTube Subscribers"></a></div>
|