seleniumbase 4.49.2__tar.gz → 4.49.3__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 (163) hide show
  1. {seleniumbase-4.49.2/seleniumbase.egg-info → seleniumbase-4.49.3}/PKG-INFO +84 -84
  2. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/README.md +77 -77
  3. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/requirements.txt +6 -6
  4. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/__version__.py +1 -1
  5. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/core/sb_cdp.py +63 -22
  6. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/fixtures/base_case.py +81 -2
  7. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/fixtures/js_utils.py +14 -0
  8. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/undetected/cdp_driver/browser.py +9 -1
  9. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/undetected/cdp_driver/element.py +5 -5
  10. {seleniumbase-4.49.2 → seleniumbase-4.49.3/seleniumbase.egg-info}/PKG-INFO +84 -84
  11. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase.egg-info/requires.txt +6 -6
  12. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/setup.py +6 -6
  13. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/.gitignore +0 -0
  14. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/LICENSE +0 -0
  15. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/MANIFEST.in +0 -0
  16. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/install.sh +0 -0
  17. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/pyproject.toml +0 -0
  18. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/pytest.ini +0 -0
  19. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/sbase/__init__.py +0 -0
  20. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/sbase/__main__.py +0 -0
  21. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/sbase/steps.py +0 -0
  22. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/__init__.py +0 -0
  23. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/__main__.py +0 -0
  24. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/behave/__init__.py +0 -0
  25. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/behave/behave_helper.py +0 -0
  26. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/behave/behave_sb.py +0 -0
  27. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/behave/steps.py +0 -0
  28. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/common/__init__.py +0 -0
  29. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/common/decorators.py +0 -0
  30. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/common/encryption.py +0 -0
  31. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/common/exceptions.py +0 -0
  32. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/common/obfuscate.py +0 -0
  33. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/common/unobfuscate.py +0 -0
  34. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/config/__init__.py +0 -0
  35. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/config/ad_block_list.py +0 -0
  36. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/config/proxy_list.py +0 -0
  37. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/config/settings.py +0 -0
  38. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/console_scripts/__init__.py +0 -0
  39. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/console_scripts/logo_helper.py +0 -0
  40. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/console_scripts/rich_helper.py +0 -0
  41. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/console_scripts/run.py +0 -0
  42. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
  43. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
  44. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/console_scripts/sb_commander.py +0 -0
  45. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/console_scripts/sb_install.py +0 -0
  46. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
  47. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
  48. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
  49. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
  50. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
  51. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/console_scripts/sb_objectify.py +0 -0
  52. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/console_scripts/sb_print.py +0 -0
  53. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/console_scripts/sb_recorder.py +0 -0
  54. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/core/__init__.py +0 -0
  55. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/core/application_manager.py +0 -0
  56. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/core/browser_launcher.py +0 -0
  57. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/core/capabilities_parser.py +0 -0
  58. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/core/colored_traceback.py +0 -0
  59. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/core/create_db_tables.sql +0 -0
  60. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/core/detect_b_ver.py +0 -0
  61. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/core/download_helper.py +0 -0
  62. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/core/encoded_images.py +0 -0
  63. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/core/jqc_helper.py +0 -0
  64. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/core/log_helper.py +0 -0
  65. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/core/mysql.py +0 -0
  66. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/core/nest_asyncio.py +0 -0
  67. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/core/proxy_helper.py +0 -0
  68. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/core/recorder_helper.py +0 -0
  69. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/core/report_helper.py +0 -0
  70. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/core/s3_manager.py +0 -0
  71. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/core/sb_driver.py +0 -0
  72. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/core/session_helper.py +0 -0
  73. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/core/settings_parser.py +0 -0
  74. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/core/style_sheet.py +0 -0
  75. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/core/testcase_manager.py +0 -0
  76. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/core/tour_helper.py +0 -0
  77. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/core/visual_helper.py +0 -0
  78. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/drivers/__init__.py +0 -0
  79. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/drivers/atlas_drivers/__init__.py +0 -0
  80. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/drivers/brave_drivers/__init__.py +0 -0
  81. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/drivers/cft_drivers/__init__.py +0 -0
  82. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/drivers/chromium_drivers/__init__.py +0 -0
  83. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/drivers/chs_drivers/__init__.py +0 -0
  84. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/drivers/comet_drivers/__init__.py +0 -0
  85. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/drivers/opera_drivers/__init__.py +0 -0
  86. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/extensions/__init__.py +0 -0
  87. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/extensions/ad_block.zip +0 -0
  88. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/extensions/disable_csp.zip +0 -0
  89. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/extensions/recorder.zip +0 -0
  90. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/extensions/sbase_ext.zip +0 -0
  91. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/fixtures/__init__.py +0 -0
  92. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/fixtures/constants.py +0 -0
  93. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/fixtures/css_to_xpath.py +0 -0
  94. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/fixtures/errors.py +0 -0
  95. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/fixtures/page_actions.py +0 -0
  96. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/fixtures/page_utils.py +0 -0
  97. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/fixtures/shared_utils.py +0 -0
  98. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/fixtures/unittest_helper.py +0 -0
  99. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/fixtures/words.py +0 -0
  100. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/fixtures/xpath_to_css.py +0 -0
  101. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/js_code/__init__.py +0 -0
  102. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/js_code/active_css_js.py +0 -0
  103. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/js_code/live_js.py +0 -0
  104. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/js_code/recorder_js.py +0 -0
  105. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/masterqa/__init__.py +0 -0
  106. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/masterqa/master_qa.py +0 -0
  107. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/plugins/__init__.py +0 -0
  108. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/plugins/base_plugin.py +0 -0
  109. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/plugins/basic_test_info.py +0 -0
  110. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
  111. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/plugins/driver_manager.py +0 -0
  112. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/plugins/page_source.py +0 -0
  113. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/plugins/pytest_plugin.py +0 -0
  114. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
  115. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/plugins/sb_manager.py +0 -0
  116. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/plugins/screen_shots.py +0 -0
  117. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/plugins/selenium_plugin.py +0 -0
  118. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/resources/__init__.py +0 -0
  119. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/translate/__init__.py +0 -0
  120. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/translate/chinese.py +0 -0
  121. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/translate/dutch.py +0 -0
  122. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/translate/french.py +0 -0
  123. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/translate/italian.py +0 -0
  124. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/translate/japanese.py +0 -0
  125. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/translate/korean.py +0 -0
  126. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/translate/master_dict.py +0 -0
  127. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/translate/portuguese.py +0 -0
  128. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/translate/russian.py +0 -0
  129. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/translate/spanish.py +0 -0
  130. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/translate/translator.py +0 -0
  131. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/undetected/__init__.py +0 -0
  132. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/undetected/cdp.py +0 -0
  133. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/undetected/cdp_driver/__init__.py +0 -0
  134. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
  135. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/undetected/cdp_driver/cdp_util.py +0 -0
  136. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/undetected/cdp_driver/config.py +0 -0
  137. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/undetected/cdp_driver/connection.py +0 -0
  138. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/undetected/cdp_driver/tab.py +0 -0
  139. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/undetected/dprocess.py +0 -0
  140. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/undetected/options.py +0 -0
  141. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/undetected/patcher.py +0 -0
  142. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/undetected/reactor.py +0 -0
  143. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/undetected/webelement.py +0 -0
  144. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/utilities/__init__.py +0 -0
  145. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
  146. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
  147. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/utilities/selenium_grid/font_color +0 -0
  148. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
  149. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
  150. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
  151. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
  152. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
  153. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
  154. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
  155. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
  156. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
  157. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
  158. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase.egg-info/SOURCES.txt +0 -0
  159. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase.egg-info/dependency_links.txt +0 -0
  160. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase.egg-info/entry_points.txt +0 -0
  161. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/seleniumbase.egg-info/top_level.txt +0 -0
  162. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/setup.cfg +0 -0
  163. {seleniumbase-4.49.2 → seleniumbase-4.49.3}/virtualenv_install.sh +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: seleniumbase
