seleniumbase 4.56.0__tar.gz → 4.56.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.56.0/seleniumbase.egg-info → seleniumbase-4.56.2}/PKG-INFO +76 -39
  2. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/README.md +65 -31
  3. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/requirements.txt +6 -4
  4. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/__version__.py +1 -1
  5. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/common/decorators.py +17 -1
  6. {seleniumbase-4.56.0 → seleniumbase-4.56.2/seleniumbase.egg-info}/PKG-INFO +76 -39
  7. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase.egg-info/requires.txt +17 -6
  8. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/setup.py +10 -7
  9. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/.gitignore +0 -0
  10. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/LICENSE +0 -0
  11. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/MANIFEST.in +0 -0
  12. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/install.sh +0 -0
  13. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/mcp_servers/__init__.py +0 -0
  14. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/mcp_servers/server.py +0 -0
  15. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/pyproject.toml +0 -0
  16. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/pytest.ini +0 -0
  17. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/sbase/__init__.py +0 -0
  18. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/sbase/__main__.py +0 -0
  19. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/sbase/steps.py +0 -0
  20. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/__init__.py +0 -0
  21. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/__main__.py +0 -0
  22. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/behave/__init__.py +0 -0
  23. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/behave/behave_helper.py +0 -0
  24. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/behave/behave_sb.py +0 -0
  25. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/behave/steps.py +0 -0
  26. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/common/__init__.py +0 -0
  27. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/common/encryption.py +0 -0
  28. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/common/exceptions.py +0 -0
  29. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/common/obfuscate.py +0 -0
  30. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/common/unobfuscate.py +0 -0
  31. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/config/__init__.py +0 -0
  32. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/config/ad_block_list.py +0 -0
  33. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/config/proxy_list.py +0 -0
  34. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/config/settings.py +0 -0
  35. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/console_scripts/__init__.py +0 -0
  36. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/console_scripts/logo_helper.py +0 -0
  37. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/console_scripts/rich_helper.py +0 -0
  38. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/console_scripts/run.py +0 -0
  39. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
  40. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
  41. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/console_scripts/sb_commander.py +0 -0
  42. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/console_scripts/sb_install.py +0 -0
  43. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
  44. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
  45. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
  46. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
  47. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
  48. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/console_scripts/sb_objectify.py +0 -0
  49. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/console_scripts/sb_print.py +0 -0
  50. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/console_scripts/sb_recorder.py +0 -0
  51. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/core/__init__.py +0 -0
  52. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/core/application_manager.py +0 -0
  53. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/core/browser_launcher.py +0 -0
  54. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/core/capabilities_parser.py +0 -0
  55. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/core/colored_traceback.py +0 -0
  56. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/core/create_db_tables.sql +0 -0
  57. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/core/detect_b_ver.py +0 -0
  58. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/core/download_helper.py +0 -0
  59. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/core/encoded_images.py +0 -0
  60. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/core/jqc_helper.py +0 -0
  61. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/core/log_helper.py +0 -0
  62. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/core/mysql.py +0 -0
  63. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/core/nest_asyncio.py +0 -0
  64. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/core/proxy_helper.py +0 -0
  65. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/core/recorder_helper.py +0 -0
  66. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/core/report_helper.py +0 -0
  67. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/core/s3_manager.py +0 -0
  68. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/core/sb_cdp.py +0 -0
  69. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/core/sb_driver.py +0 -0
  70. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/core/session_helper.py +0 -0
  71. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/core/settings_parser.py +0 -0
  72. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/core/style_sheet.py +0 -0
  73. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/core/testcase_manager.py +0 -0
  74. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/core/tour_helper.py +0 -0
  75. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/core/visual_helper.py +0 -0
  76. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/drivers/__init__.py +0 -0
  77. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/drivers/brave_drivers/__init__.py +0 -0
  78. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/drivers/cft_drivers/__init__.py +0 -0
  79. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/drivers/chromium_drivers/__init__.py +0 -0
  80. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/drivers/chs_drivers/__init__.py +0 -0
  81. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/drivers/comet_drivers/__init__.py +0 -0
  82. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/drivers/opera_drivers/__init__.py +0 -0
  83. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/extensions/__init__.py +0 -0
  84. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/extensions/ad_block.zip +0 -0
  85. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/extensions/disable_csp.zip +0 -0
  86. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/extensions/recorder.zip +0 -0
  87. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/extensions/sbase_ext.zip +0 -0
  88. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/fixtures/__init__.py +0 -0
  89. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/fixtures/base_case.py +0 -0
  90. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/fixtures/constants.py +0 -0
  91. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/fixtures/css_to_xpath.py +0 -0
  92. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/fixtures/errors.py +0 -0
  93. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/fixtures/js_utils.py +0 -0
  94. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/fixtures/page_actions.py +0 -0
  95. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/fixtures/page_utils.py +0 -0
  96. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/fixtures/shared_utils.py +0 -0
  97. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/fixtures/unittest_helper.py +0 -0
  98. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/fixtures/words.py +0 -0
  99. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/fixtures/xpath_to_css.py +0 -0
  100. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/js_code/__init__.py +0 -0
  101. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/js_code/active_css_js.py +0 -0
  102. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/js_code/live_js.py +0 -0
  103. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/js_code/recorder_js.py +0 -0
  104. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/masterqa/__init__.py +0 -0
  105. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/masterqa/master_qa.py +0 -0
  106. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/plugins/__init__.py +0 -0
  107. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/plugins/base_plugin.py +0 -0
  108. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/plugins/basic_test_info.py +0 -0
  109. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
  110. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/plugins/driver_manager.py +0 -0
  111. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/plugins/page_source.py +0 -0
  112. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/plugins/pytest_plugin.py +0 -0
  113. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
  114. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/plugins/sb_manager.py +0 -0
  115. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/plugins/screen_shots.py +0 -0
  116. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/plugins/selenium_plugin.py +0 -0
  117. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/resources/__init__.py +0 -0
  118. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/translate/__init__.py +0 -0
  119. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/translate/chinese.py +0 -0
  120. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/translate/dutch.py +0 -0
  121. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/translate/french.py +0 -0
  122. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/translate/italian.py +0 -0
  123. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/translate/japanese.py +0 -0
  124. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/translate/korean.py +0 -0
  125. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/translate/master_dict.py +0 -0
  126. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/translate/portuguese.py +0 -0
  127. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/translate/russian.py +0 -0
  128. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/translate/spanish.py +0 -0
  129. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/translate/translator.py +0 -0
  130. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/undetected/__init__.py +0 -0
  131. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/undetected/cdp.py +0 -0
  132. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/undetected/cdp_driver/__init__.py +0 -0
  133. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
  134. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/undetected/cdp_driver/browser.py +0 -0
  135. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/undetected/cdp_driver/cdp_util.py +0 -0
  136. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/undetected/cdp_driver/config.py +0 -0
  137. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/undetected/cdp_driver/connection.py +0 -0
  138. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/undetected/cdp_driver/element.py +0 -0
  139. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/undetected/cdp_driver/tab.py +0 -0
  140. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/undetected/dprocess.py +0 -0
  141. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/undetected/options.py +0 -0
  142. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/undetected/patcher.py +0 -0
  143. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/undetected/reactor.py +0 -0
  144. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/undetected/webelement.py +0 -0
  145. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/utilities/__init__.py +0 -0
  146. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
  147. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
  148. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/utilities/selenium_grid/font_color +0 -0
  149. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
  150. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
  151. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
  152. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
  153. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
  154. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
  155. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
  156. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
  157. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
  158. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
  159. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase.egg-info/SOURCES.txt +0 -0
  160. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase.egg-info/dependency_links.txt +0 -0
  161. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase.egg-info/entry_points.txt +0 -0
  162. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/seleniumbase.egg-info/top_level.txt +0 -0
  163. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/setup.cfg +0 -0
  164. {seleniumbase-4.56.0 → seleniumbase-4.56.2}/virtualenv_install.sh +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: seleniumbase
