seleniumbase 4.49.1__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.1/seleniumbase.egg-info → seleniumbase-4.49.3}/PKG-INFO +108 -72
  2. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/README.md +98 -64
  3. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/requirements.txt +7 -7
  4. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/__version__.py +1 -1
  5. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/browser_launcher.py +9 -0
  6. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/sb_cdp.py +81 -36
  7. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/sb_driver.py +18 -0
  8. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/fixtures/base_case.py +137 -3
  9. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/fixtures/js_utils.py +14 -0
  10. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/undetected/cdp_driver/browser.py +11 -1
  11. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/undetected/cdp_driver/element.py +5 -5
  12. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/undetected/cdp_driver/tab.py +7 -0
  13. {seleniumbase-4.49.1 → seleniumbase-4.49.3/seleniumbase.egg-info}/PKG-INFO +108 -72
  14. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase.egg-info/requires.txt +13 -7
  15. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/setup.py +10 -8
  16. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/.gitignore +0 -0
  17. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/LICENSE +0 -0
  18. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/MANIFEST.in +0 -0
  19. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/install.sh +0 -0
  20. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/pyproject.toml +0 -0
  21. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/pytest.ini +0 -0
  22. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/sbase/__init__.py +0 -0
  23. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/sbase/__main__.py +0 -0
  24. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/sbase/steps.py +0 -0
  25. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/__init__.py +0 -0
  26. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/__main__.py +0 -0
  27. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/behave/__init__.py +0 -0
  28. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/behave/behave_helper.py +0 -0
  29. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/behave/behave_sb.py +0 -0
  30. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/behave/steps.py +0 -0
  31. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/common/__init__.py +0 -0
  32. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/common/decorators.py +0 -0
  33. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/common/encryption.py +0 -0
  34. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/common/exceptions.py +0 -0
  35. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/common/obfuscate.py +0 -0
  36. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/common/unobfuscate.py +0 -0
  37. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/config/__init__.py +0 -0
  38. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/config/ad_block_list.py +0 -0
  39. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/config/proxy_list.py +0 -0
  40. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/config/settings.py +0 -0
  41. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/console_scripts/__init__.py +0 -0
  42. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/console_scripts/logo_helper.py +0 -0
  43. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/console_scripts/rich_helper.py +0 -0
  44. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/console_scripts/run.py +0 -0
  45. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
  46. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
  47. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/console_scripts/sb_commander.py +0 -0
  48. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/console_scripts/sb_install.py +0 -0
  49. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
  50. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
  51. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
  52. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
  53. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
  54. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/console_scripts/sb_objectify.py +0 -0
  55. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/console_scripts/sb_print.py +0 -0
  56. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/console_scripts/sb_recorder.py +0 -0
  57. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/__init__.py +0 -0
  58. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/application_manager.py +0 -0
  59. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/capabilities_parser.py +0 -0
  60. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/colored_traceback.py +0 -0
  61. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/create_db_tables.sql +0 -0
  62. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/detect_b_ver.py +0 -0
  63. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/download_helper.py +0 -0
  64. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/encoded_images.py +0 -0
  65. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/jqc_helper.py +0 -0
  66. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/log_helper.py +0 -0
  67. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/mysql.py +0 -0
  68. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/nest_asyncio.py +0 -0
  69. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/proxy_helper.py +0 -0
  70. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/recorder_helper.py +0 -0
  71. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/report_helper.py +0 -0
  72. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/s3_manager.py +0 -0
  73. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/session_helper.py +0 -0
  74. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/settings_parser.py +0 -0
  75. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/style_sheet.py +0 -0
  76. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/testcase_manager.py +0 -0
  77. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/tour_helper.py +0 -0
  78. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/core/visual_helper.py +0 -0
  79. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/drivers/__init__.py +0 -0
  80. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/drivers/atlas_drivers/__init__.py +0 -0
  81. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/drivers/brave_drivers/__init__.py +0 -0
  82. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/drivers/cft_drivers/__init__.py +0 -0
  83. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/drivers/chromium_drivers/__init__.py +0 -0
  84. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/drivers/chs_drivers/__init__.py +0 -0
  85. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/drivers/comet_drivers/__init__.py +0 -0
  86. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/drivers/opera_drivers/__init__.py +0 -0
  87. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/extensions/__init__.py +0 -0
  88. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/extensions/ad_block.zip +0 -0
  89. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/extensions/disable_csp.zip +0 -0
  90. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/extensions/recorder.zip +0 -0
  91. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/extensions/sbase_ext.zip +0 -0
  92. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/fixtures/__init__.py +0 -0
  93. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/fixtures/constants.py +0 -0
  94. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/fixtures/css_to_xpath.py +0 -0
  95. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/fixtures/errors.py +0 -0
  96. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/fixtures/page_actions.py +0 -0
  97. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/fixtures/page_utils.py +0 -0
  98. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/fixtures/shared_utils.py +0 -0
  99. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/fixtures/unittest_helper.py +0 -0
  100. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/fixtures/words.py +0 -0
  101. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/fixtures/xpath_to_css.py +0 -0
  102. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/js_code/__init__.py +0 -0
  103. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/js_code/active_css_js.py +0 -0
  104. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/js_code/live_js.py +0 -0
  105. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/js_code/recorder_js.py +0 -0
  106. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/masterqa/__init__.py +0 -0
  107. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/masterqa/master_qa.py +0 -0
  108. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/plugins/__init__.py +0 -0
  109. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/plugins/base_plugin.py +0 -0
  110. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/plugins/basic_test_info.py +0 -0
  111. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
  112. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/plugins/driver_manager.py +0 -0
  113. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/plugins/page_source.py +0 -0
  114. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/plugins/pytest_plugin.py +0 -0
  115. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
  116. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/plugins/sb_manager.py +0 -0
  117. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/plugins/screen_shots.py +0 -0
  118. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/plugins/selenium_plugin.py +0 -0
  119. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/resources/__init__.py +0 -0
  120. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/translate/__init__.py +0 -0
  121. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/translate/chinese.py +0 -0
  122. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/translate/dutch.py +0 -0
  123. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/translate/french.py +0 -0
  124. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/translate/italian.py +0 -0
  125. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/translate/japanese.py +0 -0
  126. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/translate/korean.py +0 -0
  127. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/translate/master_dict.py +0 -0
  128. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/translate/portuguese.py +0 -0
  129. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/translate/russian.py +0 -0
  130. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/translate/spanish.py +0 -0
  131. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/translate/translator.py +0 -0
  132. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/undetected/__init__.py +0 -0
  133. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/undetected/cdp.py +0 -0
  134. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/undetected/cdp_driver/__init__.py +0 -0
  135. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
  136. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/undetected/cdp_driver/cdp_util.py +0 -0
  137. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/undetected/cdp_driver/config.py +0 -0
  138. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/undetected/cdp_driver/connection.py +0 -0
  139. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/undetected/dprocess.py +0 -0
  140. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/undetected/options.py +0 -0
  141. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/undetected/patcher.py +0 -0
  142. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/undetected/reactor.py +0 -0
  143. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/undetected/webelement.py +0 -0
  144. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/utilities/__init__.py +0 -0
  145. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
  146. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
  147. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/utilities/selenium_grid/font_color +0 -0
  148. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
  149. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
  150. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
  151. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
  152. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
  153. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
  154. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
  155. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
  156. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
  157. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
  158. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase.egg-info/SOURCES.txt +0 -0
  159. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase.egg-info/dependency_links.txt +0 -0
  160. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase.egg-info/entry_points.txt +0 -0
  161. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/seleniumbase.egg-info/top_level.txt +0 -0
  162. {seleniumbase-4.49.1 → seleniumbase-4.49.3}/setup.cfg +0 -0
  163. {seleniumbase-4.49.1 → 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.1
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
@@ -65,7 +65,7 @@ Requires-Dist: setuptools~=70.2; python_version < "3.10"
65
65
  Requires-Dist: setuptools>=82.0.1; python_version >= "3.10"
66
66
  Requires-Dist: wheel>=0.47.0
67
67
  Requires-Dist: attrs>=26.1.0
68
- Requires-Dist: certifi>=2026.4.22
68
+ Requires-Dist: certifi>=2026.5.20
69
69
  Requires-Dist: exceptiongroup>=1.3.1
70
70
  Requires-Dist: websockets~=15.0.1; python_version < "3.10"
71
71
  Requires-Dist: websockets>=16.0; python_version >= "3.10"
@@ -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.15
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"
@@ -168,6 +168,8 @@ Provides-Extra: proxy
168
168
  Requires-Dist: proxy.py==2.4.3; extra == "proxy"
169
169
  Provides-Extra: playwright
170
170
  Requires-Dist: playwright>=1.60.0; extra == "playwright"
171
+ Requires-Dist: greenlet>=3.2.5; python_version < "3.10" and extra == "playwright"
172
+ Requires-Dist: greenlet>=3.5.1; python_version >= "3.10" and extra == "playwright"
171
173
  Provides-Extra: pyautogui
172
174
  Requires-Dist: PyAutoGUI>=0.9.54; platform_system != "Linux" and extra == "pyautogui"
173
175
  Provides-Extra: selenium-stealth
@@ -201,18 +203,17 @@ Dynamic: summary
201
203
  <!-- SeleniumBase Docs -->
202
204
 
203
205
  <meta property="og:site_name" content="SeleniumBase">
204
- <meta property="og:title" content="SeleniumBase: Python Web Automation and E2E Testing" />
205
- <meta property="og:description" content="Fast, easy, and reliable Web/UI testing with Python." />
206
- <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">
207
209
  <meta property="og:image" content="https://seleniumbase.github.io/cdn/img/mac_sb_logo_5b.png" />
208
- <link rel="icon" href="https://seleniumbase.github.io/img/logo7.png" />
210
+ <link rel="icon" href="https://seleniumbase.github.io/img/logo6.png" />
209
211
 
210
- <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>
211
213
 
212
- <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>
213
- <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>
214
215
 
215
- <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>
216
217
 
217
218
  <p align="center">
218
219
  <a href="#python_installation">🚀 Start</a> |
@@ -250,80 +251,70 @@ Dynamic: summary
250
251
  <br />
251
252
  </p>
252
253
 
253
- 🐙 <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md"><b>CDP Mode</b></a> bypasses bot-detection and handles CAPTCHAs by driving the browser directly through 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 these advanced anti-detection patches to Playwright scripts.
254
-
255
- 📚 The [SeleniumBase/examples/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples) folder includes over 100 ready-to-run examples of E2E testing. Examples that start with `test_` or end with `_test.py`/`_tests.py` are specifically designed to run with `pytest`. Other examples run directly with raw `python` (those files generally start with `raw_` to avoid confusion).
256
-
257
- 🥷 Stealthy CDP Mode examples are located in [./examples/cdp_mode/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples/cdp_mode).
258
-
259
- 🎭 Stealthy Playwright examples are located in [./examples/cdp_mode/playwright/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/).
260
-
261
254
  --------
262
255
 
263
- <h3 align="left">⚙️ Stealthy architecture flowchart:</h3>
264
-
265
- <img src="https://seleniumbase.github.io/other/sb_architecture.png" width="596" alt="Stealthy architecture flowchart" />
266
-
267
- (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>)
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>
268
262
 
269
263
  --------
270
264
 
271
- <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>:
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.)
272
266
 
