seleniumbase 4.55.0__tar.gz → 4.55.2__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.55.0/seleniumbase.egg-info → seleniumbase-4.55.2}/PKG-INFO +96 -197
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/README.md +89 -190
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/requirements.txt +4 -4
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/__version__.py +1 -1
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/behave/behave_sb.py +6 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/browser_launcher.py +11 -2
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/sb_cdp.py +82 -37
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/fixtures/base_case.py +1 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/fixtures/constants.py +3 -3
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/plugins/pytest_plugin.py +11 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/plugins/sb_manager.py +9 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/plugins/selenium_plugin.py +11 -1
- {seleniumbase-4.55.0 → seleniumbase-4.55.2/seleniumbase.egg-info}/PKG-INFO +96 -197
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase.egg-info/requires.txt +6 -6
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/setup.py +6 -6
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/.gitignore +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/LICENSE +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/MANIFEST.in +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/install.sh +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/mcp_servers/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/mcp_servers/server.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/pyproject.toml +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/pytest.ini +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/sbase/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/sbase/__main__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/sbase/steps.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/__main__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/behave/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/behave/behave_helper.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/behave/steps.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/common/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/common/decorators.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/common/encryption.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/common/exceptions.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/common/obfuscate.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/common/unobfuscate.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/config/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/config/ad_block_list.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/config/proxy_list.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/config/settings.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/console_scripts/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/console_scripts/logo_helper.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/console_scripts/rich_helper.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/console_scripts/run.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/console_scripts/sb_commander.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/console_scripts/sb_install.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/console_scripts/sb_objectify.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/console_scripts/sb_print.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/console_scripts/sb_recorder.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/application_manager.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/capabilities_parser.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/colored_traceback.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/create_db_tables.sql +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/detect_b_ver.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/download_helper.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/encoded_images.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/jqc_helper.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/log_helper.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/mysql.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/nest_asyncio.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/proxy_helper.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/recorder_helper.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/report_helper.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/s3_manager.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/sb_driver.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/session_helper.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/settings_parser.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/style_sheet.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/testcase_manager.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/tour_helper.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/visual_helper.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/drivers/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/drivers/brave_drivers/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/drivers/cft_drivers/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/drivers/chromium_drivers/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/drivers/chs_drivers/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/drivers/comet_drivers/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/drivers/opera_drivers/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/extensions/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/extensions/ad_block.zip +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/extensions/disable_csp.zip +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/extensions/recorder.zip +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/extensions/sbase_ext.zip +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/fixtures/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/fixtures/css_to_xpath.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/fixtures/errors.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/fixtures/js_utils.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/fixtures/page_actions.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/fixtures/page_utils.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/fixtures/shared_utils.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/fixtures/unittest_helper.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/fixtures/words.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/fixtures/xpath_to_css.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/js_code/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/js_code/active_css_js.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/js_code/live_js.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/js_code/recorder_js.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/masterqa/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/masterqa/master_qa.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/plugins/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/plugins/base_plugin.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/plugins/basic_test_info.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/plugins/driver_manager.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/plugins/page_source.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/plugins/screen_shots.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/resources/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/translate/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/translate/chinese.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/translate/dutch.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/translate/french.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/translate/italian.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/translate/japanese.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/translate/korean.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/translate/master_dict.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/translate/portuguese.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/translate/russian.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/translate/spanish.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/translate/translator.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/undetected/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/undetected/cdp.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/undetected/cdp_driver/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/undetected/cdp_driver/browser.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/undetected/cdp_driver/cdp_util.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/undetected/cdp_driver/config.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/undetected/cdp_driver/connection.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/undetected/cdp_driver/element.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/undetected/cdp_driver/tab.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/undetected/dprocess.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/undetected/options.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/undetected/patcher.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/undetected/reactor.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/undetected/webelement.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/utilities/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/utilities/selenium_grid/font_color +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase.egg-info/SOURCES.txt +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase.egg-info/dependency_links.txt +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase.egg-info/entry_points.txt +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase.egg-info/top_level.txt +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/setup.cfg +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.2}/virtualenv_install.sh +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: seleniumbase
|
|
3
|
-
Version: 4.55.
|
|
3
|
+
Version: 4.55.2
|
|
4
4
|
Summary: SeleniumBase is a framework for web crawling, scraping, and testing. Supports pytest. CDP Mode adds stealth. Includes many tools.
|
|
5
5
|
Home-page: https://github.com/seleniumbase/SeleniumBase
|
|
6
6
|
Author: Michael Mintz
|
|
@@ -67,13 +67,13 @@ Requires-Dist: certifi>=2026.7.22
|
|
|
67
67
|
Requires-Dist: exceptiongroup>=1.3.1
|
|
68
68
|
Requires-Dist: websockets~=16.1.1; python_version == "3.10"
|
|
69
69
|
Requires-Dist: websockets>=16.1.1; python_version >= "3.11"
|
|
70
|
-
Requires-Dist: filelock>=4.0.
|
|
70
|
+
Requires-Dist: filelock>=4.0.12
|
|
71
71
|
Requires-Dist: fasteners>=0.20
|
|
72
72
|
Requires-Dist: mycdp>=1.4.0
|
|
73
73
|
Requires-Dist: pynose>=1.5.5
|
|
74
74
|
Requires-Dist: typing-extensions>=4.16.0
|
|
75
75
|
Requires-Dist: sbvirtualdisplay>=1.4.0
|
|
76
|
-
Requires-Dist: MarkupSafe>=3.0.
|
|
76
|
+
Requires-Dist: MarkupSafe>=3.0.4
|
|
77
77
|
Requires-Dist: Jinja2>=3.1.6
|
|
78
78
|
Requires-Dist: six>=1.17.0
|
|
79
79
|
Requires-Dist: parse>=1.22.2
|
|
@@ -100,7 +100,7 @@ Requires-Dist: selenium==4.50.0
|
|
|
100
100
|
Requires-Dist: cssselect<2,>=1.5.0
|
|
101
101
|
Requires-Dist: sortedcontainers==2.4.0
|
|
102
102
|
Requires-Dist: execnet==2.1.2
|
|
103
|
-
Requires-Dist: iniconfig
|
|
103
|
+
Requires-Dist: iniconfig~=2.3.1
|
|
104
104
|
Requires-Dist: pluggy==1.6.0
|
|
105
105
|
Requires-Dist: pytest==8.4.2; python_version < "3.11"
|
|
106
106
|
Requires-Dist: pytest==9.1.1; python_version >= "3.11"
|
|
@@ -130,10 +130,10 @@ Requires-Dist: pytest-cov>=7.1.0; extra == "coverage"
|
|
|
130
130
|
Provides-Extra: flake8
|
|
131
131
|
Requires-Dist: flake8==7.4.1; extra == "flake8"
|
|
132
132
|
Requires-Dist: mccabe==0.7.0; extra == "flake8"
|
|
133
|
-
Requires-Dist: pyflakes==4.0.
|
|
133
|
+
Requires-Dist: pyflakes==4.0.3; extra == "flake8"
|
|
134
134
|
Requires-Dist: pycodestyle==2.15.0; extra == "flake8"
|
|
135
135
|
Provides-Extra: mcp
|
|
136
|
-
Requires-Dist: mcp[cli]<3.0.0,>=2.
|
|
136
|
+
Requires-Dist: mcp[cli]<3.0.0,>=2.3.0; extra == "mcp"
|
|
137
137
|
Provides-Extra: mss
|
|
138
138
|
Requires-Dist: mss==10.2.0; extra == "mss"
|
|
139
139
|
Provides-Extra: pdfminer
|
|
@@ -154,7 +154,7 @@ Requires-Dist: pyee>=13.0.1; extra == "playwright"
|
|
|
154
154
|
Provides-Extra: pyautogui
|
|
155
155
|
Requires-Dist: PyAutoGUI>=0.9.54; platform_system != "Linux" and extra == "pyautogui"
|
|
156
156
|
Provides-Extra: uv
|
|
157
|
-
Requires-Dist: uv>=0.12.
|
|
157
|
+
Requires-Dist: uv>=0.12.23; extra == "uv"
|
|
158
158
|
Dynamic: author
|
|
159
159
|
Dynamic: author-email
|
|
160
160
|
Dynamic: classifier
|
|
@@ -173,19 +173,17 @@ Dynamic: summary
|
|
|
173
173
|
<!-- mcp-name: io.github.seleniumbase/seleniumbase -->
|
|
174
174
|
|
|
175
175
|
<meta property="og:site_name" content="SeleniumBase">
|
|
176
|
-
<meta property="og:title" content="SeleniumBase:
|
|
177
|
-
<meta property="og:description" content="
|
|
178
|
-
<meta property="og:keywords" content="Python, pytest, selenium, webdriver, testing, automation, seleniumbase, framework, dashboard, recorder, reports, screenshots
|
|
176
|
+
<meta property="og:title" content="SeleniumBase: Python Web Automation and E2E Testing. Includes stealth options!" />
|
|
177
|
+
<meta property="og:description" content="Fast, easy, and reliable Web/UI testing with Python. Includes stealth options!" />
|
|
178
|
+
<meta property="og:keywords" content="Python, pytest, selenium, webdriver, testing, automation, seleniumbase, framework, dashboard, recorder, reports, screenshots">
|
|
179
179
|
<meta property="og:image" content="https://seleniumbase.github.io/cdn/img/mac_sb_logo_5b.png" />
|
|
180
|
-
<link rel="icon" href="https://seleniumbase.github.io/img/
|
|
180
|
+
<link rel="icon" href="https://seleniumbase.github.io/img/logo7.png" />
|
|
181
181
|
|
|
182
|
-
<p align="center"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/
|
|
182
|
+
<p align="center"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/nice_logo_8t.png" alt="SeleniumBase" width="400" /></a></p>
|
|
183
183
|
|
|
184
184
|
<p align="center" class="hero__title"><b>All-in-one Browser Automation Framework:<br />Web Crawling / Testing / Scraping / Stealth</b></p>
|
|
185
185
|
|
|
186
|
-
<p align="center"><a href="https://
|
|
187
|
-
|
|
188
|
-
<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/playlist?list=PLp9uKicxkBc5UIlGi2BuE3aWC7JyXpD3m"><img src="https://img.shields.io/badge/docs-📺-F12345.svg?style=flat&logo=YouTube&logoColor=white&label=YouTube" alt="YouTube Channel" /></a></p>
|
|
186
|
+
<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" height="20" /></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" height="20" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/LICENSE"><img src="https://img.shields.io/badge/license-MIT-22BBCC.svg" title="SeleniumBase" height="20" /></a> <a href="https://seleniumbase.io"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg" alt="SeleniumBase Docs" height="20" /></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" height="20" /></a> <a href="https://www.youtube.com/playlist?list=PLp9uKicxkBc5UIlGi2BuE3aWC7JyXpD3m"><img src="https://img.shields.io/badge/docs-📺-F12345.svg?style=flat&logo=YouTube&logoColor=white&label=YouTube" alt="YouTube Channel" height="20" /></a></p>
|
|
189
187
|
|
|
190
188
|
<p align="center">
|
|
191
189
|
<a href="#python_installation">🚀 Start</a> |
|
|
@@ -225,96 +223,43 @@ Dynamic: summary
|
|
|
225
223
|
|
|
226
224
|
--------
|
|
227
225
|
|
|
228
|
-
<
|
|
229
|
-
<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>
|
|
230
|
-
<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>
|
|
231
|
-
</ul>
|
|
232
|
-
<ul>
|
|
233
|
-
<li><code><b>pip install seleniumbase</b></code> for the main framework. (Or use <code>uv add</code>)</li>
|
|
234
|
-
<li><code><b>pip install playwright</b></code> for the optional integration. (Or use <code>uv add</code>)</li>
|
|
235
|
-
</ul>
|
|
236
|
-
|
|
237
|
-
<ul>
|
|
238
|
-
<li><b>🤖 For the <code>SeleniumBase MCP</code> server, <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/mcp_servers/">see the MCP ReadMe</a>.</b></li>
|
|
239
|
-
</ul>
|
|
240
|
-
|
|
241
|
-
--------
|
|
242
|
-
|
|
243
|
-
<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 where it bypasses bot-detection.)
|
|
226
|
+
🥷 Stealth modes: <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/uc_mode.md"><b>UC Mode</b></a> / <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, handle CAPTCHAs, and call methods from the <a href="https://chromedevtools.github.io/devtools-protocol/" translate="no">Chrome Devtools Protocol</a>. CDP Mode 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 makes Playwright stealthy.
|
|
244
227
|
|
|
245
|
-
|
|
246
|
-
from seleniumbase import sb_cdp
|
|
247
|
-
|
|
248
|
-
sb = sb_cdp.Chrome()
|
|
249
|
-
sb.goto("https://browserscan.net/bot-detection")
|
|
250
|
-
sb.sleep(3)
|
|
251
|
-
sb.quit()
|
|
252
|
-
```
|
|
253
|
-
|
|
254
|
-
<p align="center">
|
|
255
|
-
<img src="https://seleniumbase.github.io/cdn/img/results_normal.jpg" width="588" alt="BrowserScan Test Results: Normal" />
|
|
256
|
-
<br /><em>(All BrowserScan bot-detection tests passed successfully.)</em>
|
|
257
|
-
</p>
|
|
258
|
-
|
|
259
|
-
<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.)
|
|
260
|
-
|
|
261
|
-
```python
|
|
262
|
-
from playwright.sync_api import sync_playwright
|
|
263
|
-
from seleniumbase import sb_cdp
|
|
228
|
+
🧪 End-to-End Testing examples are located in [./examples/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples).
|
|
264
229
|
|
|
265
|
-
|
|
266
|
-
endpoint_url = sb.get_endpoint_url()
|
|
230
|
+
🐙 CDP Mode (stealth) examples are located in [./examples/cdp_mode/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples/cdp_mode).
|
|
267
231
|
|
|
268
|
-
|
|
269
|
-
browser = p.chromium.connect_over_cdp(endpoint_url)
|
|
270
|
-
page = browser.contexts[0].pages[0]
|
|
271
|
-
page.goto("https://bot.sannysoft.com/")
|
|
272
|
-
page.wait_for_timeout(500)
|
|
273
|
-
```
|
|
232
|
+
🎭 Stealthy Playwright examples are located in [./examples/cdp_mode/playwright/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/).
|
|
274
233
|
|
|
275
|
-
|
|
276
|
-
<img src="https://seleniumbase.github.io/other/sannysoft_success.jpg" width="470" alt="All Sannysoft tests passed successfully" />
|
|
277
|
-
<br /><em>(All Sannysoft bot-detection tests passed successfully.)</em>
|
|
278
|
-
</p>
|
|
234
|
+
📚 Examples that have `test_` or `_test` in the filename are specifically designed to run with `pytest` / `pynose`. Other examples run directly with raw `python` (those files generally start with `raw_` to avoid confusion).
|
|
279
235
|
|
|
280
236
|
--------
|
|
281
237
|
|
|
282
|
-
<
|
|
238
|
+
<b>📝 Here's a Python <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_planetmc.py" target="_blank">example</a> 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 Planet Minecraft where it bypasses the CAPTCHA)
|
|
283
239
|
|
|
284
240
|
```python
|
|
285
241
|
from seleniumbase import sb_cdp
|
|
286
242
|
|
|
287
|
-
sb = sb_cdp.Chrome()
|
|
288
|
-
sb.goto("https://
|
|
289
|
-
sb.
|
|
290
|
-
sb.
|
|
291
|
-
sb.
|
|
292
|
-
sb.
|
|
293
|
-
sb.
|
|
294
|
-
sb.
|
|
295
|
-
sb.
|
|
296
|
-
sb.
|
|
297
|
-
sb.drag_and_drop("img#logo", "div#drop2")
|
|
298
|
-
sb.nested_click("iframe#myFrame3", ".fBox")
|
|
299
|
-
sb.highlight("#myButton")
|
|
243
|
+
sb = sb_cdp.Chrome(incognito=True)
|
|
244
|
+
sb.goto("https://www.planetminecraft.com/account")
|
|
245
|
+
sb.assert_element('input[name="login"]')
|
|
246
|
+
sb.type('input[name="email"]', "test@example.com")
|
|
247
|
+
sb.type('input[name="password"]', "Fake_Password")
|
|
248
|
+
sb.click("input#autologin") # The checkbox
|
|
249
|
+
if sb.is_element_visible("input[disabled]"):
|
|
250
|
+
sb.solve_captcha() # Enables the input
|
|
251
|
+
sb.assert_element_absent("input[disabled]")
|
|
252
|
+
sb.sleep(1.5)
|
|
300
253
|
sb.quit()
|
|
301
254
|
```
|
|
302
255
|
|
|
303
|
-
|
|
256
|
+
> `python raw_cdp_planetmc.py`
|
|
304
257
|
|
|
305
|
-
<p align="left"
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
from seleniumbase import sb_cdp
|
|
258
|
+
<p align="left">
|
|
259
|
+
<img src="https://seleniumbase.github.io/other/pmc_captcha_2.png" width="530" style="max-width: 100% !important; height: auto !important;" alt="Cloudflare Turnstile bypassed successfully" />
|
|
260
|
+
</p>
|
|
309
261
|
|
|
310
|
-
sb
|
|
311
|
-
sb.goto("https://browserscan.net/bot-detection")
|
|
312
|
-
sb.flash("Test Results", duration=1.5, pause=0.5)
|
|
313
|
-
sb.assert_element('strong:contains("Normal")')
|
|
314
|
-
print("Bot Not Detected")
|
|
315
|
-
sb.flash('strong:contains("Normal")', pause=1)
|
|
316
|
-
sb.quit()
|
|
317
|
-
```
|
|
262
|
+
✅ <b><code>sb.solve_captcha()</code></b> handles CAPTCHAs that aren't bypassed automatically.<br />(If called when there's no CAPTCHA on the page, then nothing happens / no-op.)
|
|
318
263
|
|
|
319
264
|
--------
|
|
320
265
|
|
|
@@ -323,33 +268,46 @@ sb.quit()
|
|
|
323
268
|
```python
|
|
324
269
|
from seleniumbase import sb_cdp
|
|
325
270
|
|
|
326
|
-
sb = sb_cdp.Chrome()
|
|
271
|
+
sb = sb_cdp.Chrome(fast=True)
|
|
327
272
|
sb.goto("https://news.ycombinator.com/submitted?id=seleniumbase")
|
|
328
273
|
elements = sb.find_elements("span.titleline > a")
|
|
329
274
|
for element in elements:
|
|
330
275
|
print("* " + element.text)
|
|
331
276
|
```
|
|
332
277
|
|
|
278
|
+
> `python raw_cdp_yc_news.py`
|
|
279
|
+
|
|
280
|
+
<p align="left">
|
|
281
|
+
<img src="https://seleniumbase.github.io/other/yc_news_results.png" alt="SeleniumBase" width="510" style="max-width: 100% !important; height: auto !important;"/>
|
|
282
|
+
</p>
|
|
283
|
+
|
|
333
284
|
--------
|
|
334
285
|
|
|
335
|
-
|
|
286
|
+
<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>
|
|
336
287
|
|
|
337
|
-
|
|
288
|
+
```python
|
|
289
|
+
from seleniumbase import SB
|
|
338
290
|
|
|
339
|
-
|
|
291
|
+
with SB(uc=True, test=True, locale="en") as sb:
|
|
292
|
+
sb.activate_cdp_mode()
|
|
293
|
+
sb.goto("https://gitlab.com/users/sign_in")
|
|
294
|
+
sb.sleep(2)
|
|
295
|
+
sb.solve_captcha()
|
|
296
|
+
sb.highlight('h1:contains("GitLab")')
|
|
297
|
+
sb.highlight('button:contains("Sign in")')
|
|
298
|
+
```
|
|
340
299
|
|
|
341
|
-
|
|
300
|
+
> `python raw_gitlab.py`
|
|
342
301
|
|
|
343
|
-
<p align="
|
|
344
|
-
<img src="https://seleniumbase.github.io/other/
|
|
345
|
-
<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>
|
|
302
|
+
<p align="left">
|
|
303
|
+
<img src="https://seleniumbase.github.io/other/gitlab_bypass_2.png" alt="SeleniumBase" width="420" style="max-width: 100% !important; height: auto !important;"/>
|
|
346
304
|
</p>
|
|
347
305
|
|
|
348
306
|
--------
|
|
349
307
|
|
|
350
308
|
<h3 align="left">🌐 CLI Options for Supported Chromium Browsers</h3>
|
|
351
309
|
|
|
352
|
-
<p>💡 You can set
|
|
310
|
+
<p>💡 You can set which Chromium browser to use via command-line parameters:</p>
|
|
353
311
|
|
|
354
312
|
```zsh
|
|
355
313
|
python SCRIPT.py --chromium # Use the unbranded Chromium browser
|
|
@@ -368,76 +326,14 @@ sb = sb_cdp.Chrome(use_chromium=True)
|
|
|
368
326
|
|
|
369
327
|
--------
|
|
370
328
|
|
|
371
|
-
<
|
|
372
|
-
|
|
373
|
-
```python
|
|
374
|
-
from seleniumbase import SB
|
|
375
|
-
|
|
376
|
-
with SB(uc=True, test=True) as sb:
|
|
377
|
-
sb.activate_cdp_mode()
|
|
378
|
-
sb.goto("https://google.com/ncr")
|
|
379
|
-
sb.click_if_visible('button:contains("Accept all")')
|
|
380
|
-
sb.type('[name="q"]', "SeleniumBase GitHub page")
|
|
381
|
-
sb.click('[value="Google Search"]')
|
|
382
|
-
sb.sleep(4) # The "AI Overview" sometimes loads
|
|
383
|
-
print(sb.get_page_title())
|
|
384
|
-
sb.save_as_pdf_to_logs()
|
|
385
|
-
sb.save_page_source_to_logs()
|
|
386
|
-
sb.save_screenshot_to_logs()
|
|
387
|
-
print("Logs have been saved to: ./latest_logs/")
|
|
388
|
-
```
|
|
389
|
-
|
|
390
|
-
--------
|
|
391
|
-
|
|
392
|
-
<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><br />(If the Turnstile isn't bypassed automatically, <b><code>sb.solve_captcha()</code></b> handles it.)</p>
|
|
393
|
-
|
|
394
|
-
```python
|
|
395
|
-
from seleniumbase import SB
|
|
396
|
-
|
|
397
|
-
with SB(uc=True, test=True, locale="en") as sb:
|
|
398
|
-
url = "https://gitlab.com/users/sign_in"
|
|
399
|
-
sb.activate_cdp_mode(url)
|
|
400
|
-
sb.sleep(2)
|
|
401
|
-
sb.solve_captcha()
|
|
402
|
-
# (The rest is for testing and demo purposes)
|
|
403
|
-
sb.assert_text("Username", '[for="user_login"]', timeout=3)
|
|
404
|
-
sb.assert_element('label[for="user_login"]')
|
|
405
|
-
sb.highlight('button:contains("Sign in")')
|
|
406
|
-
sb.highlight('h1:contains("GitLab")')
|
|
407
|
-
sb.post_message("SeleniumBase wasn't detected", duration=4)
|
|
408
|
-
```
|
|
409
|
-
|
|
410
|
-
<p align="center">
|
|
411
|
-
<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" />
|
|
412
|
-
<br /><em>(Successfully bypassed bot-detection on a Cloudflare challenge page.)</em>
|
|
413
|
-
</p>
|
|
414
|
-
|
|
415
|
-
💡 <b><code>sb.solve_captcha()</code></b> handles CAPTCHAs that aren't bypassed automatically.<br />(If no CAPTCHA is present on the current page, then nothing happens.)
|
|
416
|
-
|
|
417
|
-
--------
|
|
418
|
-
|
|
419
|
-
<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>
|
|
420
|
-
|
|
421
|
-
```python
|
|
422
|
-
from seleniumbase import sb_cdp
|
|
329
|
+
<h3 align="left">⚙️ Stealthy architecture flowchart:</h3>
|
|
423
330
|
|
|
424
|
-
|
|
425
|
-
sb.goto("https://gitlab.com/users/sign_in")
|
|
426
|
-
sb.sleep(2)
|
|
427
|
-
sb.solve_captcha()
|
|
428
|
-
sb.highlight('h1:contains("GitLab")')
|
|
429
|
-
sb.highlight('button:contains("Sign in")')
|
|
430
|
-
sb.quit()
|
|
431
|
-
```
|
|
331
|
+
<img src="https://seleniumbase.github.io/other/sb_architecture.png" width="540" style="max-width: 100% !important; height: auto !important;" alt="Stealthy architecture flowchart" />
|
|
432
332
|
|
|
433
333
|
--------
|
|
434
334
|
|
|
435
335
|
<h3>🧪 Comprehensive E2E Testing with <code>pytest</code>:</h3>
|
|
436
336
|
|
|
437
|
-
📚 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).
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
337
|
<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>
|
|
442
338
|
|
|
443
339
|
```python
|
|
@@ -464,7 +360,9 @@ class MyTestClass(BaseCase):
|
|
|
464
360
|
|
|
465
361
|
> `pytest test_get_swag.py`
|
|
466
362
|
|
|
467
|
-
<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>
|
|
363
|
+
<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" style="max-width: 100% !important; height: auto !important;" /></a>
|
|
364
|
+
|
|
365
|
+
🥷 For stealth with `pytest`, add `--uc` as a command-line option.
|
|
468
366
|
|
|
469
367
|
--------
|
|
470
368
|
|
|
@@ -474,7 +372,7 @@ class MyTestClass(BaseCase):
|
|
|
474
372
|
pytest test_coffee_cart.py --demo
|
|
475
373
|
```
|
|
476
374
|
|
|
477
|
-
<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>
|
|
375
|
+
<p align="left"><a href="https://seleniumbase.io/coffee/" target="_blank"><img src="https://seleniumbase.github.io/cdn/gif/coffee_cart.gif" width="500" style="max-width: 100% !important; height: auto !important;" alt="SeleniumBase Coffee Cart Test" /></a></p>
|
|
478
376
|
|
|
479
377
|
> <p>(<code translate="no">--demo</code> mode slows down tests and highlights actions)</p>
|
|
480
378
|
|
|
@@ -488,11 +386,11 @@ pytest test_coffee_cart.py --demo
|
|
|
488
386
|
pytest test_demo_site.py
|
|
489
387
|
```
|
|
490
388
|
|
|
491
|
-
<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>
|
|
389
|
+
<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" style="max-width: 100% !important; height: auto !important;" alt="SeleniumBase Example" /></a></p>
|
|
492
390
|
|
|
493
391
|
> Easy to type, click, select, toggle, drag & drop, and more.
|
|
494
392
|
|
|
495
|
-
|
|
393
|
+
📚 For more examples, see the <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/ReadMe.md">SeleniumBase/examples/</a> folder.
|
|
496
394
|
|
|
497
395
|
--------
|
|
498
396
|
|
|
@@ -626,7 +524,7 @@ finally:
|
|
|
626
524
|
🔵 Using a <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/virtualenv_instructions.md">Python virtual env</a> is recommended.
|
|
627
525
|
|
|
628
526
|
<a id="install_seleniumbase"></a>
|
|
629
|
-
<h2><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Install SeleniumBase:</h2>
|
|
527
|
+
<h2><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" height="32" /> Install SeleniumBase:</h2>
|
|
630
528
|
|
|
631
529
|
🔵 **How to install `seleniumbase` from [PyPI](https://pypi.org/project/seleniumbase/) using `pip`:**
|
|
632
530
|
|
|
@@ -729,7 +627,7 @@ chromedriver
|
|
|
729
627
|
|
|
730
628
|
|
|
731
629
|
<a id="basic_example_and_usage"></a>
|
|
732
|
-
<h2><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Basic Example / Usage:</h2>
|
|
630
|
+
<h2><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" height="32" /> Basic Example / Usage:</h2>
|
|
733
631
|
|
|
734
632
|
🔵 If you've cloned SeleniumBase, you can run tests from the [examples/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples) folder.
|
|
735
633
|
|
|
@@ -740,7 +638,7 @@ cd examples/
|
|
|
740
638
|
pytest my_first_test.py
|
|
741
639
|
```
|
|
742
640
|
|
|
743
|
-
<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>
|
|
641
|
+
<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" style="max-width: 100% !important; height: auto !important;" /></a>
|
|
744
642
|
|
|
745
643
|
<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>
|
|
746
644
|
|
|
@@ -780,7 +678,7 @@ class MyTestClass(BaseCase):
|
|
|
780
678
|
|
|
781
679
|
|
|
782
680
|
<a id="common_methods"></a>
|
|
783
|
-
<h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Here are some common SeleniumBase methods:</h3>
|
|
681
|
+
<h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" height="32" /> Here are some common SeleniumBase methods:</h3>
|
|
784
682
|
|
|
785
683
|
```python
|
|
786
684
|
self.goto(url) # Navigate the browser window to the URL.
|
|
@@ -824,7 +722,7 @@ self.assert_no_js_errors() # Verify there are no JS errors.
|
|
|
824
722
|
|
|
825
723
|
|
|
826
724
|
<a id="fun_facts"></a>
|
|
827
|
-
<h2><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Fun Facts / Learn More:</h2>
|
|
725
|
+
<h2><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" height="32" /> Fun Facts / Learn More:</h2>
|
|
828
726
|
|
|
829
727
|
<p>✅ SeleniumBase automatically handles common <a href="https://www.selenium.dev/documentation/webdriver/" target="_blank">WebDriver</a> actions such as launching web browsers before tests, saving screenshots during failures, and closing web browsers after tests.</p>
|
|
830
728
|
|
|
@@ -892,7 +790,7 @@ pynose [FILE_NAME.py]:[CLASS_NAME].[METHOD_NAME]
|
|
|
892
790
|
|
|
893
791
|
|
|
894
792
|
<a id="demo_mode_and_debugging"></a>
|
|
895
|
-
<h2><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Demo Mode / Debugging:</h2>
|
|
793
|
+
<h2><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" height="32" /> Demo Mode / Debugging:</h2>
|
|
896
794
|
|
|
897
795
|
🔵 <b>Demo Mode</b> helps you see what a test is doing. If a test is moving too fast for your eyes, run it in <b>Demo Mode</b> to pause the browser briefly between actions, highlight page elements being acted on, and display assertions:
|
|
898
796
|
|
|
@@ -926,7 +824,7 @@ pytest test_fail.py --pdb
|
|
|
926
824
|
pytest test_coffee_cart.py --trace
|
|
927
825
|
```
|
|
928
826
|
|
|
929
|
-
<a href="https://github.com/mdmintz/pdbp"><img src="https://seleniumbase.github.io/cdn/gif/coffee_pdbp.gif" alt="SeleniumBase test with the pdbp (Pdb+) debugger" title="SeleniumBase test with the pdbp (Pdb+) debugger" /></a>
|
|
827
|
+
<a href="https://github.com/mdmintz/pdbp"><img src="https://seleniumbase.github.io/cdn/gif/coffee_pdbp.gif" alt="SeleniumBase test with the pdbp (Pdb+) debugger" title="SeleniumBase test with the pdbp (Pdb+) debugger" width="540" style="max-width: 100% !important; height: auto !important;" /></a>
|
|
930
828
|
|
|
931
829
|
|
|
932
830
|
<a id="command_line_options"></a>
|
|
@@ -1010,6 +908,7 @@ pytest test_coffee_cart.py --trace
|
|
|
1010
908
|
--archive-logs # (Archive existing log files instead of deleting them.)
|
|
1011
909
|
--archive-downloads # (Archive old downloads instead of deleting them.)
|
|
1012
910
|
--time-limit=SECONDS # (Safely fail any test that exceeds the time limit.)
|
|
911
|
+
--fast # (Run the automation at full speed. May impact stealth.)
|
|
1013
912
|
--slow # (Slow down the automation. Faster than using Demo Mode.)
|
|
1014
913
|
--demo # (Slow down and visually see test actions as they occur.)
|
|
1015
914
|
--demo-sleep=SECONDS # (Set the wait time after Slow & Demo Mode actions.)
|
|
@@ -1085,7 +984,7 @@ Here's the command-line option to add to tests: (See [examples/custom_settings.p
|
|
|
1085
984
|
Inside your tests, you can use `self.data` to access that.
|
|
1086
985
|
|
|
1087
986
|
<a id="directory_configuration"></a>
|
|
1088
|
-
<h2><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Directory Configuration:</h2>
|
|
987
|
+
<h2><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" height="32" /> Directory Configuration:</h2>
|
|
1089
988
|
|
|
1090
989
|
🔵 When running tests with **`pytest`**, you'll want a copy of **[pytest.ini](https://github.com/seleniumbase/SeleniumBase/blob/master/pytest.ini)** in your root folders. When running tests with **`pynose`**, you'll want a copy of **[setup.cfg](https://github.com/seleniumbase/SeleniumBase/blob/master/setup.cfg)** in your root folders. These files specify default configuration details for tests. Test folders should also include a blank **[__init__.py](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/offline_examples/__init__.py)** file to allow your test files to import other files from that folder.
|
|
1091
990
|
|
|
@@ -1150,7 +1049,7 @@ ui_tests/
|
|
|
1150
1049
|
|
|
1151
1050
|
--------
|
|
1152
1051
|
|
|
1153
|
-
<h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Log files from failed tests:</h3>
|
|
1052
|
+
<h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" height="32" /> Log files from failed tests:</h3>
|
|
1154
1053
|
|
|
1155
1054
|
Let's try an example of a test that fails:
|
|
1156
1055
|
|
|
@@ -1177,7 +1076,7 @@ pytest test_fail.py
|
|
|
1177
1076
|
--------
|
|
1178
1077
|
|
|
1179
1078
|
<a id="seleniumbase_dashboard"></a>
|
|
1180
|
-
<h2><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> SeleniumBase Dashboard:</h2>
|
|
1079
|
+
<h2><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" height="32" /> SeleniumBase Dashboard:</h2>
|
|
1181
1080
|
|
|
1182
1081
|
🔵 The `--dashboard` option for pytest generates a SeleniumBase Dashboard located at `dashboard.html`, which updates automatically as tests run and produce results. Example:
|
|
1183
1082
|
|
|
@@ -1185,7 +1084,7 @@ pytest test_fail.py
|
|
|
1185
1084
|
pytest --dashboard --rs --headless
|
|
1186
1085
|
```
|
|
1187
1086
|
|
|
1188
|
-
<img src="https://seleniumbase.github.io/cdn/img/dashboard_1.png" alt="The SeleniumBase Dashboard" title="The SeleniumBase Dashboard" width="380" />
|
|
1087
|
+
<img src="https://seleniumbase.github.io/cdn/img/dashboard_1.png" alt="The SeleniumBase Dashboard" title="The SeleniumBase Dashboard" width="380" style="max-width: 100% !important; height: auto !important;" />
|
|
1189
1088
|
|
|
1190
1089
|
🔵 Additionally, you can host your own SeleniumBase Dashboard Server on a port of your choice. Here's an example of that using Python's `http.server`:
|
|
1191
1090
|
|
|
@@ -1201,12 +1100,12 @@ python -m http.server 1948
|
|
|
1201
1100
|
pytest test_suite.py test_image_saving.py --dashboard --rs --headless
|
|
1202
1101
|
```
|
|
1203
1102
|
|
|
1204
|
-
<img src="https://seleniumbase.github.io/cdn/img/dashboard_2.png" alt="The SeleniumBase Dashboard" title="The SeleniumBase Dashboard" width="520" />
|
|
1103
|
+
<img src="https://seleniumbase.github.io/cdn/img/dashboard_2.png" alt="The SeleniumBase Dashboard" title="The SeleniumBase Dashboard" width="520" style="max-width: 100% !important; height: auto !important;" />
|
|
1205
1104
|
|
|
1206
1105
|
--------
|
|
1207
1106
|
|
|
1208
1107
|
<a id="creating_visual_reports"></a>
|
|
1209
|
-
<h2><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Generating Test Reports:</h2>
|
|
1108
|
+
<h2><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" height="32" /> Generating Test Reports:</h2>
|
|
1210
1109
|
|
|
1211
1110
|
<h3>🔵 <code>pytest</code> HTML Reports:</h3>
|
|
1212
1111
|
|
|
@@ -1216,7 +1115,7 @@ pytest test_suite.py test_image_saving.py --dashboard --rs --headless
|
|
|
1216
1115
|
pytest test_suite.py --html=report.html
|
|
1217
1116
|
```
|
|
1218
1117
|
|
|
1219
|
-
<img src="https://seleniumbase.github.io/cdn/img/html_report.png" alt="Example Pytest Report" title="Example Pytest Report" width="520" />
|
|
1118
|
+
<img src="https://seleniumbase.github.io/cdn/img/html_report.png" alt="Example Pytest Report" title="Example Pytest Report" width="520" style="max-width: 100% !important; height: auto !important;" />
|
|
1220
1119
|
|
|
1221
1120
|
✅ When combining pytest html reports with SeleniumBase Dashboard usage, the pie chart from the Dashboard will get added to the html report. Additionally, if you set the html report URL to be the same as the Dashboard URL when also using the dashboard, (example: `--dashboard --html=dashboard.html`), then the Dashboard will become an advanced html report when all the tests complete.
|
|
1222
1121
|
|
|
@@ -1226,7 +1125,7 @@ pytest test_suite.py --html=report.html
|
|
|
1226
1125
|
pytest test_suite.py --dashboard --html=report.html
|
|
1227
1126
|
```
|
|
1228
1127
|
|
|
1229
|
-
<img src="https://seleniumbase.github.io/cdn/img/dash_report.jpg" alt="Dashboard Pytest HTML Report" title="Dashboard Pytest HTML Report" width="520" />
|
|
1128
|
+
<img src="https://seleniumbase.github.io/cdn/img/dash_report.jpg" alt="Dashboard Pytest HTML Report" title="Dashboard Pytest HTML Report" width="520" style="max-width: 100% !important; height: auto !important;" />
|
|
1230
1129
|
|
|
1231
1130
|
If viewing pytest html reports in [Jenkins](https://www.jenkins.io/), you may need to [configure Jenkins settings](https://stackoverflow.com/a/46197356/7058266) for the html to render correctly. This is due to [Jenkins CSP changes](https://www.jenkins.io/doc/book/system-administration/security/configuring-content-security-policy/).
|
|
1232
1131
|
|
|
@@ -1244,7 +1143,7 @@ The `--report` option gives you a fancy report after your test suite completes.
|
|
|
1244
1143
|
pynose test_suite.py --report
|
|
1245
1144
|
```
|
|
1246
1145
|
|
|
1247
|
-
<img src="https://seleniumbase.github.io/cdn/img/nose_report.png" alt="Example pynose Report" title="Example pynose Report" width="320" />
|
|
1146
|
+
<img src="https://seleniumbase.github.io/cdn/img/nose_report.png" alt="Example pynose Report" title="Example pynose Report" width="320" style="max-width: 100% !important; height: auto !important;" />
|
|
1248
1147
|
|
|
1249
1148
|
(NOTE: You can add `--show-report` to immediately display pynose reports after the test suite completes. Only use `--show-report` when running tests locally because it pauses the test run.)
|
|
1250
1149
|
|
|
@@ -1256,7 +1155,7 @@ pynose test_suite.py --report
|
|
|
1256
1155
|
behave behave_bdd/features/ -D dashboard -D headless
|
|
1257
1156
|
```
|
|
1258
1157
|
|
|
1259
|
-
<img src="https://seleniumbase.github.io/cdn/img/sb_behave_dashboard.png" title="SeleniumBase" width="520" />
|
|
1158
|
+
<img src="https://seleniumbase.github.io/cdn/img/sb_behave_dashboard.png" title="SeleniumBase" width="520" style="max-width: 100% !important; height: auto !important;" />
|
|
1260
1159
|
|
|
1261
1160
|
You can also use `--junit` to get `.xml` reports for each <code translate="no">behave</code> feature. Jenkins can use these files to display better reporting for your tests.
|
|
1262
1161
|
|
|
@@ -1282,7 +1181,7 @@ pytest test_suite.py --alluredir=allure_results
|
|
|
1282
1181
|
|
|
1283
1182
|
--------
|
|
1284
1183
|
|
|
1285
|
-
<h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Using a Proxy Server:</h3>
|
|
1184
|
+
<h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" height="32" /> Using a Proxy Server:</h3>
|
|
1286
1185
|
|
|
1287
1186
|
If you wish to use a proxy server for your browser tests (Chromium or Firefox), you can add `--proxy=IP_ADDRESS:PORT` as an argument on the command line.
|
|
1288
1187
|
|
|
@@ -1311,7 +1210,7 @@ pytest proxy_test.py --proxy=proxy1
|
|
|
1311
1210
|
```
|
|
1312
1211
|
|
|
1313
1212
|
|
|
1314
|
-
<h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Changing the User-Agent:</h3>
|
|
1213
|
+
<h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" height="32" /> Changing the User-Agent:</h3>
|
|
1315
1214
|
|
|
1316
1215
|
🔵 If you wish to change the User-Agent for your browser tests (Chromium and Firefox only), you can add `--agent="USER AGENT STRING"` as an argument on the command-line.
|
|
1317
1216
|
|
|
@@ -1320,12 +1219,12 @@ pytest user_agent_test.py --agent="Mozilla/5.0 (Nintendo 3DS; U; ; en) Version/1
|
|
|
1320
1219
|
```
|
|
1321
1220
|
|
|
1322
1221
|
|
|
1323
|
-
<h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Handling Pop-Up Alerts:</h3>
|
|
1222
|
+
<h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" height="32" /> Handling Pop-Up Alerts:</h3>
|
|
1324
1223
|
|
|
1325
1224
|
🔵 <code translate="no">self.accept_alert()</code> automatically waits for and accepts alert pop-ups. <code translate="no">self.dismiss_alert()</code> automatically waits for and dismisses alert pop-ups. On occasion, some methods like <code translate="no">self.click(SELECTOR)</code> might dismiss a pop-up on its own because they call JavaScript to make sure that the <code translate="no">readyState</code> of the page is <code translate="no">complete</code> before advancing. If you're trying to accept a pop-up that got dismissed this way, use this workaround: Call <code translate="no">self.find_element(SELECTOR).click()</code> instead, (which will let the pop-up remain on the screen), and then use <code translate="no">self.accept_alert()</code> to accept the pop-up (<a href="https://github.com/seleniumbase/SeleniumBase/issues/600#issuecomment-647270426">more on that here</a>). If pop-ups are intermittent, wrap code in a try/except block.
|
|
1326
1225
|
|
|
1327
1226
|
|
|
1328
|
-
<h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Building Guided Tours for Websites:</h3>
|
|
1227
|
+
<h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" height="32" /> Building Guided Tours for Websites:</h3>
|
|
1329
1228
|
|
|
1330
1229
|
🔵 Learn about <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/tour_examples/ReadMe.md">SeleniumBase Interactive Walkthroughs</a> (in the `examples/tour_examples/` folder). It's great for prototyping a website onboarding experience.
|
|
1331
1230
|
|
|
@@ -1335,7 +1234,7 @@ pytest user_agent_test.py --agent="Mozilla/5.0 (Nintendo 3DS; U; ; en) Version/1
|
|
|
1335
1234
|
--------
|
|
1336
1235
|
|
|
1337
1236
|
<div></div>
|
|
1338
|
-
<h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Production Environments & Integrations:</h3>
|
|
1237
|
+
<h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" height="32" /> Production Environments & Integrations:</h3>
|
|
1339
1238
|
|
|
1340
1239
|
<div></div>
|
|
1341
1240
|
<details>
|
|
@@ -1361,7 +1260,7 @@ pytest [YOUR_TEST_FILE.py] --with-db-reporting --with-s3-logging
|
|
|
1361
1260
|
|
|
1362
1261
|
|
|
1363
1262
|
<a id="detailed_method_specifications"></a>
|
|
1364
|
-
<h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Detailed Method Specifications and Examples:</h3>
|
|
1263
|
+
<h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" height="32" /> Detailed Method Specifications and Examples:</h3>
|
|
1365
1264
|
|
|
1366
1265
|
🔵 **Navigating to a web page: (and related commands)**
|
|
1367
1266
|
|
|
@@ -1714,16 +1613,16 @@ pytest --reruns=1 --reruns-delay=1
|
|
|
1714
1613
|
|
|
1715
1614
|
--------
|
|
1716
1615
|
|
|
1717
|
-
<h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Wrap-Up</h3>
|
|
1616
|
+
<h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" height="32" /> Wrap-Up</h3>
|
|
1718
1617
|
|
|
1719
1618
|
<p>
|
|
1720
1619
|
<div><b>If you see something, say something!</b></div>
|
|
1721
|
-
<div><a href="https://github.com/seleniumbase/SeleniumBase/issues?q=is%3Aissue+is%3Aclosed"><img src="https://img.shields.io/github/issues-closed-raw/seleniumbase/SeleniumBase.svg?color=22BB88" title="Closed Issues" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/pulls?q=is%3Apr+is%3Aclosed"><img src="https://img.shields.io/github/issues-pr-closed/seleniumbase/SeleniumBase.svg?logo=github&logoColor=white&color=22BB99" title="Closed Pull Requests" /></a></div>
|
|
1620
|
+
<div><a href="https://github.com/seleniumbase/SeleniumBase/issues?q=is%3Aissue+is%3Aclosed"><img src="https://img.shields.io/github/issues-closed-raw/seleniumbase/SeleniumBase.svg?color=22BB88" title="Closed Issues" height="20" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/pulls?q=is%3Apr+is%3Aclosed"><img src="https://img.shields.io/github/issues-pr-closed/seleniumbase/SeleniumBase.svg?logo=github&logoColor=white&color=22BB99" title="Closed Pull Requests" height="20" /></a></div>
|
|
1722
1621
|
</p>
|
|
1723
1622
|
|
|
1724
|
-
<p align="left"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/sb_logo_10t.png" alt="SeleniumBase" title="SeleniumBase" width="274" /></a></p>
|
|
1623
|
+
<p align="left"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/sb_logo_10t.png" alt="SeleniumBase" title="SeleniumBase" width="274" style="max-width: 100% !important; height: auto !important;" /></a></p>
|
|
1725
1624
|
|
|
1726
|
-
<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>
|
|
1625
|
+
<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" height="20" /></a>
|
|
1727
1626
|
|
|
1728
1627
|
<p><div>
|
|
1729
1628
|
<span><a href="https://www.youtube.com/playlist?list=PLp9uKicxkBc5UIlGi2BuE3aWC7JyXpD3m"><img src="https://seleniumbase.github.io/cdn/img/youtube.png" title="SeleniumBase Playlist on YouTube" alt="SeleniumBase Playlist on YouTube" width="70" /></a></span>
|
|
@@ -1734,9 +1633,9 @@ pytest --reruns=1 --reruns-delay=1
|
|
|
1734
1633
|
|
|
1735
1634
|
<p><div><b><a href="https://github.com/mdmintz">https://github.com/mdmintz</a></b></div></p>
|
|
1736
1635
|
|
|
1737
|
-
<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>
|
|
1636
|
+
<div><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/super_logo_sb3.png" title="SeleniumBase" width="310" style="max-width: 100% !important; height: auto !important;" /></a></div>
|
|
1738
1637
|
<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>
|
|
1739
|
-
<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>
|
|
1638
|
+
<div><a href="https://seleniumbase.io"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg" alt="SeleniumBase Docs" height="20" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/LICENSE"><img src="https://img.shields.io/badge/license-MIT-22BBCC.svg" title="SeleniumBase" height="20" /></a> </div>
|
|
1740
1639
|
<div align="left"></div>
|
|
1741
|
-
<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>
|
|
1742
|
-
<div><a href="https://www.youtube.com/@MichaelMintz"><img src="https://img.shields.io/badge/docs-MichaelMintz-D12345.svg?style=flat&logo=YouTube&logoColor=white&label=YouTube" alt="YouTube Channel" /></a></div>
|
|
1640
|
+
<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" height="20" /></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" height="20" /></a></div>
|
|
1641
|
+
<div><a href="https://www.youtube.com/@MichaelMintz"><img src="https://img.shields.io/badge/docs-MichaelMintz-D12345.svg?style=flat&logo=YouTube&logoColor=white&label=YouTube" alt="YouTube Channel" height="20" /></a></div>
|