3
- Version: 4.56.0
3
+ Version: 4.56.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,7 +67,8 @@ 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.1.0
70
+ Requires-Dist: filelock==4.1.0; python_version == "3.10"
71
+ Requires-Dist: filelock>=4.2.0; python_version >= "3.11"
71
72
  Requires-Dist: fasteners>=0.20
72
73
  Requires-Dist: mycdp>=1.4.0
73
74
  Requires-Dist: pynose>=1.5.5
@@ -102,7 +103,8 @@ Requires-Dist: cssselect<2,>=1.6.0; python_version >= "3.11"
102
103
  Requires-Dist: sortedcontainers==2.4.0
103
104
  Requires-Dist: execnet==2.1.2
104
105
  Requires-Dist: iniconfig~=2.3.1
105
- Requires-Dist: pluggy==1.6.0
106
+ Requires-Dist: pluggy==1.6.0; python_version < "3.11"
107
+ Requires-Dist: pluggy<1.8,>=1.6.0; python_version >= "3.11"
106
108
  Requires-Dist: pytest==8.4.2; python_version < "3.11"
107
109
  Requires-Dist: pytest==9.1.1; python_version >= "3.11"
108
110
  Requires-Dist: pytest-html==4.0.2
@@ -113,8 +115,8 @@ Requires-Dist: pytest-rerunfailures==16.7; python_version >= "3.11"
113
115
  Requires-Dist: pytest-xdist==3.8.0
114
116
  Requires-Dist: parameterized==0.9.0
115
117
  Requires-Dist: behave==1.2.6
116
- Requires-Dist: soupsieve~=2.10.0; python_version == "3.10"
117
- Requires-Dist: soupsieve~=3.0.1; python_version >= "3.11"
118
+ Requires-Dist: soupsieve~=2.10.0; python_version < "3.11.5"
119
+ Requires-Dist: soupsieve~=3.0.3; python_version >= "3.11.5"
118
120
  Requires-Dist: beautifulsoup4~=4.15.0
119
121
  Requires-Dist: pyotp~=2.10.0
120
122
  Requires-Dist: python-xlib==0.33; platform_system == "Linux"
@@ -150,13 +152,14 @@ Requires-Dist: pip-system-certs>=4.0; platform_system == "Windows" and extra ==
150
152
  Provides-Extra: proxy
151
153
  Requires-Dist: proxy.py==2.4.3; extra == "proxy"
152
154
  Provides-Extra: playwright
153
- Requires-Dist: playwright>=1.63.0; extra == "playwright"
155
+ Requires-Dist: playwright>=1.64.0; extra == "playwright"
154
156
  Requires-Dist: greenlet>=3.5.6; extra == "playwright"