273
267
  ```python
274
268
  from seleniumbase import sb_cdp
275
269
 
276
- url = "https://www.browserscan.net/bot-detection"
277
- sb = sb_cdp.Chrome(url, locale="en", ad_block=True)
278
- sb.flash("Test Results", duration=3, pause=1)
279
- sb.assert_element('strong:contains("Normal")')
280
- print("Bot Not Detected")
281
- sb.flash('strong:contains("Normal")', duration=3, pause=2)
270
+ sb = sb_cdp.Chrome()
271
+ sb.open("https://browserscan.net/bot-detection")
272
+ sb.sleep(3)
273
+ sb.quit()
282
274
  ```
283
275
 
284
- <img src="https://seleniumbase.github.io/other/b_scan_results.jpg" width="628" alt="Stealthy architecture flowchart" />
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>
285
280
 
286
- 📝 <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:
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.)
287
282
 
288
283
  ```python
289
284
  from playwright.sync_api import sync_playwright
290
285
  from seleniumbase import sb_cdp
291
286
 
292
- sb = sb_cdp.Chrome(locale="en", ad_block=True)
287
+ sb = sb_cdp.Chrome()
293
288
  endpoint_url = sb.get_endpoint_url()
294
289
 
295
290
  with sync_playwright() as p:
296
291
  browser = p.chromium.connect_over_cdp(endpoint_url)
297
292
  page = browser.contexts[0].pages[0]
298
- page.goto("https://www.browserscan.net/bot-detection")
299
- page.wait_for_timeout(500)
300
- sb.flash("Test Results", duration=3, pause=1)
301
- sb.assert_element('strong:contains("Normal")')
302
- sb.flash('strong:contains("Normal")', duration=3, pause=2)
303
- ```
304
-
305
- --------
306
-
307
- 💡 You can set which Chromium browser to use via command-line options:
293
+ page.goto("https://browserscan.net/bot-detection")
308
294
 