3
- Version: 4.49.2
3
+ Version: 4.49.3
4
4
  Summary: A framework for stealthy Chromium automation with CDP Mode. Includes CAPTCHA-bypass, E2E Testing, and a Playwright integration.
5
5
  Home-page: https://github.com/seleniumbase/SeleniumBase
6
6
  Author: Michael Mintz
@@ -75,13 +75,13 @@ Requires-Dist: fasteners>=0.20
75
75
  Requires-Dist: mycdp>=1.3.7
76
76
  Requires-Dist: pynose>=1.5.5
77
77
  Requires-Dist: platformdirs~=4.4.0; python_version < "3.10"
78
- Requires-Dist: platformdirs>=4.9.6; python_version >= "3.10"
78
+ Requires-Dist: platformdirs>=4.10.0; python_version >= "3.10"
79
79
  Requires-Dist: typing-extensions>=4.15.0
80
80
  Requires-Dist: sbvirtualdisplay>=1.4.0
81
81
  Requires-Dist: MarkupSafe>=3.0.3
82
82
  Requires-Dist: Jinja2>=3.1.6
83
83
  Requires-Dist: six>=1.17.0
84
- Requires-Dist: parse>=1.22.0
84
+ Requires-Dist: parse>=1.22.1
85
85
  Requires-Dist: parse-type>=0.6.6