155
- Requires-Dist: pyee>=13.0.1; extra == "playwright"
157
+ Requires-Dist: pyee>=13.0.1; python_version < "3.12" and extra == "playwright"
158
+ Requires-Dist: pyee>=14.0.0; python_version >= "3.12" and extra == "playwright"
156
159
  Provides-Extra: pyautogui
157
160
  Requires-Dist: PyAutoGUI>=0.9.54; platform_system != "Linux" and extra == "pyautogui"
158
161
  Provides-Extra: uv
159
- Requires-Dist: uv>=0.13.0; extra == "uv"
162
+ Requires-Dist: uv>=0.13.1; extra == "uv"
160
163
  Dynamic: author
161
164
  Dynamic: author-email
162
165
  Dynamic: classifier
@@ -183,9 +186,15 @@ Dynamic: summary
183
186
 
184
187
  <h1 align="center">📊 SeleniumBase</h1>
185
188
 
186
- <p><h3 align="center">One framework for browser automation, web scraping, and testing.<br /></h3></p>
189
+ <h3 align="center">One framework for browser automation, web scraping, and testing.<br /></h3>
187
190
 
188
- <p align="center"><a href="https://pypi.python.org/pypi/seleniumbase" target="_blank"><img src="https://img.shields.io/pypi/v/seleniumbase.svg?style=flat-square&color=3399EE" alt="PyPI version" height="20" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/actions" target="_blank"><img src="https://img.shields.io/github/actions/workflow/status/seleniumbase/SeleniumBase/python-package.yml?branch=master&style=flat-square&label=CI" alt="SeleniumBase GitHub Actions" height="20" /></a> <a href="https://seleniumbase.io"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg?style=flat-square" alt="SeleniumBase Docs" 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://img.shields.io/pepy/dt/seleniumbase?style=flat-square" 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-f4c430.svg?style=flat-square" title="SeleniumBase" height="20" /></a><br /><a href="https://www.youtube.com/playlist?list=PLp9uKicxkBc5UIlGi2BuE3aWC7JyXpD3m"><img src="https://img.shields.io/badge/docs-📺-D124D8.svg?style=flat-square&logo=YouTube&logoColor=white&label=YouTube" alt="YouTube Channel" height="20" /></a> <a href="https://discord.gg/EdhQTn3EyE" target="_blank"><img src="https://img.shields.io/discord/727927627830001734?style=flat-square&color=7289DA&label=Discord&logo=discord&logoColor=white" height="20" /></a> <a href="https://www.facebook.com/SeleniumBase/" target="_blank"> <img src="https://img.shields.io/badge/Facebook-4K_followers-1877F2?style=flat-square&logo=facebook&logoColor=white" alt="SeleniumBase Facebook Followers" height="20" /></a> <a href="https://x.com/seleniumbase" target="_blank"><img src="https://img.shields.io/badge/-1K_followers-1DA1F2?style=flat-square&logo=x&logoColor=white&labelColor=000000" alt="SeleniumBase X Followers" height="20" /></a></p>
191
+ <p align="center"><b align="center">Includes stealth options for bypassing bot-detection and CAPTCHAs.<br /></b></p>
192
+
193
+ <p align="center"><a href="https://pypi.python.org/pypi/seleniumbase" target="_blank" rel="noopener"><img src="https://img.shields.io/pypi/v/seleniumbase.svg?style=flat-square&color=3399EE" alt="PyPI version" height="20" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/actions" target="_blank" rel="noopener"><img src="https://img.shields.io/github/actions/workflow/status/seleniumbase/SeleniumBase/python-package.yml?branch=master&style=flat-square&label=CI" alt="SeleniumBase GitHub Actions" height="20" /></a> <a href="https://seleniumbase.io" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg?style=flat-square" alt="SeleniumBase Docs" height="20" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/tree/master/mcp_servers" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/MCP-tool_catalog-6C5EE5?style=flat-square" height="20" /></a> <a href="https://pepy.tech/projects/seleniumbase?timeRange=threeMonths&category=version&includeCIDownloads=true&granularity=daily&viewType=line&versions=*" target="_blank" rel="noopener">
194
+ <img src="https://static.pepy.tech/badge/seleniumbase" alt="SeleniumBase PyPI downloads" height="20" />
195
+ </a> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/LICENSE" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/license-MIT-33C6B6.svg?style=flat-square" title="SeleniumBase" height="20" /></a><br /><a href="https://www.youtube.com/playlist?list=PLp9uKicxkBc5UIlGi2BuE3aWC7JyXpD3m" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/docs-📺-E144E8.svg?style=flat-square&logo=YouTube&logoColor=white&label=YouTube" alt="YouTube Channel" height="20" /></a> <a href="https://www.facebook.com/SeleniumBase/" target="_blank" rel="noopener"> <img src="https://img.shields.io/badge/Facebook-4K_followers-1877F2?style=flat-square&logo=facebook&logoColor=white" alt="SeleniumBase Facebook Followers" height="20" /></a> <a href="https://x.com/seleniumbase" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/-1K_followers-1DA1F2?style=flat-square&logo=x&logoColor=white&labelColor=555555" alt="SeleniumBase X Followers" height="20" /></a> <a href="https://discord.gg/EdhQTn3EyE" target="_blank" rel="noopener"><img src="https://img.shields.io/discord/727927627830001734?style=flat-square&color=7289DA&label=Discord&logo=discord&logoColor=white" height="20" /></a> <a href="https://github.com/seleniumbase/SeleniumBase" target="_blank" rel="noopener"><img src="https://badgen.net/github/stars/seleniumbase/SeleniumBase" title="Stars" height="20" /></a></p>
196
+
197
+ <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"><img src="https://trendshift.io/api/badge/repositories/12493" alt="seleniumbase%2SeleniumBase | Trendshift" width="250" height="55"/></a></p>
189
198
 
