seleniumbase 4.55.0__tar.gz → 4.55.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {seleniumbase-4.55.0/seleniumbase.egg-info → seleniumbase-4.55.1}/PKG-INFO +89 -167
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/README.md +83 -161
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/requirements.txt +3 -3
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/__version__.py +1 -1
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/behave/behave_sb.py +6 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/browser_launcher.py +11 -2
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/sb_cdp.py +82 -37
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/fixtures/base_case.py +1 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/fixtures/constants.py +3 -3
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/plugins/pytest_plugin.py +11 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/plugins/sb_manager.py +9 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/plugins/selenium_plugin.py +11 -1
- {seleniumbase-4.55.0 → seleniumbase-4.55.1/seleniumbase.egg-info}/PKG-INFO +89 -167
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase.egg-info/requires.txt +5 -5
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/setup.py +5 -5
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/.gitignore +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/LICENSE +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/MANIFEST.in +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/install.sh +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/mcp_servers/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/mcp_servers/server.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/pyproject.toml +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/pytest.ini +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/sbase/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/sbase/__main__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/sbase/steps.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/__main__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/behave/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/behave/behave_helper.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/behave/steps.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/common/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/common/decorators.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/common/encryption.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/common/exceptions.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/common/obfuscate.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/common/unobfuscate.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/config/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/config/ad_block_list.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/config/proxy_list.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/config/settings.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/console_scripts/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/console_scripts/logo_helper.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/console_scripts/rich_helper.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/console_scripts/run.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/console_scripts/sb_commander.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/console_scripts/sb_install.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/console_scripts/sb_objectify.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/console_scripts/sb_print.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/console_scripts/sb_recorder.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/application_manager.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/capabilities_parser.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/colored_traceback.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/create_db_tables.sql +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/detect_b_ver.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/download_helper.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/encoded_images.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/jqc_helper.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/log_helper.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/mysql.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/nest_asyncio.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/proxy_helper.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/recorder_helper.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/report_helper.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/s3_manager.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/sb_driver.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/session_helper.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/settings_parser.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/style_sheet.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/testcase_manager.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/tour_helper.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/visual_helper.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/drivers/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/drivers/brave_drivers/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/drivers/cft_drivers/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/drivers/chromium_drivers/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/drivers/chs_drivers/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/drivers/comet_drivers/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/drivers/opera_drivers/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/extensions/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/extensions/ad_block.zip +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/extensions/disable_csp.zip +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/extensions/recorder.zip +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/extensions/sbase_ext.zip +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/fixtures/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/fixtures/css_to_xpath.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/fixtures/errors.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/fixtures/js_utils.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/fixtures/page_actions.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/fixtures/page_utils.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/fixtures/shared_utils.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/fixtures/unittest_helper.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/fixtures/words.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/fixtures/xpath_to_css.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/js_code/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/js_code/active_css_js.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/js_code/live_js.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/js_code/recorder_js.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/masterqa/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/masterqa/master_qa.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/plugins/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/plugins/base_plugin.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/plugins/basic_test_info.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/plugins/driver_manager.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/plugins/page_source.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/plugins/screen_shots.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/resources/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/translate/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/translate/chinese.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/translate/dutch.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/translate/french.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/translate/italian.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/translate/japanese.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/translate/korean.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/translate/master_dict.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/translate/portuguese.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/translate/russian.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/translate/spanish.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/translate/translator.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/undetected/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/undetected/cdp.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/undetected/cdp_driver/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/undetected/cdp_driver/browser.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/undetected/cdp_driver/cdp_util.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/undetected/cdp_driver/config.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/undetected/cdp_driver/connection.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/undetected/cdp_driver/element.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/undetected/cdp_driver/tab.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/undetected/dprocess.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/undetected/options.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/undetected/patcher.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/undetected/reactor.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/undetected/webelement.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/utilities/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/utilities/selenium_grid/font_color +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase.egg-info/SOURCES.txt +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase.egg-info/dependency_links.txt +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase.egg-info/entry_points.txt +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase.egg-info/top_level.txt +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/setup.cfg +0 -0
- {seleniumbase-4.55.0 → seleniumbase-4.55.1}/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.1
|
|
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
|
|
@@ -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.2; 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
|
|
@@ -174,18 +174,16 @@ Dynamic: summary
|
|
|
174
174
|
|
|
175
175
|
<meta property="og:site_name" content="SeleniumBase">
|
|
176
176
|
<meta property="og:title" content="SeleniumBase: Stealthy Chromium Automation with Python; and E2E Testing." />
|
|
177
|
-
<meta property="og:description" content="Stealthy Chromium Automation, including fast, easy, and reliable
|
|
177
|
+
<meta property="og:description" content="Stealthy Chromium Automation, including fast, easy, and reliable E2E testing with Python." />
|
|
178
178
|
<meta property="og:keywords" content="Python, pytest, selenium, webdriver, testing, automation, seleniumbase, framework, dashboard, recorder, reports, screenshots, playwright, stealth, CAPTCHA">
|
|
179
179
|
<meta property="og:image" content="https://seleniumbase.github.io/cdn/img/mac_sb_logo_5b.png" />
|
|
180
180
|
<link rel="icon" href="https://seleniumbase.github.io/img/logo6.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/sbase_text_logo3t.png" alt="SeleniumBase" title="SeleniumBase" width="584" style="max-width: 100% !important; height: auto !important;" /></a></p>
|
|
183
183
|
|
|
184
|
-
<p align="center" class="hero__title"><b>
|
|
184
|
+
<p align="center" class="hero__title"><b>End-to-End Testing and Stealthy Automation</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> |
|
|
@@ -223,98 +221,80 @@ Dynamic: summary
|
|
|
223
221
|
<br />
|
|
224
222
|
</p>
|
|
225
223
|
|
|
226
|
-
--------
|
|
227
|
-
|
|
228
224
|
<ul>
|
|
229
|
-
<li
|
|
225
|
+
<li><b>SeleniumBase bypasses bot-detection with</b> 🥷 <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><b>.</b></li>
|
|
230
226
|
<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
227
|
</ul>
|
|
232
228
|
<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
229
|
</ul>
|
|
240
230
|
|
|
241
231
|
--------
|
|
242
232
|
|
|
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
|
|
233
|
+
<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 PlanetMinecraft where it bypasses the CAPTCHA)
|
|
244
234
|
|
|
245
235
|
```python
|
|
246
236
|
from seleniumbase import sb_cdp
|
|
247
237
|
|
|
248
238
|
sb = sb_cdp.Chrome()
|
|
249
|
-
sb.goto("
|
|
250
|
-
sb.
|
|
239
|
+
sb.goto("www.planetminecraft.com/account/sign_in")
|
|
240
|
+
sb.solve_captcha()
|
|
241
|
+
# "LOG IN" is enabled when the CAPTCHA is bypassed
|
|
242
|
+
sb.wait_for_element_absent("input[disabled]")
|
|
243
|
+
sb.sleep(2)
|
|
251
244
|
sb.quit()
|
|
252
245
|
```
|
|
253
246
|
|
|
254
247
|
<p align="center">
|
|
255
|
-
<img src="https://seleniumbase.github.io/
|
|
256
|
-
<br /><em>(
|
|
248
|
+
<img src="https://seleniumbase.github.io/other/pmc_captcha.png" width="570" style="max-width: 100% !important; height: auto !important;" alt="Cloudflare Turnstile bypassed successfully" />
|
|
249
|
+
<br /><em>(Cloudflare Turnstile bypassed successfully)</em>
|
|
257
250
|
</p>
|
|
258
251
|
|
|
259
|
-
<b
|
|
252
|
+
💡 <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.)
|
|
253
|
+
|
|
254
|
+
----
|
|
260
255
|
|
|
261
|
-
|
|
262
|
-
from playwright.sync_api import sync_playwright
|
|
263
|
-
from seleniumbase import sb_cdp
|
|
256
|
+
<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>
|
|
264
257
|
|
|
265
|
-
|
|
266
|
-
|
|
258
|
+
```python
|
|
259
|
+
from seleniumbase import SB
|
|
267
260
|
|
|
268
|
-
with
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
261
|
+
with SB(uc=True, test=True, locale="en") as sb:
|
|
262
|
+
sb.activate_cdp_mode()
|
|
263
|
+
sb.goto("https://gitlab.com/users/sign_in")
|
|
264
|
+
sb.sleep(2)
|
|
265
|
+
sb.solve_captcha()
|
|
266
|
+
sb.highlight('h1:contains("GitLab")')
|
|
267
|
+
sb.highlight('button:contains("Sign in")')
|
|
273
268
|
```
|
|
274
269
|
|
|
275
270
|
<p align="center">
|
|
276
|
-
<img src="https://seleniumbase.github.io/other/
|
|
277
|
-
<br /><em>(
|
|
271
|
+
<img src="https://seleniumbase.github.io/other/gitlab_bypass.png" alt="SeleniumBase" width="350" style="max-width: 100% !important; height: auto !important;"/>
|
|
272
|
+
<br /><em>(Successfully bypassed bot-detection on a Cloudflare challenge page)</em>
|
|
278
273
|
</p>
|
|
279
274
|
|
|
280
275
|
--------
|
|
281
276
|
|
|
282
|
-
<p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/
|
|
277
|
+
<p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_cdp_google.py" target="_blank">This example</a> searches Google for the SeleniumBase GitHub page and outputs the result as a PDF:</b></p>
|
|
283
278
|
|
|
284
279
|
```python
|
|
285
280
|
from seleniumbase import sb_cdp
|
|
286
281
|
|
|
287
282
|
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.
|
|
298
|
-
|
|
299
|
-
sb.highlight("#myButton")
|
|
283
|
+
sb.goto("https://google.com/ncr")
|
|
284
|
+
sb.click_if_visible('button:contains("Accept all")')
|
|
285
|
+
sb.type('[name="q"]', "SeleniumBase site:github.com")
|
|
286
|
+
sb.sleep(0.2)
|
|
287
|
+
sb.click('[value="Google Search"]')
|
|
288
|
+
sb.sleep(1)
|
|
289
|
+
sb.click_if_visible('h3:contains("seleniumbase/SeleniumBase")')
|
|
290
|
+
sb.sleep(1)
|
|
291
|
+
print(sb.get_page_title())
|
|
292
|
+
sb.save_as_pdf("seleniumbase.pdf", folder="./downloaded_files/")
|
|
293
|
+
print("* PDF saved to ./downloaded_files/seleniumbase.pdf")
|
|
300
294
|
sb.quit()
|
|
301
295
|
```
|
|
302
296
|
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
<p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_browserscan.py" target="_blank">This example</a> expands the Browserscan script into a test demo:</b><br />(Assertions added and elements highlighted with JavaScript.)</p>
|
|
306
|
-
|
|
307
|
-
```python
|
|
308
|
-
from seleniumbase import sb_cdp
|
|
309
|
-
|
|
310
|
-
sb = sb_cdp.Chrome(locale="en", ad_block=True)
|
|
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
|
-
```
|
|
297
|
+
<p align="center"><a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_get_swag.py"><img src="https://seleniumbase.github.io/cdn/gif/google_search_2.gif" alt="SeleniumBase Test" width="500" style="max-width: 100% !important; height: auto !important;" /></a><br /><em>(The PDF will have all search results if SeleniumBase isn't in the list)</em></p>
|
|
318
298
|
|
|
319
299
|
--------
|
|
320
300
|
|
|
@@ -327,9 +307,14 @@ sb = sb_cdp.Chrome()
|
|
|
327
307
|
sb.goto("https://news.ycombinator.com/submitted?id=seleniumbase")
|
|
328
308
|
elements = sb.find_elements("span.titleline > a")
|
|
329
309
|
for element in elements:
|
|
330
|
-
print("* "
|
|
310
|
+
print("* %s" % element.text)
|
|
331
311
|
```
|
|
332
312
|
|
|
313
|
+
<p align="center">
|
|
314
|
+
<img src="https://seleniumbase.github.io/other/yc_news_results.png" alt="SeleniumBase" width="500" style="max-width: 100% !important; height: auto !important;"/>
|
|
315
|
+
<br /><em>(Hacker News results for "SeleniumBase")</em>
|
|
316
|
+
</p>
|
|
317
|
+
|
|
333
318
|
--------
|
|
334
319
|
|
|
335
320
|
🐙 Stealthy CDP Mode examples are located in [./examples/cdp_mode/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples/cdp_mode).
|
|
@@ -341,7 +326,7 @@ for element in elements:
|
|
|
341
326
|
<h3 align="left">⚙️ Stealthy architecture flowchart:</h3>
|
|
342
327
|
|
|
343
328
|
<p align="center">
|
|
344
|
-
<img src="https://seleniumbase.github.io/other/sb_architecture.png" width="646" alt="Stealthy architecture flowchart" />
|
|
329
|
+
<img src="https://seleniumbase.github.io/other/sb_architecture.png" width="646" style="max-width: 100% !important; height: auto !important;" alt="Stealthy architecture flowchart" />
|
|
345
330
|
<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>
|
|
346
331
|
</p>
|
|
347
332
|
|
|
@@ -368,70 +353,6 @@ sb = sb_cdp.Chrome(use_chromium=True)
|
|
|
368
353
|
|
|
369
354
|
--------
|
|
370
355
|
|
|
371
|
-
<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 to <code>./latest_logs/</code>)</p>
|
|
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
|
|
423
|
-
|
|
424
|
-
sb = sb_cdp.Chrome(incognito=True)
|
|
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
|
-
```
|
|
432
|
-
|
|
433
|
-
--------
|
|
434
|
-
|
|
435
356
|
<h3>🧪 Comprehensive E2E Testing with <code>pytest</code>:</h3>
|
|
436
357
|
|
|
437
358
|
📚 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).
|
|
@@ -464,7 +385,7 @@ class MyTestClass(BaseCase):
|
|
|
464
385
|
|
|
465
386
|
> `pytest test_get_swag.py`
|
|
466
387
|
|
|
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>
|
|
388
|
+
<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>
|
|
468
389
|
|
|
469
390
|
--------
|
|
470
391
|
|
|
@@ -474,7 +395,7 @@ class MyTestClass(BaseCase):
|
|
|
474
395
|
pytest test_coffee_cart.py --demo
|
|
475
396
|
```
|
|
476
397
|
|
|
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>
|
|
398
|
+
<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
399
|
|
|
479
400
|
> <p>(<code translate="no">--demo</code> mode slows down tests and highlights actions)</p>
|
|
480
401
|
|
|
@@ -488,7 +409,7 @@ pytest test_coffee_cart.py --demo
|
|
|
488
409
|
pytest test_demo_site.py
|
|
489
410
|
```
|
|
490
411
|
|
|
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>
|
|
412
|
+
<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
413
|
|
|
493
414
|
> Easy to type, click, select, toggle, drag & drop, and more.
|
|
494
415
|
|
|
@@ -626,7 +547,7 @@ finally:
|
|
|
626
547
|
🔵 Using a <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/virtualenv_instructions.md">Python virtual env</a> is recommended.
|
|
627
548
|
|
|
628
549
|
<a id="install_seleniumbase"></a>
|
|
629
|
-
<h2><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Install SeleniumBase:</h2>
|
|
550
|
+
<h2><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" height="32" /> Install SeleniumBase:</h2>
|
|
630
551
|
|
|
631
552
|
🔵 **How to install `seleniumbase` from [PyPI](https://pypi.org/project/seleniumbase/) using `pip`:**
|
|
632
553
|
|
|
@@ -729,7 +650,7 @@ chromedriver
|
|
|
729
650
|
|
|
730
651
|
|
|
731
652
|
<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>
|
|
653
|
+
<h2><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" height="32" /> Basic Example / Usage:</h2>
|
|
733
654
|
|
|
734
655
|
🔵 If you've cloned SeleniumBase, you can run tests from the [examples/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples) folder.
|
|
735
656
|
|
|
@@ -740,7 +661,7 @@ cd examples/
|
|
|
740
661
|
pytest my_first_test.py
|
|
741
662
|
```
|
|
742
663
|
|
|
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>
|
|
664
|
+
<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
665
|
|
|
745
666
|
<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
667
|
|
|
@@ -780,7 +701,7 @@ class MyTestClass(BaseCase):
|
|
|
780
701
|
|
|
781
702
|
|
|
782
703
|
<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>
|
|
704
|
+
<h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" height="32" /> Here are some common SeleniumBase methods:</h3>
|
|
784
705
|
|
|
785
706
|
```python
|
|
786
707
|
self.goto(url) # Navigate the browser window to the URL.
|
|
@@ -824,7 +745,7 @@ self.assert_no_js_errors() # Verify there are no JS errors.
|
|
|
824
745
|
|
|
825
746
|
|
|
826
747
|
<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>
|
|
748
|
+
<h2><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" height="32" /> Fun Facts / Learn More:</h2>
|
|
828
749
|
|
|
829
750
|
<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
751
|
|
|
@@ -892,7 +813,7 @@ pynose [FILE_NAME.py]:[CLASS_NAME].[METHOD_NAME]
|
|
|
892
813
|
|
|
893
814
|
|
|
894
815
|
<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>
|
|
816
|
+
<h2><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" height="32" /> Demo Mode / Debugging:</h2>
|
|
896
817
|
|
|
897
818
|
🔵 <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
819
|
|
|
@@ -926,7 +847,7 @@ pytest test_fail.py --pdb
|
|
|
926
847
|
pytest test_coffee_cart.py --trace
|
|
927
848
|
```
|
|
928
849
|
|
|
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>
|
|
850
|
+
<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
851
|
|
|
931
852
|
|
|
932
853
|
<a id="command_line_options"></a>
|
|
@@ -1010,6 +931,7 @@ pytest test_coffee_cart.py --trace
|
|
|
1010
931
|
--archive-logs # (Archive existing log files instead of deleting them.)
|
|
1011
932
|
--archive-downloads # (Archive old downloads instead of deleting them.)
|
|
1012
933
|
--time-limit=SECONDS # (Safely fail any test that exceeds the time limit.)
|
|
934
|
+
--fast # (Run the automation at full speed. May impact stealth.)
|
|
1013
935
|
--slow # (Slow down the automation. Faster than using Demo Mode.)
|
|
1014
936
|
--demo # (Slow down and visually see test actions as they occur.)
|
|
1015
937
|
--demo-sleep=SECONDS # (Set the wait time after Slow & Demo Mode actions.)
|
|
@@ -1085,7 +1007,7 @@ Here's the command-line option to add to tests: (See [examples/custom_settings.p
|
|
|
1085
1007
|
Inside your tests, you can use `self.data` to access that.
|
|
1086
1008
|
|
|
1087
1009
|
<a id="directory_configuration"></a>
|
|
1088
|
-
<h2><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Directory Configuration:</h2>
|
|
1010
|
+
<h2><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" height="32" /> Directory Configuration:</h2>
|
|
1089
1011
|
|
|
1090
1012
|
🔵 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
1013
|
|
|
@@ -1150,7 +1072,7 @@ ui_tests/
|
|
|
1150
1072
|
|
|
1151
1073
|
--------
|
|
1152
1074
|
|
|
1153
|
-
<h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Log files from failed tests:</h3>
|
|
1075
|
+
<h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" height="32" /> Log files from failed tests:</h3>
|
|
1154
1076
|
|
|
1155
1077
|
Let's try an example of a test that fails:
|
|
1156
1078
|
|
|
@@ -1177,7 +1099,7 @@ pytest test_fail.py
|
|
|
1177
1099
|
--------
|
|
1178
1100
|
|
|
1179
1101
|
<a id="seleniumbase_dashboard"></a>
|
|
1180
|
-
<h2><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> SeleniumBase Dashboard:</h2>
|
|
1102
|
+
<h2><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" height="32" /> SeleniumBase Dashboard:</h2>
|
|
1181
1103
|
|
|
1182
1104
|
🔵 The `--dashboard` option for pytest generates a SeleniumBase Dashboard located at `dashboard.html`, which updates automatically as tests run and produce results. Example:
|
|
1183
1105
|
|
|
@@ -1185,7 +1107,7 @@ pytest test_fail.py
|
|
|
1185
1107
|
pytest --dashboard --rs --headless
|
|
1186
1108
|
```
|
|
1187
1109
|
|
|
1188
|
-
<img src="https://seleniumbase.github.io/cdn/img/dashboard_1.png" alt="The SeleniumBase Dashboard" title="The SeleniumBase Dashboard" width="380" />
|
|
1110
|
+
<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
1111
|
|
|
1190
1112
|
🔵 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
1113
|
|
|
@@ -1201,12 +1123,12 @@ python -m http.server 1948
|
|
|
1201
1123
|
pytest test_suite.py test_image_saving.py --dashboard --rs --headless
|
|
1202
1124
|
```
|
|
1203
1125
|
|
|
1204
|
-
<img src="https://seleniumbase.github.io/cdn/img/dashboard_2.png" alt="The SeleniumBase Dashboard" title="The SeleniumBase Dashboard" width="520" />
|
|
1126
|
+
<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
1127
|
|
|
1206
1128
|
--------
|
|
1207
1129
|
|
|
1208
1130
|
<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>
|
|
1131
|
+
<h2><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" height="32" /> Generating Test Reports:</h2>
|
|
1210
1132
|
|
|
1211
1133
|
<h3>🔵 <code>pytest</code> HTML Reports:</h3>
|
|
1212
1134
|
|
|
@@ -1216,7 +1138,7 @@ pytest test_suite.py test_image_saving.py --dashboard --rs --headless
|
|
|
1216
1138
|
pytest test_suite.py --html=report.html
|
|
1217
1139
|
```
|
|
1218
1140
|
|
|
1219
|
-
<img src="https://seleniumbase.github.io/cdn/img/html_report.png" alt="Example Pytest Report" title="Example Pytest Report" width="520" />
|
|
1141
|
+
<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
1142
|
|
|
1221
1143
|
✅ 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
1144
|
|
|
@@ -1226,7 +1148,7 @@ pytest test_suite.py --html=report.html
|
|
|
1226
1148
|
pytest test_suite.py --dashboard --html=report.html
|
|
1227
1149
|
```
|
|
1228
1150
|
|
|
1229
|
-
<img src="https://seleniumbase.github.io/cdn/img/dash_report.jpg" alt="Dashboard Pytest HTML Report" title="Dashboard Pytest HTML Report" width="520" />
|
|
1151
|
+
<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
1152
|
|
|
1231
1153
|
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
1154
|
|
|
@@ -1244,7 +1166,7 @@ The `--report` option gives you a fancy report after your test suite completes.
|
|
|
1244
1166
|
pynose test_suite.py --report
|
|
1245
1167
|
```
|
|
1246
1168
|
|
|
1247
|
-
<img src="https://seleniumbase.github.io/cdn/img/nose_report.png" alt="Example pynose Report" title="Example pynose Report" width="320" />
|
|
1169
|
+
<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
1170
|
|
|
1249
1171
|
(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
1172
|
|
|
@@ -1256,7 +1178,7 @@ pynose test_suite.py --report
|
|
|
1256
1178
|
behave behave_bdd/features/ -D dashboard -D headless
|
|
1257
1179
|
```
|
|
1258
1180
|
|
|
1259
|
-
<img src="https://seleniumbase.github.io/cdn/img/sb_behave_dashboard.png" title="SeleniumBase" width="520" />
|
|
1181
|
+
<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
1182
|
|
|
1261
1183
|
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
1184
|
|
|
@@ -1282,7 +1204,7 @@ pytest test_suite.py --alluredir=allure_results
|
|
|
1282
1204
|
|
|
1283
1205
|
--------
|
|
1284
1206
|
|
|
1285
|
-
<h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Using a Proxy Server:</h3>
|
|
1207
|
+
<h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" height="32" /> Using a Proxy Server:</h3>
|
|
1286
1208
|
|
|
1287
1209
|
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
1210
|
|
|
@@ -1311,7 +1233,7 @@ pytest proxy_test.py --proxy=proxy1
|
|
|
1311
1233
|
```
|
|
1312
1234
|
|
|
1313
1235
|
|
|
1314
|
-
<h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Changing the User-Agent:</h3>
|
|
1236
|
+
<h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" height="32" /> Changing the User-Agent:</h3>
|
|
1315
1237
|
|
|
1316
1238
|
🔵 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
1239
|
|
|
@@ -1320,12 +1242,12 @@ pytest user_agent_test.py --agent="Mozilla/5.0 (Nintendo 3DS; U; ; en) Version/1
|
|
|
1320
1242
|
```
|
|
1321
1243
|
|
|
1322
1244
|
|
|
1323
|
-
<h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Handling Pop-Up Alerts:</h3>
|
|
1245
|
+
<h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" height="32" /> Handling Pop-Up Alerts:</h3>
|
|
1324
1246
|
|
|
1325
1247
|
🔵 <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
1248
|
|
|
1327
1249
|
|
|
1328
|
-
<h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Building Guided Tours for Websites:</h3>
|
|
1250
|
+
<h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" height="32" /> Building Guided Tours for Websites:</h3>
|
|
1329
1251
|
|
|
1330
1252
|
🔵 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
1253
|
|
|
@@ -1335,7 +1257,7 @@ pytest user_agent_test.py --agent="Mozilla/5.0 (Nintendo 3DS; U; ; en) Version/1
|
|
|
1335
1257
|
--------
|
|
1336
1258
|
|
|
1337
1259
|
<div></div>
|
|
1338
|
-
<h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Production Environments & Integrations:</h3>
|
|
1260
|
+
<h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" height="32" /> Production Environments & Integrations:</h3>
|
|
1339
1261
|
|
|
1340
1262
|
<div></div>
|
|
1341
1263
|
<details>
|
|
@@ -1361,7 +1283,7 @@ pytest [YOUR_TEST_FILE.py] --with-db-reporting --with-s3-logging
|
|
|
1361
1283
|
|
|
1362
1284
|
|
|
1363
1285
|
<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>
|
|
1286
|
+
<h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" height="32" /> Detailed Method Specifications and Examples:</h3>
|
|
1365
1287
|
|
|
1366
1288
|
🔵 **Navigating to a web page: (and related commands)**
|
|
1367
1289
|
|
|
@@ -1714,16 +1636,16 @@ pytest --reruns=1 --reruns-delay=1
|
|
|
1714
1636
|
|
|
1715
1637
|
--------
|
|
1716
1638
|
|
|
1717
|
-
<h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" /> Wrap-Up</h3>
|
|
1639
|
+
<h3><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" height="32" /> Wrap-Up</h3>
|
|
1718
1640
|
|
|
1719
1641
|
<p>
|
|
1720
1642
|
<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>
|
|
1643
|
+
<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
1644
|
</p>
|
|
1723
1645
|
|
|
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>
|
|
1646
|
+
<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
1647
|
|
|
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>
|
|
1648
|
+
<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
1649
|
|
|
1728
1650
|
<p><div>
|
|
1729
1651
|
<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 +1656,9 @@ pytest --reruns=1 --reruns-delay=1
|
|
|
1734
1656
|
|
|
1735
1657
|
<p><div><b><a href="https://github.com/mdmintz">https://github.com/mdmintz</a></b></div></p>
|
|
1736
1658
|
|
|
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>
|
|
1659
|
+
<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
1660
|
<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>
|
|
1661
|
+
<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
1662
|
<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>
|
|
1663
|
+
<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>
|
|
1664
|
+
<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>
|