86
86
  Requires-Dist: colorama>=0.4.6
87
87
  Requires-Dist: psutil>=7.2.2
@@ -90,7 +90,7 @@ Requires-Dist: pygments>=2.20.0
90
90
  Requires-Dist: pyreadline3>=3.5.4; platform_system == "Windows"
91
91
  Requires-Dist: tabcompleter>=1.4.1
92
92
  Requires-Dist: pdbp>=1.8.2
93
- Requires-Dist: idna>=3.16
93
+ Requires-Dist: idna>=3.17
94
94
  Requires-Dist: charset-normalizer<4,>=3.4.7
95
95
  Requires-Dist: urllib3<2,>=1.26.20; python_version < "3.10"
96
96
  Requires-Dist: urllib3<3,>=2.7.0; python_version >= "3.10"
@@ -121,11 +121,11 @@ Requires-Dist: pytest-html==4.0.2
121
121
  Requires-Dist: pytest-metadata==3.1.1
122
122
  Requires-Dist: pytest-ordering==0.6
123
123
  Requires-Dist: pytest-rerunfailures==16.0.1; python_version < "3.10"
124
- Requires-Dist: pytest-rerunfailures==16.2; python_version >= "3.10"
124
+ Requires-Dist: pytest-rerunfailures==16.3; python_version >= "3.10"
125
125
  Requires-Dist: pytest-xdist==3.8.0
126
126
  Requires-Dist: parameterized==0.9.0
127
127
  Requires-Dist: behave==1.2.6
128
- Requires-Dist: soupsieve~=2.8.3
128
+ Requires-Dist: soupsieve~=2.8.4
129
129
  Requires-Dist: beautifulsoup4~=4.14.3
130
130
  Requires-Dist: pyotp==2.9.0
131
131
  Requires-Dist: python-xlib==0.33; platform_system == "Linux"
@@ -140,7 +140,7 @@ Requires-Dist: allure-python-commons>=2.13.5; extra == "allure"
140
140
  Requires-Dist: allure-behave>=2.13.5; extra == "allure"
141
141
  Provides-Extra: coverage
142
142
  Requires-Dist: coverage>=7.10.7; python_version < "3.10" and extra == "coverage"
143
- Requires-Dist: coverage>=7.14.0; python_version >= "3.10" and extra == "coverage"
143
+ Requires-Dist: coverage>=7.14.1; python_version >= "3.10" and extra == "coverage"
144
144
  Requires-Dist: pytest-cov>=7.1.0; extra == "coverage"
145
145
  Provides-Extra: flake8
146
146
  Requires-Dist: flake8==7.3.0; extra == "flake8"
@@ -203,18 +203,17 @@ Dynamic: summary
203
203
  <!-- SeleniumBase Docs -->
204
204
 
205
205
  <meta property="og:site_name" content="SeleniumBase">