190
199
  <p align="center">
191
200
  <a href="#python_installation">🚀 Start</a> |
@@ -224,13 +233,41 @@ Dynamic: summary
224
233
 
225
234
  --------
226
235
 
227
- 🥷 <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/uc_mode.md"><b>UC Mode</b></a> and the newer <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md"><b>CDP Mode</b></a> makes your automation undetectable to anti-bot services. <b>CDP Mode</b> also <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/ReadMe.md"><span translate="no">adds <b>stealth</b> to stock Playwright</span></a>.
236
+ 🥷 <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/uc_mode.md"><a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md"><b>CDP Mode</b></a> makes browser automation undetectable to anti-bot services and <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/ReadMe.md">adds <b>stealth</b> to stock <span translate="no">Playwright</span></a>. Also includes code for bypassing CAPTCHAs.
228
237
 
229
238
  📚 Example scripts that start or end with "<code>test</code>" are specifically designed to be run with <code><b>pytest</b></code>. Other scripts run directly with raw <code><b>python</b></code>. (Those start with "<code>raw</code>" to avoid confusion.)
230
239
 
231
240
  --------
232
241
 
233
- <b>📝 Here's a <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_planetmc.py" target="_blank">Python script</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 performs actions such as typing, clicking, and bypassing a Cloudflare Turnstile)
242
+ 📝 Here's <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_cdp_mode.py">an example</a> with <b><code translate="no">seleniumbase</code></b> <b><code translate="no">sb_cdp</code></b> (<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md#-pure-cdp-mode-sb_cdp"><i>Pure CDP Mode</i></a>):<br /><em>(It bypasses both BrowserScan AND Sannysoft Bot-Detection)</em>
243
+
244
+ ```python
245
+ from seleniumbase import sb_cdp
246
+
247
+ sb = sb_cdp.Chrome()
248
+ sb.goto("https://browserscan.net/bot-detection")
249
+ sb.assert_element('strong:contains("Normal")')
250
+ sb.sleep(1)
251
+ sb.goto("https://bot.sannysoft.com/")
252
+ sb.assert_element(".passed")
253
+ sb.assert_element_not_visible(".failed")
254
+ sb.sleep(1)
255
+ sb.quit()
256
+ ```
257
+
258
+ <p align="center">
259
+ <img src="https://seleniumbase.github.io/cdn/img/results_normal.jpg" width="520" style="max-width: 100% !important; height: auto !important;" alt="BrowserScan Test Results: Normal" />
260
+ <br /><em>(All BrowserScan bot-detection tests passed successfully)</em>
261
+ </p>
262
+
263
+ <p align="center">
264
+ <img src="https://seleniumbase.github.io/other/sannysoft_success.jpg" width="428" style="max-width: 100% !important; height: auto !important;" alt="All Sannysoft tests passed successfully" />
265
+ <br /><em>(All Sannysoft bot-detection tests passed successfully)</em>
266
+ </p>
267
+
268
+ --------
269
+
270
+ 📝 Here's <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_planetmc.py">another example</a> with <b><code translate="no">seleniumbase</code></b> <b><code translate="no">sb_cdp</code></b> (<a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md#-pure-cdp-mode-sb_cdp"><i>Pure CDP Mode</i></a>):<br />(It performs various browser actions and bypasses a Cloudflare Turnstile)
234
271
 
235
272
  ```python
236
273
  from seleniumbase import sb_cdp
@@ -262,7 +299,7 @@ python raw_cdp_planetmc.py
262
299
 
263
300
  --------
264
301
 
265
- <p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_yc_news.py" target="_blank">This script</a> scrapes Hacker News listings:</b></p>
302
+ <p align="left">📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_yc_news.py" target="_blank" rel="noopener">This script</a> scrapes Hacker News listings:</p>
266
303
 
267
304
  ```python
268
305
  from seleniumbase import sb_cdp
@@ -284,7 +321,7 @@ python raw_cdp_yc_news.py
284
321
 
285
322
  --------
286
323
 
287
- <p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_gitlab.py" target="_blank">This script</a> bypasses Cloudflare's challenge page with UC + CDP Mode:</b></p>
324
+ <p align="left">📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_gitlab.py" target="_blank" rel="noopener">This script</a> bypasses Cloudflare's challenge page with UC + CDP Mode:</p>
288
325
 
289
326
  ```python
290
327
  from seleniumbase import SB
@@ -345,7 +382,7 @@ sb = sb_cdp.Chrome(use_chromium=True)
345
382
 
346
383
  <h3>🧪 Comprehensive E2E Testing with <code>pytest</code>:</h3>
347
384
 
348
- <p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_get_swag.py" target="_blank">This script</a> tests an e-commerce site with <code>pytest</code>:</b></p>
385
+ <p align="left">📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_get_swag.py" target="_blank" rel="noopener">This script</a> tests an e-commerce site: (Runs with <b><code>pytest</code></b>):</p>
349
386
 
350
387
  ```python
