seleniumbase 4.49.2__tar.gz → 4.49.4__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.4}/PKG-INFO +92 -89
  2. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/README.md +84 -81
  3. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/requirements.txt +7 -7
  4. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/__version__.py +1 -1
  5. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/core/sb_cdp.py +63 -22
  6. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/fixtures/base_case.py +81 -2
  7. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/fixtures/js_utils.py +14 -0
  8. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/undetected/__init__.py +3 -1
  9. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/undetected/cdp_driver/browser.py +12 -2
  10. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/undetected/cdp_driver/element.py +5 -5
  11. {seleniumbase-4.49.2 → seleniumbase-4.49.4/seleniumbase.egg-info}/PKG-INFO +92 -89
  12. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase.egg-info/requires.txt +7 -7
  13. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/setup.py +7 -7
  14. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/.gitignore +0 -0
  15. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/LICENSE +0 -0
  16. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/MANIFEST.in +0 -0
  17. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/install.sh +0 -0
  18. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/pyproject.toml +0 -0
  19. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/pytest.ini +0 -0
  20. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/sbase/__init__.py +0 -0
  21. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/sbase/__main__.py +0 -0
  22. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/sbase/steps.py +0 -0
  23. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/__init__.py +0 -0
  24. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/__main__.py +0 -0
  25. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/behave/__init__.py +0 -0
  26. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/behave/behave_helper.py +0 -0
  27. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/behave/behave_sb.py +0 -0
  28. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/behave/steps.py +0 -0
  29. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/common/__init__.py +0 -0
  30. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/common/decorators.py +0 -0
  31. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/common/encryption.py +0 -0
  32. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/common/exceptions.py +0 -0
  33. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/common/obfuscate.py +0 -0
  34. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/common/unobfuscate.py +0 -0
  35. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/config/__init__.py +0 -0
  36. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/config/ad_block_list.py +0 -0
  37. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/config/proxy_list.py +0 -0
  38. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/config/settings.py +0 -0
  39. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/console_scripts/__init__.py +0 -0
  40. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/console_scripts/logo_helper.py +0 -0
  41. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/console_scripts/rich_helper.py +0 -0
  42. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/console_scripts/run.py +0 -0
  43. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
  44. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
  45. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/console_scripts/sb_commander.py +0 -0
  46. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/console_scripts/sb_install.py +0 -0
  47. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
  48. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
  49. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
  50. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
  51. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
  52. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/console_scripts/sb_objectify.py +0 -0
  53. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/console_scripts/sb_print.py +0 -0
  54. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/console_scripts/sb_recorder.py +0 -0
  55. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/core/__init__.py +0 -0
  56. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/core/application_manager.py +0 -0
  57. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/core/browser_launcher.py +0 -0
  58. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/core/capabilities_parser.py +0 -0
  59. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/core/colored_traceback.py +0 -0
  60. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/core/create_db_tables.sql +0 -0
  61. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/core/detect_b_ver.py +0 -0
  62. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/core/download_helper.py +0 -0
  63. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/core/encoded_images.py +0 -0
  64. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/core/jqc_helper.py +0 -0
  65. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/core/log_helper.py +0 -0
  66. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/core/mysql.py +0 -0
  67. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/core/nest_asyncio.py +0 -0
  68. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/core/proxy_helper.py +0 -0
  69. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/core/recorder_helper.py +0 -0
  70. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/core/report_helper.py +0 -0
  71. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/core/s3_manager.py +0 -0
  72. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/core/sb_driver.py +0 -0
  73. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/core/session_helper.py +0 -0
  74. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/core/settings_parser.py +0 -0
  75. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/core/style_sheet.py +0 -0
  76. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/core/testcase_manager.py +0 -0
  77. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/core/tour_helper.py +0 -0
  78. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/core/visual_helper.py +0 -0
  79. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/drivers/__init__.py +0 -0
  80. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/drivers/atlas_drivers/__init__.py +0 -0
  81. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/drivers/brave_drivers/__init__.py +0 -0
  82. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/drivers/cft_drivers/__init__.py +0 -0
  83. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/drivers/chromium_drivers/__init__.py +0 -0
  84. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/drivers/chs_drivers/__init__.py +0 -0
  85. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/drivers/comet_drivers/__init__.py +0 -0
  86. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/drivers/opera_drivers/__init__.py +0 -0
  87. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/extensions/__init__.py +0 -0
  88. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/extensions/ad_block.zip +0 -0
  89. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/extensions/disable_csp.zip +0 -0
  90. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/extensions/recorder.zip +0 -0
  91. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/extensions/sbase_ext.zip +0 -0
  92. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/fixtures/__init__.py +0 -0
  93. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/fixtures/constants.py +0 -0
  94. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/fixtures/css_to_xpath.py +0 -0
  95. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/fixtures/errors.py +0 -0
  96. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/fixtures/page_actions.py +0 -0
  97. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/fixtures/page_utils.py +0 -0
  98. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/fixtures/shared_utils.py +0 -0
  99. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/fixtures/unittest_helper.py +0 -0
  100. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/fixtures/words.py +0 -0
  101. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/fixtures/xpath_to_css.py +0 -0
  102. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/js_code/__init__.py +0 -0
  103. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/js_code/active_css_js.py +0 -0
  104. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/js_code/live_js.py +0 -0
  105. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/js_code/recorder_js.py +0 -0
  106. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/masterqa/__init__.py +0 -0
  107. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/masterqa/master_qa.py +0 -0
  108. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/plugins/__init__.py +0 -0
  109. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/plugins/base_plugin.py +0 -0
  110. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/plugins/basic_test_info.py +0 -0
  111. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
  112. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/plugins/driver_manager.py +0 -0
  113. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/plugins/page_source.py +0 -0
  114. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/plugins/pytest_plugin.py +0 -0
  115. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
  116. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/plugins/sb_manager.py +0 -0
  117. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/plugins/screen_shots.py +0 -0
  118. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/plugins/selenium_plugin.py +0 -0
  119. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/resources/__init__.py +0 -0
  120. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/translate/__init__.py +0 -0
  121. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/translate/chinese.py +0 -0
  122. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/translate/dutch.py +0 -0
  123. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/translate/french.py +0 -0
  124. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/translate/italian.py +0 -0
  125. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/translate/japanese.py +0 -0
  126. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/translate/korean.py +0 -0
  127. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/translate/master_dict.py +0 -0
  128. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/translate/portuguese.py +0 -0
  129. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/translate/russian.py +0 -0
  130. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/translate/spanish.py +0 -0
  131. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/translate/translator.py +0 -0
  132. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/undetected/cdp.py +0 -0
  133. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/undetected/cdp_driver/__init__.py +0 -0
  134. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
  135. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/undetected/cdp_driver/cdp_util.py +0 -0
  136. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/undetected/cdp_driver/config.py +0 -0
  137. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/undetected/cdp_driver/connection.py +0 -0
  138. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/undetected/cdp_driver/tab.py +0 -0
  139. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/undetected/dprocess.py +0 -0
  140. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/undetected/options.py +0 -0
  141. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/undetected/patcher.py +0 -0
  142. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/undetected/reactor.py +0 -0
  143. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/undetected/webelement.py +0 -0
  144. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/utilities/__init__.py +0 -0
  145. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
  146. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
  147. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/utilities/selenium_grid/font_color +0 -0
  148. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
  149. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
  150. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
  151. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
  152. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
  153. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
  154. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
  155. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
  156. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
  157. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
  158. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase.egg-info/SOURCES.txt +0 -0
  159. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase.egg-info/dependency_links.txt +0 -0
  160. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase.egg-info/entry_points.txt +0 -0
  161. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/seleniumbase.egg-info/top_level.txt +0 -0
  162. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/setup.cfg +0 -0
  163. {seleniumbase-4.49.2 → seleniumbase-4.49.4}/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.4
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
@@ -59,7 +59,7 @@ Requires-Python: >=3.9
59
59
  Description-Content-Type: text/markdown