206
- <meta property="og:title" content="SeleniumBase: Python Web Automation and E2E Testing" />
207
- <meta property="og:description" content="Fast, easy, and reliable Web/UI testing with Python." />
208
- <meta property="og:keywords" content="Python, pytest, selenium, webdriver, testing, automation, seleniumbase, framework, dashboard, recorder, reports, screenshots">
206
+ <meta property="og:title" content="SeleniumBase: Stealthy Chromium Automation with Python; and E2E Testing." />
207
+ <meta property="og:description" content="Stealthy Chromium Automation, including fast, easy, and reliable Web/UI testing with Python." />
208
+ <meta property="og:keywords" content="Python, pytest, selenium, webdriver, testing, automation, seleniumbase, framework, dashboard, recorder, reports, screenshots, playwright, stealth, CAPTCHA">
209
209
  <meta property="og:image" content="https://seleniumbase.github.io/cdn/img/mac_sb_logo_5b.png" />
210
- <link rel="icon" href="https://seleniumbase.github.io/img/logo7.png" />
210
+ <link rel="icon" href="https://seleniumbase.github.io/img/logo6.png" />
211
211
 
212
- <p align="center"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/nice_logo_8t.png" alt="SeleniumBase" width="424" /></a></p>
212
+ <p align="center"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/super_logo_sb3.png" alt="SeleniumBase" title="SeleniumBase" width="350" /></a></p>
213
213
 
214
- <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://discord.gg/EdhQTn3EyE" target="_blank"><img src="https://img.shields.io/discord/727927627830001734?color=7289DA&label=Discord&logo=discord&logoColor=white"/></a><br /> <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://github.com/seleniumbase/SeleniumBase/actions" target="_blank"><img src="https://github.com/seleniumbase/SeleniumBase/workflows/CI%20build/badge.svg" alt="SeleniumBase GitHub Actions" /></a> <a href="https://seleniumbase.io"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg" alt="SeleniumBase Docs" /></a></p>
215
- <p align="center"></p>
214
+ <p align="center" class="hero__title"><b>All-in-one Browser Automation Framework:<br />Web Crawling / Testing / Scraping / Stealth</b></p>
216
215
 
217
- <h3 align="center">Stealthy Chromium Automation and E2E Testing.</h3>
216
+ <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/@MichaelMintz"><img src="https://img.shields.io/youtube/channel/subscribers/UCSQElO8vQmNPuTgdd83BHdw?style=flat&logo=youtube&logoColor=white&label=YouTube%20Subscribers&color=red" alt="YouTube Subscribers"></a></p>
218
217
 
219
218
  <p align="center">
220
219
  <a href="#python_installation">🚀 Start</a> |
@@ -252,20 +251,34 @@ Dynamic: summary
252
251
  <br />
253
252
  </p>
254
253
 
255
- 🐙 <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</b> and handles CAPTCHAs with the <a href="https://chromedevtools.github.io/devtools-protocol/" translate="no">Chrome DevTools Protocol</a>. Includes <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/ReadMe.md"><b><span translate="no">Stealthy Playwright Mode</span></b></a>, which extends CDP Mode's anti-detection to <b>Playwright</b> scripts. <b><code>sb.solve_captcha()</code></b> handles CAPTCHAs that aren't bypassed automatically.
254
+ --------
256
255
 
257
- <b>Python sync version of SeleniumBase's CDP Mode: (<code>sb_cdp</code>)</b>
256
+ <ul>
257
+ <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>
258
+ <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>
259
+ <li><b><code>pip install seleniumbase</code></b> for the main framework.</li>
260
+ <li><b><code>pip install playwright</code></b> for the Playwright integration.</li>
261
+ </ul>
262
+
263
+ --------
264
+
265
+ <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 to show it bypassing bot-detection.)
258
266
 
259
267
  ```python
260
268
  from seleniumbase import sb_cdp
261
269
 
262
270
  sb = sb_cdp.Chrome()
263
- sb.open("https://demo.fingerprint.com/playground")
271
+ sb.open("https://browserscan.net/bot-detection")
264
272
  sb.sleep(3)
265
- sb.driver.quit()
273
+ sb.quit()
266
274
  ```