351
388
  from seleniumbase import BaseCase
@@ -379,7 +416,7 @@ pytest test_get_swag.py
379
416
 
380
417
  --------
381
418
 
382
- <p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_coffee_cart.py" target="_blank">This script</a> tests a different e-commerce site with <code>pytest</code>:</b></p>
419
+ <p align="left">📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_coffee_cart.py" target="_blank" rel="noopener">This script</a> tests a different e-commerce site with <code>pytest</code>:</p>
383
420
 
384
421
  ```python
385
422
  from seleniumbase import BaseCase
@@ -409,7 +446,7 @@ class CoffeeCartTest(BaseCase):
409
446
  pytest test_coffee_cart.py --demo
410
447
  ```
411
448
 
412
- <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>
449
+ <p align="left"><a href="https://seleniumbase.io/coffee/" target="_blank" rel="noopener"><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>
413
450
 
414
451
  > <p>(<code translate="no">--demo</code> mode slows down tests and highlights actions)</p>
415
452
 
@@ -417,13 +454,13 @@ pytest test_coffee_cart.py --demo
417
454
 
418
455
  <a id="multiple_examples"></a>
419
456
 
420
- <p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_demo_site.py" target="_blank">This script</a> covers multiple actions with <code>pytest</code>:</b></p>
457
+ <p align="left">📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_demo_site.py" target="_blank" rel="noopener">This script</a> covers multiple actions with <code>pytest</code>:</p>
421
458
 
422
459
  ```zsh
423
460
  pytest test_demo_site.py
424
461
  ```
425
462
 
426
- <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>
463
+ <p align="left"><a href="https://seleniumbase.io/demo_page" target="_blank" rel="noopener"><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>
427
464
 
428
465
  > Easy to type, click, select, toggle, drag & drop, and more.
429
466
 
@@ -454,7 +491,7 @@ pytest test_demo_site.py
454
491
  <summary> ▶️ How is <b>SeleniumBase</b> different from raw Selenium? (<b>click to expand</b>)</summary>
455
492
  <div>
456
493
 
457
- <p>💡 SeleniumBase is a Python framework for browser automation and testing. SeleniumBase uses <a href="https://www.w3.org/TR/webdriver2/#endpoints" target="_blank">Selenium/WebDriver</a> APIs and incorporates test-runners such as <code translate="no">pytest</code>, <code translate="no">pynose</code>, and <code translate="no">behave</code> to provide organized structure, test discovery, test execution, test state (<i>eg. passed, failed, or skipped</i>), and command-line options for changing default settings (<i>eg. browser selection</i>). With raw Selenium, you would need to set up your own options-parser for configuring tests from the command-line.</p>
494
+ <p>💡 SeleniumBase is a Python framework for browser automation and testing. SeleniumBase uses <a href="https://www.w3.org/TR/webdriver2/#endpoints" target="_blank" rel="noopener">Selenium/WebDriver</a> APIs and incorporates test-runners such as <code translate="no">pytest</code>, <code translate="no">pynose</code>, and <code translate="no">behave</code> to provide organized structure, test discovery, test execution, test state (<i>eg. passed, failed, or skipped</i>), and command-line options for changing default settings (<i>eg. browser selection</i>). With raw Selenium, you would need to set up your own options-parser for configuring tests from the command-line.</p>
458
495
 
459
496
  <p>💡 SeleniumBase's driver manager gives you more control over automatic driver downloads. (Use <code translate="no">--driver-version=VER</code> with your <code translate="no">pytest</code> run command to specify the version.) By default, SeleniumBase will download a driver version that matches your major browser version if not set.</p>
460
497
 
@@ -476,7 +513,7 @@ With raw Selenium, that requires more code:<br />
476
513
 
477
514
  <p>💡 SeleniumBase gives you clean error output when a test fails. With raw Selenium, error messages can get very messy.</p>
478
515
 
479
- <p>💡 SeleniumBase gives you the option to generate a dashboard and reports for tests. It also saves screenshots from failing tests to the <code translate="no">./latest_logs/</code> folder. Raw <a href="https://www.selenium.dev/documentation/webdriver/" translate="no" target="_blank">Selenium</a> does not have these options out-of-the-box.</p>
516
+ <p>💡 SeleniumBase gives you the option to generate a dashboard and reports for tests. It also saves screenshots from failing tests to the <code translate="no">./latest_logs/</code> folder. Raw <a href="https://www.selenium.dev/documentation/webdriver/" translate="no" target="_blank" rel="noopener">Selenium</a> does not have these options out-of-the-box.</p>
480
517
 
481
518
  <p>💡 SeleniumBase includes desktop GUI apps for running tests, such as <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/commander.md" translate="no">SeleniumBase Commander</a> for <code translate="no">pytest</code> and <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/behave_bdd/ReadMe.md" translate="no">SeleniumBase Behave GUI</a> for <code translate="no">behave</code>.</p>
482
519
 
@@ -554,7 +591,7 @@ finally:
554
591
  <a id="python_installation"></a>
555
592
  <h2><img src="https://seleniumbase.github.io/cdn/img/python_logo.png" title="SeleniumBase" width="42" /> Set up Python & Git:</h2>