309
- ```zsh
310
- python SCRIPT.py --use-chromium # Use the unbranded Chromium browser
311
- python SCRIPT.py --cft # Use Chrome-for-testing
312
- python SCRIPT.py --edge # Use Microsoft Edge
313
- python SCRIPT.py --brave # Use Brave browser
295
+ sb.sleep(3)
296
+ sb.quit()
314
297
  ```
315
298
 
316
- Google Chrome is the default browser if not specified. Only unbranded Chromium and Chrome-for-Testing are installed automatically if not already installed.
299
+ --------
317
300
 
318
- You can also set the browser via method args, eg: `cft=True`, `use_chromium=True`, `browser="edge"`, `browser="brave"`, etc. Eg:
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)
319
302
 
320
303
  ```python
321
- sb = sb_cdp.Chrome(url, use_chromium=True)
304
+ from seleniumbase import sb_cdp
305
+
306
+ sb = sb_cdp.Chrome(locale="en", ad_block=True)
307
+ sb.open("https://browserscan.net/bot-detection")
308
+ sb.flash("Test Results", duration=1.5, pause=0.5)
309
+ sb.assert_element('strong:contains("Normal")')
310
+ print("Bot Not Detected")
311
+ sb.flash('strong:contains("Normal")', pause=1)
312
+ sb.quit()
322
313
  ```