267
275
 
268
- <b>Playwright can use SeleniumBase's stealth browser:</b>
276
+ <p align="center">
277
+ <img src="https://seleniumbase.github.io/cdn/img/results_normal.jpg" width="578" alt="BrowserScan Test Results: Normal">
278
+ <br><em>(All BrowserScan bot-detection checks were passed successfully.)</em>
279
+ </p>
280
+
281
+ <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.)
269
282
 
270
283
  ```python
271
284
  from playwright.sync_api import sync_playwright
@@ -280,28 +293,12 @@ with sync_playwright() as p:
280
293
  page.goto("https://browserscan.net/bot-detection")
281
294
 
282
295
  sb.sleep(3)
283
- sb.driver.quit()
296
+ sb.quit()
284
297
  ```
285
298
 
286
299
  --------
287
300
 
288
- 📚 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).
289
-
290
- 🥷 Stealthy CDP Mode examples are located in [./examples/cdp_mode/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples/cdp_mode).
291
-
292
- 🎭 Stealthy Playwright examples are located in [./examples/cdp_mode/playwright/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/).
293
-
294
- --------
295
-
296
- <h3 align="left">⚙️ Stealthy architecture flowchart:</h3>
297
-
298
- <img src="https://seleniumbase.github.io/other/sb_architecture.png" width="596" alt="Stealthy architecture flowchart" />
299
-
300
- (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>)
301
-
302
- --------
303
-
304
- <p align="left">📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_browserscan.py" target="_blank">This example</a> verifies that <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md#-pure-cdp-mode-sb_cdp">Pure CDP Mode</a> is stealthy on <a href="https://www.browserscan.net/bot-detection">BrowserScan</a>:
301
+ <b>**📝** The Browserscan example can be expanded into a <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_browserscan.py">test demo</a>:</b><br />(Assertions added and a few elements highlighted with JavaScript)
305
302
 
306
303
  ```python
307
304
  from seleniumbase import sb_cdp
@@ -312,35 +309,43 @@ sb.flash("Test Results", duration=1.5, pause=0.5)
312
309
  sb.assert_element('strong:contains("Normal")')
313
310
  print("Bot Not Detected")
314
311
  sb.flash('strong:contains("Normal")', pause=1)
312
+ sb.quit()
315
313
  ```
316
314
 
317
- <img src="https://seleniumbase.github.io/other/b_scan_results.jpg" width="628" alt="Stealthy architecture flowchart" />
315
+ --------
318
316
 
319
- 📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/raw_browserscan_sync.py">This example</a> demonstrates the drop-in patch that makes Playwright stealthy:
317
+ <p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_yc_news.py" target="_blank">This example</a> scrapes Hacker News listings:</b></p>
320
318
 
321
319
  ```python
322
- from playwright.sync_api import sync_playwright
323
320
  from seleniumbase import sb_cdp
324
321
 
325
- sb = sb_cdp.Chrome(locale="en", ad_block=True)
326
- endpoint_url = sb.get_endpoint_url()
327
-
328
- with sync_playwright() as p:
329
- browser = p.chromium.connect_over_cdp(endpoint_url)
330
- page = browser.contexts[0].pages[0]
331
- page.goto("https://browserscan.net/bot-detection")
332
- page.wait_for_timeout(500)
333
- sb.flash("Test Results", duration=1.5, pause=0.5)
334
- sb.assert_element('strong:contains("Normal")')
335
- print("Bot Not Detected")
336
- sb.flash('strong:contains("Normal")', pause=1)
322
+ url = "https://news.ycombinator.com/submitted?id=seleniumbase"
323
+ sb = sb_cdp.Chrome(url)
324
+ elements = sb.find_elements("span.titleline > a")
325
+ for element in elements:
326
+ print("* " + element.text)
337
327
  ```
338
328
 
339
329
  --------
340
330
 