556
593
 
557
- <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>
594
+ <a href="https://pypi.org/project/seleniumbase/" target="_blank" rel="noopener"><img src="https://img.shields.io/pypi/pyversions/seleniumbase.svg?color=22AAEE&logo=python&logoColor=FEDC54" title="Supported Python Versions" /></a>
558
595
 
559
596
  🔵 Add <b><a href="https://www.python.org/downloads/">Python</a></b> and <b><a href="https://git-scm.com/">Git</a></b> to your System PATH.
560
597
 
@@ -761,7 +798,7 @@ self.assert_no_js_errors() # Verify there are no JS errors.
761
798
  <a id="fun_facts"></a>
762
799
  <h2><img src="https://seleniumbase.github.io/img/logo7.png" title="SeleniumBase" width="32" height="32" /> Fun Facts / Learn More:</h2>
763
800
 
764
- <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>
801
+ <p>✅ SeleniumBase automatically handles common <a href="https://www.selenium.dev/documentation/webdriver/" target="_blank" rel="noopener">WebDriver</a> actions such as launching web browsers before tests, saving screenshots during failures, and closing web browsers after tests.</p>
765
802
 
766
803
  <p>✅ SeleniumBase lets you customize tests via <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/customizing_test_runs.md">command-line options</a>.</p>
767
804
 
@@ -771,7 +808,7 @@ self.assert_no_js_errors() # Verify there are no JS errors.
771
808
  self.type("input", "dogs\n") # (The "\n" presses ENTER)
772
809
  ```
773
810
 
774
- Most SeleniumBase scripts can be run with <code translate="no">pytest</code>, <code translate="no">pynose</code>, or pure <code translate="no">python</code>. Not all test runners can run all test formats. For example, tests that use the `sb` pytest fixture can only be run with `pytest`. (See <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/syntax_formats.md">Syntax Formats</a>) There's also a <a href="https://behave.readthedocs.io/en/stable/gherkin.html#features" target="_blank">Gherkin</a> test format that runs with <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/behave_bdd/ReadMe.md">behave</a>.
811
+ Most SeleniumBase scripts can be run with <code translate="no">pytest</code>, <code translate="no">pynose</code>, or pure <code translate="no">python</code>. Not all test runners can run all test formats. For example, tests that use the `sb` pytest fixture can only be run with `pytest`. (See <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/syntax_formats.md">Syntax Formats</a>) There's also a <a href="https://behave.readthedocs.io/en/stable/gherkin.html#features" target="_blank" rel="noopener">Gherkin</a> test format that runs with <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/behave_bdd/ReadMe.md">behave</a>.
775
812
 
776
813
  ```zsh
777
814
  pytest coffee_cart_tests.py --rs
@@ -817,7 +854,7 @@ pynose [FILE_NAME.py]:[CLASS_NAME].[METHOD_NAME]
817
854
  <p><b>Systems:</b> Linux/Ubuntu, macOS, and Windows.</p>
818
855
 
819
856
  ✅ SeleniumBase works on all popular CI/CD platforms:
820
- <p><a href="https://github.com/seleniumbase/SeleniumBase/blob/master/integrations/github/workflows/ReadMe.md"><img alt="GitHub Actions integration" src="https://img.shields.io/badge/GitHub_Actions-12B2C2.svg?logo=GitHubActions&logoColor=CFFFC2" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/integrations/azure/jenkins/ReadMe.md"><img alt="Jenkins integration" src="https://img.shields.io/badge/Jenkins-32B242.svg?logo=jenkins&logoColor=white" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/integrations/azure/azure_pipelines/ReadMe.md"><img alt="Azure integration" src="https://img.shields.io/badge/Azure-2288EE.svg?logo=AzurePipelines&logoColor=white" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/integrations/google_cloud/ReadMe.md"><img alt="Google Cloud integration" src="https://img.shields.io/badge/Google_Cloud-11CAE8.svg?logo=GoogleCloud&logoColor=EE0066" /></a> <a href="#utilizing_advanced_features"><img alt="AWS integration" src="https://img.shields.io/badge/AWS-4488DD.svg?logo=AmazonAWS&logoColor=FFFF44" /></a> <a href="https://en.wikipedia.org/wiki/Personal_computer" target="_blank"><img alt="Your Computer" src="https://img.shields.io/badge/💻_Your_Computer-44E6E6.svg" /></a></p>
857
+ <p><a href="https://github.com/seleniumbase/SeleniumBase/blob/master/integrations/github/workflows/ReadMe.md"><img alt="GitHub Actions integration" src="https://img.shields.io/badge/GitHub_Actions-12B2C2.svg?logo=GitHubActions&logoColor=CFFFC2" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/integrations/azure/jenkins/ReadMe.md"><img alt="Jenkins integration" src="https://img.shields.io/badge/Jenkins-32B242.svg?logo=jenkins&logoColor=white" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/integrations/azure/azure_pipelines/ReadMe.md"><img alt="Azure integration" src="https://img.shields.io/badge/Azure-2288EE.svg?logo=AzurePipelines&logoColor=white" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/integrations/google_cloud/ReadMe.md"><img alt="Google Cloud integration" src="https://img.shields.io/badge/Google_Cloud-11CAE8.svg?logo=GoogleCloud&logoColor=EE0066" /></a> <a href="#utilizing_advanced_features"><img alt="AWS integration" src="https://img.shields.io/badge/AWS-4488DD.svg?logo=AmazonAWS&logoColor=FFFF44" /></a> <a href="https://en.wikipedia.org/wiki/Personal_computer" target="_blank" rel="noopener"><img alt="Your Computer" src="https://img.shields.io/badge/💻_Your_Computer-44E6E6.svg" /></a></p>
821
858
 