60
60
  License-File: LICENSE
61
61
  Requires-Dist: pip>=26.0.1; python_version < "3.10"
62
- Requires-Dist: pip>=26.1.1; python_version >= "3.10"
62
+ Requires-Dist: pip>=26.1.2; python_version >= "3.10"
63
63
  Requires-Dist: packaging>=26.2
64
64
  Requires-Dist: setuptools~=70.2; python_version < "3.10"
65
65
  Requires-Dist: setuptools>=82.0.1; 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.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 where it bypasses 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></br>
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></br>
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 to <code>./latest_logs/</code>)</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><br />(If the Turnstile isn't bypassed automatically, <b><code>sb.solve_captcha()</code></b> handles it.)</p>
398
389
 
399
390
  ```python
400
391
  from seleniumbase import SB
@@ -412,11 +403,16 @@ 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
+ <p align="center">
407
+ <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">
408
+ <br><em>(Successfully bypassed bot-detection on a Cloudflare challenge page.)</em></br>
409
+ </p>
410
+
411
+ 💡 <b><code>sb.solve_captcha()</code></b> handles CAPTCHAs that aren't bypassed automatically.<br />(If no CAPTCHA is present on the current page, then nothing happens.)
416
412
 
417
- ----
413
+ --------
418
414
 
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:
415
+ <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
416
 
421
417
  ```python
422
418
  from seleniumbase import sb_cdp
@@ -431,7 +427,13 @@ sb.highlight('button:contains("Sign in")')
431
427
 
432
428
  --------
433
429
 
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>:
430
+ <h3>🧪 Comprehensive E2E Testing with <code>pytest</code>:</h3>
431
+
432
+ 📚 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).
433
+
434
+
435
+
436
+ <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
437
 