331
+ 🐙 Stealthy CDP Mode examples are located in [./examples/cdp_mode/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples/cdp_mode).
332
+
333
+ 🎭 Stealthy Playwright examples are located in [./examples/cdp_mode/playwright/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/).
334
+
335
+ --------
336
+
337
+ <h3 align="left">⚙️ Stealthy architecture flowchart:</h3>
338
+
339
+ <p align="center">
340
+ <img src="https://seleniumbase.github.io/other/sb_architecture.png" width="646" alt="Stealthy architecture flowchart">
341
+ <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>
342
+ </p>
343
+
344
+ --------
345
+
341
346
  <h3 align="left">🌐 CLI Options for Supported Chromium Browsers</h3>
342
347
 
343
- 💡 You can set which Chromium browser to use via command-line options:
348
+ <p>💡 You can set the Chromium browser to use via command line parameters:</p>
344
349
 
345
350
  ```zsh
346
351
  python SCRIPT.py --use-chromium # Use the unbranded Chromium browser
@@ -349,9 +354,9 @@ python SCRIPT.py --edge # Use Microsoft Edge
349
354
  python SCRIPT.py --brave # Use Brave browser
350
355
  ```
351
356
 
352
- Google Chrome is the default browser if not specified. Only unbranded Chromium and Chrome-for-Testing are installed automatically if not already installed.
357
+ Google Chrome is the default browser. Only unbranded Chromium and Chrome-for-Testing get installed automatically if not already installed.
353
358
 
354
- You can also set the browser via method args, eg: `cft=True`, `use_chromium=True`, `browser="edge"`, `browser="brave"`, etc. Eg:
359
+ The Chromium browser can also be set via method args, eg: `cft=True`, `use_chromium=True`, `browser="edge"`, `browser="brave"`, etc. Eg:
355
360
 
356
361
  ```python
357
362
  sb = sb_cdp.Chrome(url, use_chromium=True)
@@ -359,21 +364,7 @@ sb = sb_cdp.Chrome(url, use_chromium=True)
359
364
 
360
365
  --------
361
366
 
362
- <p align="left">📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_yc_news.py" target="_blank">This example</a> scrapes Hacker News listings with <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md#-pure-cdp-mode-sb_cdp">Pure CDP Mode</a>:
363
-
364
- ```python
365
- from seleniumbase import sb_cdp
366
-
367
- url = "https://news.ycombinator.com/submitted?id=seleniumbase"
368
- sb = sb_cdp.Chrome(url)
369
- elements = sb.find_elements("span.titleline > a")
370
- for element in elements:
371
- print("* " + element.text)
372
- ```
373
-
374
- --------
375
-
376
- <p align="left">📝 <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:<br />(Results are saved as PDF, HTML, and PNG files)</p>
367
+ <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)</p>
377
368
 
378
369
  ```python
379
370
  from seleniumbase import SB
@@ -394,7 +385,7 @@ with SB(uc=True, test=True) as sb:
394
385
 
395
386
  --------
396
387
 
397
- <p align="left">📝 <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:
388
+ <p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_gitlab.py" target="_blank">This example</a> bypasses Cloudflare's challenge page with UC + CDP Mode:</b></p>
398
389
 
399
390
  ```python
400
391
  from seleniumbase import SB
@@ -412,11 +403,13 @@ with SB(uc=True, test=True, locale="en") as sb:
412
403
  sb.post_message("SeleniumBase wasn't detected", duration=4)
413
404
  ```
414
405
 
415
- <img src="https://seleniumbase.github.io/other/cf_sec.jpg" alt="SeleniumBase" width="344"> <img src="https://seleniumbase.github.io/other/gitlab_bypass.png" alt="SeleniumBase" width="298">
406
+ <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">
416
407
 