822
859
  <p>✅ SeleniumBase includes an automated/manual hybrid solution called <b><a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/master_qa/ReadMe.md">MasterQA</a></b> to speed up manual testing with automation while manual testers handle validation.</p>
823
860
 
@@ -1278,13 +1315,13 @@ pytest user_agent_test.py --agent="Mozilla/5.0 (Nintendo 3DS; U; ; en) Version/1
1278
1315
  <summary> ▶️ Here are some things you can do to set up a production environment for your testing. (<b>click to expand</b>)</summary>
1279
1316
 
1280
1317
  <ul>
1281
- <li>You can set up a <a href="https://jenkins.io/" target="_blank">Jenkins</a> build server for running tests at regular intervals. For a real-world Jenkins example of headless browser automation in action, check out the <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/integrations/azure/jenkins/ReadMe.md">SeleniumBase Jenkins example on Azure</a> or the <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/integrations/google_cloud/ReadMe.md">SeleniumBase Jenkins example on Google Cloud</a>.</li>
1318
+ <li>You can set up a <a href="https://jenkins.io/" target="_blank" rel="noopener">Jenkins</a> build server for running tests at regular intervals. For a real-world Jenkins example of headless browser automation in action, check out the <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/integrations/azure/jenkins/ReadMe.md">SeleniumBase Jenkins example on Azure</a> or the <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/integrations/google_cloud/ReadMe.md">SeleniumBase Jenkins example on Google Cloud</a>.</li>
1282
1319
 
1283
- <li>You can use <a href="https://selenium.dev/documentation/en/grid/" target="_blank">the Selenium Grid</a> to scale your testing by distributing tests on several machines with parallel execution. To do this, check out the <a href="https://github.com/seleniumbase/SeleniumBase/tree/master/seleniumbase/utilities/selenium_grid">SeleniumBase selenium_grid folder</a>, which should have everything you need, including the <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/utilities/selenium_grid/ReadMe.md">Selenium Grid ReadMe</a> to help you get started.</li>
1320
+ <li>You can use <a href="https://selenium.dev/documentation/en/grid/" target="_blank" rel="noopener">the Selenium Grid</a> to scale your testing by distributing tests on several machines with parallel execution. To do this, check out the <a href="https://github.com/seleniumbase/SeleniumBase/tree/master/seleniumbase/utilities/selenium_grid">SeleniumBase selenium_grid folder</a>, which should have everything you need, including the <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/utilities/selenium_grid/ReadMe.md">Selenium Grid ReadMe</a> to help you get started.</li>
1284
1321
 
1285
1322
  <li>If you're using the <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/mysql_installation.md">SeleniumBase MySQL feature</a> to save results from tests running on a server machine, you can install <a href="https://dev.mysql.com/downloads/tools/workbench/">MySQL Workbench</a> to help you read & write from your DB more easily.</li>
1286
1323
 
1287
- <li>If you're using AWS, you can set up an <a href="https://aws.amazon.com/s3/" target="_blank">Amazon S3</a> account for saving log files and screenshots from your tests. To activate this feature, modify <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/config/settings.py">settings.py</a> with connection details in the S3 section, and add <code translate="no">--with-s3-logging</code> on the command-line when running your tests.</li>
1324
+ <li>If you're using AWS, you can set up an <a href="https://aws.amazon.com/s3/" target="_blank" rel="noopener">Amazon S3</a> account for saving log files and screenshots from your tests. To activate this feature, modify <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/config/settings.py">settings.py</a> with connection details in the S3 section, and add <code translate="no">--with-s3-logging</code> on the command-line when running your tests.</li>
1288
1325
  </ul>
1289
1326
 
1290
1327
  Here's an example of running tests with some additional features enabled:
@@ -1342,7 +1379,7 @@ self.click("div#my_id")
1342
1379
  self.type("input#id_value", "2012")
1343
1380
  ```
1344
1381
 
1345
- You can also use <code translate="no">self.add_text()</code> or the <a href="https://www.selenium.dev/documentation/webdriver/" target="_blank">WebDriver</a> <code translate="no">.send_keys()</code> command, but those won't clear the text box first if there's already text inside.
1382
+ You can also use <code translate="no">self.add_text()</code> or the <a href="https://www.selenium.dev/documentation/webdriver/" target="_blank" rel="noopener">WebDriver</a> <code translate="no">.send_keys()</code> command, but those won't clear the text box first if there's already text inside.
1346
1383
 
1347
1384
  🔵 **Getting the text from an element on a page:**
1348
1385
 
@@ -1620,9 +1657,9 @@ class DeferredAssertTests(BaseCase):
1620
1657
  <code translate="no">deferred_assert_element()</code> and <code translate="no">deferred_assert_text()</code> will save any exceptions that would be raised.
1621
1658
  To flush out all the failed deferred asserts into a single exception, make sure to call <code translate="no">self.process_deferred_asserts()</code> at the end of your test method. If your test hits multiple pages, you can call <code translate="no">self.process_deferred_asserts()</code> before navigating to a new page so that the screenshot from your log files matches the URL where the deferred asserts were made.
1622
1659
 
1623
- <h3>🔵 How to access raw <a href="https://www.selenium.dev/documentation/webdriver/" target="_blank">WebDriver</a>:</h3>
1660
+ <h3>🔵 How to access raw <a href="https://www.selenium.dev/documentation/webdriver/" target="_blank" rel="noopener">WebDriver</a>:</h3>
1624
1661
 
1625
- <p>If you need access to any commands that come with standard <a href="https://www.selenium.dev/documentation/webdriver/" target="_blank">WebDriver</a>, you can call them directly like this:</p>
1662
+ <p>If you need access to any commands that come with standard <a href="https://www.selenium.dev/documentation/webdriver/" target="_blank" rel="noopener">WebDriver</a>, you can call them directly like this:</p>
1626
1663
 
1627
1664
  ```python
