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.
Files changed (164) hide show
  1. {seleniumbase-4.55.0/seleniumbase.egg-info → seleniumbase-4.55.1}/PKG-INFO +89 -167
  2. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/README.md +83 -161
  3. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/requirements.txt +3 -3
  4. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/__version__.py +1 -1
  5. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/behave/behave_sb.py +6 -0
  6. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/browser_launcher.py +11 -2
  7. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/sb_cdp.py +82 -37
  8. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/fixtures/base_case.py +1 -0
  9. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/fixtures/constants.py +3 -3
  10. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/plugins/pytest_plugin.py +11 -0
  11. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/plugins/sb_manager.py +9 -0
  12. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/plugins/selenium_plugin.py +11 -1
  13. {seleniumbase-4.55.0 → seleniumbase-4.55.1/seleniumbase.egg-info}/PKG-INFO +89 -167
  14. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase.egg-info/requires.txt +5 -5
  15. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/setup.py +5 -5
  16. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/.gitignore +0 -0
  17. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/LICENSE +0 -0
  18. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/MANIFEST.in +0 -0
  19. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/install.sh +0 -0
  20. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/mcp_servers/__init__.py +0 -0
  21. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/mcp_servers/server.py +0 -0
  22. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/pyproject.toml +0 -0
  23. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/pytest.ini +0 -0
  24. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/sbase/__init__.py +0 -0
  25. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/sbase/__main__.py +0 -0
  26. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/sbase/steps.py +0 -0
  27. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/__init__.py +0 -0
  28. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/__main__.py +0 -0
  29. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/behave/__init__.py +0 -0
  30. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/behave/behave_helper.py +0 -0
  31. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/behave/steps.py +0 -0
  32. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/common/__init__.py +0 -0
  33. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/common/decorators.py +0 -0
  34. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/common/encryption.py +0 -0
  35. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/common/exceptions.py +0 -0
  36. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/common/obfuscate.py +0 -0
  37. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/common/unobfuscate.py +0 -0
  38. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/config/__init__.py +0 -0
  39. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/config/ad_block_list.py +0 -0
  40. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/config/proxy_list.py +0 -0
  41. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/config/settings.py +0 -0
  42. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/console_scripts/__init__.py +0 -0
  43. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/console_scripts/logo_helper.py +0 -0
  44. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/console_scripts/rich_helper.py +0 -0
  45. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/console_scripts/run.py +0 -0
  46. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
  47. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
  48. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/console_scripts/sb_commander.py +0 -0
  49. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/console_scripts/sb_install.py +0 -0
  50. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
  51. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
  52. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
  53. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
  54. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
  55. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/console_scripts/sb_objectify.py +0 -0
  56. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/console_scripts/sb_print.py +0 -0
  57. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/console_scripts/sb_recorder.py +0 -0
  58. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/__init__.py +0 -0
  59. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/application_manager.py +0 -0
  60. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/capabilities_parser.py +0 -0
  61. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/colored_traceback.py +0 -0
  62. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/create_db_tables.sql +0 -0
  63. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/detect_b_ver.py +0 -0
  64. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/download_helper.py +0 -0
  65. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/encoded_images.py +0 -0
  66. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/jqc_helper.py +0 -0
  67. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/log_helper.py +0 -0
  68. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/mysql.py +0 -0
  69. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/nest_asyncio.py +0 -0
  70. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/proxy_helper.py +0 -0
  71. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/recorder_helper.py +0 -0
  72. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/report_helper.py +0 -0
  73. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/s3_manager.py +0 -0
  74. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/sb_driver.py +0 -0
  75. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/session_helper.py +0 -0
  76. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/settings_parser.py +0 -0
  77. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/style_sheet.py +0 -0
  78. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/testcase_manager.py +0 -0
  79. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/tour_helper.py +0 -0
  80. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/core/visual_helper.py +0 -0
  81. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/drivers/__init__.py +0 -0
  82. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/drivers/brave_drivers/__init__.py +0 -0
  83. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/drivers/cft_drivers/__init__.py +0 -0
  84. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/drivers/chromium_drivers/__init__.py +0 -0
  85. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/drivers/chs_drivers/__init__.py +0 -0
  86. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/drivers/comet_drivers/__init__.py +0 -0
  87. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/drivers/opera_drivers/__init__.py +0 -0
  88. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/extensions/__init__.py +0 -0
  89. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/extensions/ad_block.zip +0 -0
  90. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/extensions/disable_csp.zip +0 -0
  91. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/extensions/recorder.zip +0 -0
  92. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/extensions/sbase_ext.zip +0 -0
  93. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/fixtures/__init__.py +0 -0
  94. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/fixtures/css_to_xpath.py +0 -0
  95. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/fixtures/errors.py +0 -0
  96. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/fixtures/js_utils.py +0 -0
  97. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/fixtures/page_actions.py +0 -0
  98. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/fixtures/page_utils.py +0 -0
  99. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/fixtures/shared_utils.py +0 -0
  100. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/fixtures/unittest_helper.py +0 -0
  101. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/fixtures/words.py +0 -0
  102. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/fixtures/xpath_to_css.py +0 -0
  103. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/js_code/__init__.py +0 -0
  104. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/js_code/active_css_js.py +0 -0
  105. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/js_code/live_js.py +0 -0
  106. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/js_code/recorder_js.py +0 -0
  107. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/masterqa/__init__.py +0 -0
  108. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/masterqa/master_qa.py +0 -0
  109. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/plugins/__init__.py +0 -0
  110. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/plugins/base_plugin.py +0 -0
  111. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/plugins/basic_test_info.py +0 -0
  112. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
  113. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/plugins/driver_manager.py +0 -0
  114. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/plugins/page_source.py +0 -0
  115. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
  116. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/plugins/screen_shots.py +0 -0
  117. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/resources/__init__.py +0 -0
  118. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/translate/__init__.py +0 -0
  119. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/translate/chinese.py +0 -0
  120. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/translate/dutch.py +0 -0
  121. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/translate/french.py +0 -0
  122. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/translate/italian.py +0 -0
  123. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/translate/japanese.py +0 -0
  124. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/translate/korean.py +0 -0
  125. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/translate/master_dict.py +0 -0
  126. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/translate/portuguese.py +0 -0
  127. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/translate/russian.py +0 -0
  128. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/translate/spanish.py +0 -0
  129. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/translate/translator.py +0 -0
  130. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/undetected/__init__.py +0 -0
  131. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/undetected/cdp.py +0 -0
  132. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/undetected/cdp_driver/__init__.py +0 -0
  133. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
  134. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/undetected/cdp_driver/browser.py +0 -0
  135. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/undetected/cdp_driver/cdp_util.py +0 -0
  136. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/undetected/cdp_driver/config.py +0 -0
  137. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/undetected/cdp_driver/connection.py +0 -0
  138. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/undetected/cdp_driver/element.py +0 -0
  139. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/undetected/cdp_driver/tab.py +0 -0
  140. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/undetected/dprocess.py +0 -0
  141. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/undetected/options.py +0 -0
  142. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/undetected/patcher.py +0 -0
  143. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/undetected/reactor.py +0 -0
  144. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/undetected/webelement.py +0 -0
  145. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/utilities/__init__.py +0 -0
  146. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
  147. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
  148. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/utilities/selenium_grid/font_color +0 -0
  149. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
  150. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
  151. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
  152. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
  153. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
  154. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
  155. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
  156. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
  157. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
  158. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
  159. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase.egg-info/SOURCES.txt +0 -0
  160. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase.egg-info/dependency_links.txt +0 -0
  161. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase.egg-info/entry_points.txt +0 -0
  162. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/seleniumbase.egg-info/top_level.txt +0 -0
  163. {seleniumbase-4.55.0 → seleniumbase-4.55.1}/setup.cfg +0 -0
  164. {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.0
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.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
@@ -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.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.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
@@ -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 Web/UI testing with Python." />
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/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/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>All-in-one Browser Automation Framework:<br />Web Crawling / Testing / Scraping / Stealth</b></p>
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://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> |
@@ -223,98 +221,80 @@ Dynamic: summary
223
221
  <br />
224
222
  </p>
225
223
 
226
- --------
227
-
228
224
  <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>
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 Browserscan where it bypasses bot-detection.)
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("https://browserscan.net/bot-detection")
250
- sb.sleep(3)
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/cdn/img/results_normal.jpg" width="588" alt="BrowserScan Test Results: Normal" />
256
- <br /><em>(All BrowserScan bot-detection tests passed successfully.)</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>🎭 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.)
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
- ```python
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
- sb = sb_cdp.Chrome(guest=True)
266
- endpoint_url = sb.get_endpoint_url()
258
+ ```python
259
+ from seleniumbase import SB
267
260
 
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)
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/sannysoft_success.jpg" width="470" alt="All Sannysoft tests passed successfully" />
277
- <br /><em>(All Sannysoft bot-detection tests passed successfully.)</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/cdp_mode/raw_cdp_methods.py" target="_blank">This example</a> shows off multiple methods:</b></p>
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://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")
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("* " + element.text)
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>