323
314
 
324
315
  --------
325
316
 
326
- <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>:
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>
327
318
 
328
319
  ```python
329
320
  from seleniumbase import sb_cdp
@@ -337,7 +328,43 @@ for element in elements:
337
328
 
338
329
  --------
339
330
 
340
- <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>
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
+
346
+ <h3 align="left">🌐 CLI Options for Supported Chromium Browsers</h3>
347
+
348
+ <p>💡 You can set the Chromium browser to use via command line parameters:</p>
349
+
350
+ ```zsh
351
+ python SCRIPT.py --use-chromium # Use the unbranded Chromium browser
352
+ python SCRIPT.py --cft # Use Chrome-for-testing
353
+ python SCRIPT.py --edge # Use Microsoft Edge
354
+ python SCRIPT.py --brave # Use Brave browser
355
+ ```
356
+
357
+ Google Chrome is the default browser. Only unbranded Chromium and Chrome-for-Testing get installed automatically if not already installed.
358
+
359
+ The Chromium browser can also be set via method args, eg: `cft=True`, `use_chromium=True`, `browser="edge"`, `browser="brave"`, etc. Eg:
360
+
361
+ ```python
362
+ sb = sb_cdp.Chrome(url, use_chromium=True)
363
+ ```
364
+
365
+ --------
366
+
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>
341
368
 
342
369
  ```python
343
370
  from seleniumbase import SB
@@ -358,7 +385,7 @@ with SB(uc=True, test=True) as sb:
358
385
 
359
386
  --------
360
387
 
361
- <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>
362
389
 
363
390
  ```python
364
391
  from seleniumbase import SB
@@ -376,11 +403,13 @@ with SB(uc=True, test=True, locale="en") as sb:
376
403
  sb.post_message("SeleniumBase wasn't detected", duration=4)
377
404
  ```
378
405
 
379
- <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">
407
+
408
+ (<b><code>sb.solve_captcha()</code></b> <b>handles CAPTCHAs</b> that aren't bypassed automatically.)
380
409
 
381
- ----
410
+ --------
382
411
 
383
- <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:
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>
384
413
 
385
414
  ```python
386
415
  from seleniumbase import sb_cdp
@@ -395,7 +424,13 @@ sb.highlight('button:contains("Sign in")')
395
424
 
396
425
  --------
397
426
 
398
- <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>
399
434
 
400
435
  ```python
401
436
  from seleniumbase import BaseCase
@@ -421,17 +456,17 @@ class MyTestClass(BaseCase):
421
456
 
422
457
  > `pytest test_get_swag.py`
423
458
 
424
- <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>
425
460
 
426
461
  --------
427
462
 
428
- <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>
429
464
 
430
465
  ```zsh
431
466
  pytest test_coffee_cart.py --demo
432
467
  ```
433
468
 
434
- <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>
435
470
 
436
471
  > <p>(<code translate="no">--demo</code> mode slows down tests and highlights actions)</p>
437
472
 
@@ -439,13 +474,13 @@ pytest test_coffee_cart.py --demo
439
474
 
440
475
  <a id="multiple_examples"></a>
441
476
 
442
- <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>
443
478
 
444
479
  ```zsh
445
480
  pytest test_demo_site.py
446
481
  ```
447
482
 
448
- <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>
449
484
 
450
485
  > Easy to type, click, select, toggle, drag & drop, and more.
451
486
 
@@ -576,7 +611,7 @@ finally:
576
611
  <a id="python_installation"></a>
577
612
  <h2><img src="https://seleniumbase.github.io/cdn/img/python_logo.png" title="SeleniumBase" width="42" /> Set up Python & Git:</h2>
578
613
 
579
- <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>
580
615
 
581
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.
582
617
 
@@ -700,7 +735,7 @@ cd examples/
700
735
  pytest my_first_test.py
701
736
  ```
702
737
 
703
- <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>
704
739
 
705
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>
706
741
 
@@ -1693,7 +1728,8 @@ pytest --reruns=1 --reruns-delay=1
1693
1728
  <p><div><b><a href="https://github.com/mdmintz">https://github.com/mdmintz</a></b></div></p>
1694
1729
 
1695
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>
1696
- <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>
1697
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>
1698
1733
  <div align="left"></div>
1699
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>