1628
1665
  self.driver.delete_all_cookies()
@@ -1646,7 +1683,7 @@ pytest --reruns=1 --reruns-delay=1
1646
1683
 
1647
1684
  > "Catch bugs in QA before deploying code to Production!"
1648
1685
 
1649
- <p align="left"><a href="https://seleniumbase.io/error_page" target="_blank"><img src="https://seleniumbase.github.io/cdn/gif/error_page.gif" alt="Catch bugs in QA before deploying code to Production!" title="Catch bugs in QA before deploying code to Production!" /></a></p>
1686
+ <p align="left"><a href="https://seleniumbase.io/error_page" target="_blank" rel="noopener"><img src="https://seleniumbase.github.io/cdn/gif/error_page.gif" alt="Catch bugs in QA before deploying code to Production!" title="Catch bugs in QA before deploying code to Production!" /></a></p>
1650
1687
 
1651
1688
  --------
1652
1689
 
@@ -1659,20 +1696,20 @@ pytest --reruns=1 --reruns-delay=1
1659
1696
 
1660
1697
  <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>
1661
1698
 
1662
- <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>
1699
+ <a href="https://pypi.org/project/seleniumbase/" target="_blank" rel="noopener"><img src="https://img.shields.io/pypi/pyversions/seleniumbase.svg?color=22AAEE&logo=python&logoColor=FEDC54" title="Supported Python Versions" height="20" /></a>
1663
1700
 
1664
1701
  <p><div>
1665
- <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>
1702
+ <span><a href="https://www.youtube.com/playlist?list=PLp9uKicxkBc5UIlGi2BuE3aWC7JyXpD3m" target="_blank" rel="noopener"><img src="https://seleniumbase.github.io/cdn/img/youtube.png" title="SeleniumBase Playlist on YouTube" alt="SeleniumBase Playlist on YouTube" width="70" /></a></span>
1666
1703
  <span><a href="https://github.com/seleniumbase/SeleniumBase"><img src="https://seleniumbase.github.io/img/social/share_github.svg" title="SeleniumBase on GitHub" alt="SeleniumBase on GitHub" width="64" /></a></span>
1667
- <span><a href="https://discord.gg/EdhQTn3EyE"><img src="https://seleniumbase.github.io/other/discord_icon.png" title="SeleniumBase on Discord" alt="SeleniumBase on Discord" width="66" /></a></span>
1668
- <span><a href="https://www.facebook.com/SeleniumBase"><img src="https://seleniumbase.io/img/social/share_facebook.svg" title="SeleniumBase on Facebook" alt="SeleniumBase on Facebook" width="62" /></a></span>
1704
+ <span><a href="https://discord.gg/EdhQTn3EyE" target="_blank" rel="noopener"><img src="https://seleniumbase.github.io/other/discord_icon.png" title="SeleniumBase on Discord" alt="SeleniumBase on Discord" width="66" /></a></span>
1705
+ <span><a href="https://www.facebook.com/SeleniumBase" target="_blank" rel="noopener"><img src="https://seleniumbase.io/img/social/share_facebook.svg" title="SeleniumBase on Facebook" alt="SeleniumBase on Facebook" width="62" /></a></span>
1669
1706
  </div></p>
1670
1707
 
1671
- <p><div><b><a href="https://github.com/mdmintz">https://github.com/mdmintz</a></b></div></p>
1708
+ <p><div><b><a href="https://github.com/mdmintz" target="_blank" rel="noopener">https://github.com/mdmintz</a></b></div></p>
1672
1709
 
1673
1710
  <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>
1674
1711
  <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>
1675
1712
  <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>
1676
1713
  <div align="left"></div>
1677
- <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>
1678
- <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>
1714
+ <div><a href="https://pepy.tech/projects/seleniumbase?timeRange=threeMonths&category=version&includeCIDownloads=true&granularity=daily&viewType=line&versions=*" target="_blank" rel="noopener"><img src="https://static.pepy.tech/badge/seleniumbase" alt="SeleniumBase PyPI downloads" height="20" /></a> <a href="https://discord.gg/EdhQTn3EyE" target="_blank" rel="noopener"><img src="https://img.shields.io/discord/727927627830001734?color=7289DA&label=Discord&logo=discord&logoColor=white" height="20" /></a></div>
1715
+ <div><a href="https://www.youtube.com/@MichaelMintz" target="_blank" rel="noopener"><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>