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.
Files changed (164) hide show
  1. {seleniumbase-4.55.0/seleniumbase.egg-info → seleniumbase-4.55.2}/PKG-INFO +96 -197
  2. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/README.md +89 -190
  3. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/requirements.txt +4 -4
  4. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/__version__.py +1 -1
  5. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/behave/behave_sb.py +6 -0
  6. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/browser_launcher.py +11 -2
  7. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/sb_cdp.py +82 -37
  8. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/fixtures/base_case.py +1 -0
  9. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/fixtures/constants.py +3 -3
  10. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/plugins/pytest_plugin.py +11 -0
  11. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/plugins/sb_manager.py +9 -0
  12. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/plugins/selenium_plugin.py +11 -1
  13. {seleniumbase-4.55.0 → seleniumbase-4.55.2/seleniumbase.egg-info}/PKG-INFO +96 -197
  14. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase.egg-info/requires.txt +6 -6
  15. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/setup.py +6 -6
  16. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/.gitignore +0 -0
  17. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/LICENSE +0 -0
  18. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/MANIFEST.in +0 -0
  19. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/install.sh +0 -0
  20. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/mcp_servers/__init__.py +0 -0
  21. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/mcp_servers/server.py +0 -0
  22. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/pyproject.toml +0 -0
  23. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/pytest.ini +0 -0
  24. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/sbase/__init__.py +0 -0
  25. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/sbase/__main__.py +0 -0
  26. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/sbase/steps.py +0 -0
  27. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/__init__.py +0 -0
  28. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/__main__.py +0 -0
  29. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/behave/__init__.py +0 -0
  30. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/behave/behave_helper.py +0 -0
  31. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/behave/steps.py +0 -0
  32. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/common/__init__.py +0 -0
  33. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/common/decorators.py +0 -0
  34. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/common/encryption.py +0 -0
  35. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/common/exceptions.py +0 -0
  36. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/common/obfuscate.py +0 -0
  37. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/common/unobfuscate.py +0 -0
  38. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/config/__init__.py +0 -0
  39. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/config/ad_block_list.py +0 -0
  40. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/config/proxy_list.py +0 -0
  41. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/config/settings.py +0 -0
  42. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/console_scripts/__init__.py +0 -0
  43. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/console_scripts/logo_helper.py +0 -0
  44. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/console_scripts/rich_helper.py +0 -0
  45. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/console_scripts/run.py +0 -0
  46. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
  47. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
  48. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/console_scripts/sb_commander.py +0 -0
  49. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/console_scripts/sb_install.py +0 -0
  50. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
  51. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
  52. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
  53. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
  54. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
  55. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/console_scripts/sb_objectify.py +0 -0
  56. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/console_scripts/sb_print.py +0 -0
  57. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/console_scripts/sb_recorder.py +0 -0
  58. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/__init__.py +0 -0
  59. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/application_manager.py +0 -0
  60. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/capabilities_parser.py +0 -0
  61. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/colored_traceback.py +0 -0
  62. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/create_db_tables.sql +0 -0
  63. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/detect_b_ver.py +0 -0
  64. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/download_helper.py +0 -0
  65. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/encoded_images.py +0 -0
  66. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/jqc_helper.py +0 -0
  67. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/log_helper.py +0 -0
  68. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/mysql.py +0 -0
  69. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/nest_asyncio.py +0 -0
  70. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/proxy_helper.py +0 -0
  71. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/recorder_helper.py +0 -0
  72. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/report_helper.py +0 -0
  73. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/s3_manager.py +0 -0
  74. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/sb_driver.py +0 -0
  75. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/session_helper.py +0 -0
  76. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/settings_parser.py +0 -0
  77. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/style_sheet.py +0 -0
  78. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/testcase_manager.py +0 -0
  79. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/tour_helper.py +0 -0
  80. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/core/visual_helper.py +0 -0
  81. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/drivers/__init__.py +0 -0
  82. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/drivers/brave_drivers/__init__.py +0 -0
  83. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/drivers/cft_drivers/__init__.py +0 -0
  84. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/drivers/chromium_drivers/__init__.py +0 -0
  85. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/drivers/chs_drivers/__init__.py +0 -0
  86. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/drivers/comet_drivers/__init__.py +0 -0
  87. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/drivers/opera_drivers/__init__.py +0 -0
  88. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/extensions/__init__.py +0 -0
  89. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/extensions/ad_block.zip +0 -0
  90. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/extensions/disable_csp.zip +0 -0
  91. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/extensions/recorder.zip +0 -0
  92. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/extensions/sbase_ext.zip +0 -0
  93. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/fixtures/__init__.py +0 -0
  94. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/fixtures/css_to_xpath.py +0 -0
  95. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/fixtures/errors.py +0 -0
  96. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/fixtures/js_utils.py +0 -0
  97. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/fixtures/page_actions.py +0 -0
  98. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/fixtures/page_utils.py +0 -0
  99. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/fixtures/shared_utils.py +0 -0
  100. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/fixtures/unittest_helper.py +0 -0
  101. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/fixtures/words.py +0 -0
  102. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/fixtures/xpath_to_css.py +0 -0
  103. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/js_code/__init__.py +0 -0
  104. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/js_code/active_css_js.py +0 -0
  105. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/js_code/live_js.py +0 -0
  106. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/js_code/recorder_js.py +0 -0
  107. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/masterqa/__init__.py +0 -0
  108. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/masterqa/master_qa.py +0 -0
  109. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/plugins/__init__.py +0 -0
  110. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/plugins/base_plugin.py +0 -0
  111. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/plugins/basic_test_info.py +0 -0
  112. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
  113. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/plugins/driver_manager.py +0 -0
  114. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/plugins/page_source.py +0 -0
  115. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
  116. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/plugins/screen_shots.py +0 -0
  117. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/resources/__init__.py +0 -0
  118. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/translate/__init__.py +0 -0
  119. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/translate/chinese.py +0 -0
  120. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/translate/dutch.py +0 -0
  121. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/translate/french.py +0 -0
  122. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/translate/italian.py +0 -0
  123. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/translate/japanese.py +0 -0
  124. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/translate/korean.py +0 -0
  125. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/translate/master_dict.py +0 -0
  126. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/translate/portuguese.py +0 -0
  127. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/translate/russian.py +0 -0
  128. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/translate/spanish.py +0 -0
  129. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/translate/translator.py +0 -0
  130. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/undetected/__init__.py +0 -0
  131. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/undetected/cdp.py +0 -0
  132. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/undetected/cdp_driver/__init__.py +0 -0
  133. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
  134. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/undetected/cdp_driver/browser.py +0 -0
  135. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/undetected/cdp_driver/cdp_util.py +0 -0
  136. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/undetected/cdp_driver/config.py +0 -0
  137. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/undetected/cdp_driver/connection.py +0 -0
  138. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/undetected/cdp_driver/element.py +0 -0
  139. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/undetected/cdp_driver/tab.py +0 -0
  140. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/undetected/dprocess.py +0 -0
  141. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/undetected/options.py +0 -0
  142. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/undetected/patcher.py +0 -0
  143. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/undetected/reactor.py +0 -0
  144. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/undetected/webelement.py +0 -0
  145. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/utilities/__init__.py +0 -0
  146. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
  147. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
  148. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/utilities/selenium_grid/font_color +0 -0
  149. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
  150. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
  151. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
  152. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
  153. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
  154. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
  155. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
  156. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
  157. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
  158. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
  159. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase.egg-info/SOURCES.txt +0 -0
  160. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase.egg-info/dependency_links.txt +0 -0
  161. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase.egg-info/entry_points.txt +0 -0
  162. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/seleniumbase.egg-info/top_level.txt +0 -0
  163. {seleniumbase-4.55.0 → seleniumbase-4.55.2}/setup.cfg +0 -0
  164. {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.0
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.8
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.3
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==2.3.0
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.1; extra == "flake8"
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.2.0; extra == "mcp"
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.21; extra == "uv"
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: Stealthy Chromium Automation with Python; and E2E Testing." />
177
- <meta property="og:description" content="Stealthy Chromium Automation, including fast, easy, and reliable Web/UI testing with Python." />
178
- <meta property="og:keywords" content="Python, pytest, selenium, webdriver, testing, automation, seleniumbase, framework, dashboard, recorder, reports, screenshots, playwright, stealth, CAPTCHA">
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/logo6.png" />
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/sb_logo_gemini_6c.jpg" alt="SeleniumBase" title="SeleniumBase" width="634" /></a></p>
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://trendshift.io/repositories/12493?utm_source=repository-badge&amp;utm_medium=badge&amp;utm_campaign=badge-repository-12493" target="_blank" rel="noopener noreferrer"><img src="https://trendshift.io/api/badge/repositories/12493" alt="seleniumbase%2FSeleniumBase | Trendshift" width="250" height="55"/></a></p>
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
- <ul>
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
- ```python
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
- sb = sb_cdp.Chrome(guest=True)
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
- with sync_playwright() as p:
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
- <p align="center">
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
- <p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_methods.py" target="_blank">This example</a> shows off multiple methods:</b></p>
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://seleniumbase.io/demo_page")
289
- sb.type("input", "Quickly type text!")
290
- sb.press_keys("textarea", "Slowly type text!")
291
- sb.click("#myButton")
292
- sb.set_value("input#mySlider", "100")
293
- sb.click_visible_elements("input.checkBoxClassB")
294
- sb.select_option_by_text("#mySelect", "Set to 75%")
295
- sb.hover_and_click("#myDropdown", "#dropOption2")
296
- sb.click("#checkBox1")
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"><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
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 = 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
- ```
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
- 🐙 Stealthy CDP Mode examples are located in [./examples/cdp_mode/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples/cdp_mode).
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
- 🎭 Stealthy Playwright examples are located in [./examples/cdp_mode/playwright/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/).
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
- <h3 align="left">⚙️ Stealthy architecture flowchart:</h3>
300
+ > `python raw_gitlab.py`
342
301
 
343
- <p align="center">
344
- <img src="https://seleniumbase.github.io/other/sb_architecture.png" width="646" alt="Stealthy architecture flowchart" />
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 the Chromium browser to use via command line parameters:</p>
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
- <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
329
+ <h3 align="left">⚙️ Stealthy architecture flowchart:</h3>
423
330
 
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
- ```
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
- (For more examples, see the <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/ReadMe.md">SeleniumBase/examples/</a> folder.)
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>