417
- ----
408
+ (<b><code>sb.solve_captcha()</code></b> <b>handles CAPTCHAs</b> that aren't bypassed automatically.)
418
409
 
419
- <p align="left">📝 <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:
410
+ --------
411
+
412
+ <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
413
 
421
414
  ```python
422
415
  from seleniumbase import sb_cdp
@@ -431,7 +424,13 @@ sb.highlight('button:contains("Sign in")')
431
424
 
432
425
  --------
433
426
 
434
- <p align="left">📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_get_swag.py" target="_blank">This example</a> tests an e-commerce site with <code>pytest</code>:
427
+ <h3>🧪 Comprehensive E2E Testing with <code>pytest</code>:</h3>
428
+
429
+ 📚 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).
430
+
431
+
432
+
433
+ <p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_get_swag.py" target="_blank">This example</a> tests an e-commerce site with <code>pytest</code>:</b></p>
435
434
 
436
435
  ```python
437
436
  from seleniumbase import BaseCase
@@ -457,17 +456,17 @@ class MyTestClass(BaseCase):
457
456
 
458
457
  > `pytest test_get_swag.py`
459
458
 
460
- <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="480" /></a>
459
+ <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>
461
460
 
462
461
  --------
463
462
 
464
- <p align="left">📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_coffee_cart.py" target="_blank">This example</a> tests another e-commerce site with <code>pytest</code>:
463
+ <p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_coffee_cart.py" target="_blank">This example</a> tests another e-commerce site with <code>pytest</code>:</b></p>
465
464
 
466
465
  ```zsh
467
466
  pytest test_coffee_cart.py --demo
468
467
  ```
469
468
 
470
- <p align="left"><a href="https://seleniumbase.io/coffee/" target="_blank"><img src="https://seleniumbase.github.io/cdn/gif/coffee_cart.gif" width="480" alt="SeleniumBase Coffee Cart Test" /></a></p>
469
+ <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>
471
470
 
472
471
  > <p>(<code translate="no">--demo</code> mode slows down tests and highlights actions)</p>
473
472
 
@@ -475,13 +474,13 @@ pytest test_coffee_cart.py --demo
475
474
 
476
475
  <a id="multiple_examples"></a>
477
476
 
478
- <p align="left">📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_demo_site.py" target="_blank">This example</a> covers multiple actions with <code>pytest</code>:
477
+ <p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_demo_site.py" target="_blank">This example</a> covers multiple actions with <code>pytest</code>:</b></p>
479
478
 
480
479
  ```zsh
481
480
  pytest test_demo_site.py
482
481
  ```
483
482
 
484
- <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="480" alt="SeleniumBase Example" /></a></p>
483
+ <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>
485
484
 
486
485
  > Easy to type, click, select, toggle, drag & drop, and more.
487
486
 
@@ -612,7 +611,7 @@ finally:
612
611
  <a id="python_installation"></a>
613
612
  <h2><img src="https://seleniumbase.github.io/cdn/img/python_logo.png" title="SeleniumBase" width="42" /> Set up Python & Git:</h2>
614
613
 
615
- <a href="https://www.python.org/downloads/"><img src="https://img.shields.io/pypi/pyversions/seleniumbase.svg?color=FACE42" title="Supported Python Versions" /></a>
614
+ <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>
616
615
 
617
616
  🔵 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.
618
617
 
@@ -736,7 +735,7 @@ cd examples/
736
735
  pytest my_first_test.py
737
736
  ```
738
737
 
739
- <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="480" /></a>
738
+ <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>
740
739
 
741
740
  <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>
742
741
 
@@ -1729,7 +1728,8 @@ pytest --reruns=1 --reruns-delay=1
1729
1728
  <p><div><b><a href="https://github.com/mdmintz">https://github.com/mdmintz</a></b></div></p>
1730
1729
 
1731
1730
  <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>
1732
- <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> <a href="https://github.com/seleniumbase/SeleniumBase/stargazers"><img src="https://img.shields.io/github/stars/seleniumbase/seleniumbase.svg?color=19A57B" title="Stargazers" /></a></div>
1733
1731
  <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>
1732
+ <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>
1734
1733
  <div align="left"></div>
1735
1734
  <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>
1735
+ <div><a href="https://www.youtube.com/@MichaelMintz"><img src="https://img.shields.io/youtube/channel/subscribers/UCSQElO8vQmNPuTgdd83BHdw?style=flat&logo=youtube&logoColor=white&label=YouTube%20Subscribers&color=red" alt="YouTube Subscribers"></a></div>