436
438
  ```python
437
439
  from seleniumbase import BaseCase
@@ -457,17 +459,17 @@ class MyTestClass(BaseCase):
457
459
 
458
460
  > `pytest test_get_swag.py`
459
461
 
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>
462
+ <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
463
 
462
464
  --------
463
465
 
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>:
466
+ <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
467
 
466
468
  ```zsh
467
469
  pytest test_coffee_cart.py --demo
468
470
  ```
469
471
 
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>
472
+ <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
473
 
472
474
  > <p>(<code translate="no">--demo</code> mode slows down tests and highlights actions)</p>
473
475
 
@@ -475,13 +477,13 @@ pytest test_coffee_cart.py --demo
475
477
 
476
478
  <a id="multiple_examples"></a>
477
479
 
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>:
480
+ <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
481
 
480
482
  ```zsh
481
483
  pytest test_demo_site.py
482
484
  ```
483
485
 
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>
486
+ <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
487
 
486
488
  > Easy to type, click, select, toggle, drag & drop, and more.
487
489
 
@@ -612,7 +614,7 @@ finally:
612
614
  <a id="python_installation"></a>
613
615
  <h2><img src="https://seleniumbase.github.io/cdn/img/python_logo.png" title="SeleniumBase" width="42" /> Set up Python & Git:</h2>
614
616
 
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>
617
+ <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
618
 
617
619
  🔵 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
620
 
@@ -704,10 +706,10 @@ pip install -e .
704
706
  <summary> ▶️ Here's sample output from a chromedriver download. (<b>click to expand</b>)</summary>
705
707
 
706
708
  ```zsh
707
- *** chromedriver to download = 141.0.7390.78 (Latest Stable)
709
+ *** chromedriver to download = 148.0.7778.178 (Latest Stable)
708
710
 
709
711
  Downloading chromedriver-mac-arm64.zip from:
710
- https://storage.googleapis.com/chrome-for-testing-public/141.0.7390.78/mac-arm64/chromedriver-mac-arm64.zip ...
712
+ https://storage.googleapis.com/chrome-for-testing-public/148.0.7778.178/mac-arm64/chromedriver-mac-arm64.zip ...
711
713
  Download Complete!
712
714
 
713
715
  Extracting ['chromedriver'] from chromedriver-mac-arm64.zip ...
@@ -717,8 +719,8 @@ The file [chromedriver] was saved to:
717
719
  ~/github/SeleniumBase/seleniumbase/drivers/
718
720
  chromedriver
719
721
 
720
- Making [chromedriver 141.0.7390.78] executable ...
721
- [chromedriver 141.0.7390.78] is now ready for use!
722
+ Making [chromedriver 148.0.7778.178] executable ...
723
+ [chromedriver 148.0.7778.178] is now ready for use!
722
724
  ```
723
725
 
724
726
  </details>
@@ -736,7 +738,7 @@ cd examples/
736
738
  pytest my_first_test.py
737
739
  ```
738
740
 
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>
741
+ <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
742
 
741
743
  <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
744
 
@@ -1729,7 +1731,8 @@ pytest --reruns=1 --reruns-delay=1
1729
1731
  <p><div><b><a href="https://github.com/mdmintz">https://github.com/mdmintz</a></b></div></p>
1730
1732
 
1731
1733
  <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
1734
  <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>
1735
+ <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
1736
  <div align="left"></div>
1735
1737
  <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>
1738
+ <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>