seleniumbase 4.57.0__tar.gz → 4.57.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (164) hide show
  1. {seleniumbase-4.57.0/seleniumbase.egg-info → seleniumbase-4.57.1}/PKG-INFO +33 -58
  2. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/README.md +29 -54
  3. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/requirements.txt +3 -3
  4. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/__version__.py +1 -1
  5. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/console_scripts/run.py +3 -3
  6. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/console_scripts/sb_install.py +30 -15
  7. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/fixtures/shared_utils.py +3 -5
  8. {seleniumbase-4.57.0 → seleniumbase-4.57.1/seleniumbase.egg-info}/PKG-INFO +33 -58
  9. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase.egg-info/requires.txt +3 -3
  10. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/setup.py +3 -3
  11. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/.gitignore +0 -0
  12. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/LICENSE +0 -0
  13. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/MANIFEST.in +0 -0
  14. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/install.sh +0 -0
  15. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/mcp_servers/__init__.py +0 -0
  16. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/mcp_servers/server.py +0 -0
  17. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/pyproject.toml +0 -0
  18. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/pytest.ini +0 -0
  19. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/sbase/__init__.py +0 -0
  20. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/sbase/__main__.py +0 -0
  21. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/sbase/steps.py +0 -0
  22. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/__init__.py +0 -0
  23. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/__main__.py +0 -0
  24. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/behave/__init__.py +0 -0
  25. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/behave/behave_helper.py +0 -0
  26. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/behave/behave_sb.py +0 -0
  27. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/behave/steps.py +0 -0
  28. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/common/__init__.py +0 -0
  29. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/common/decorators.py +0 -0
  30. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/common/encryption.py +0 -0
  31. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/common/exceptions.py +0 -0
  32. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/common/obfuscate.py +0 -0
  33. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/common/unobfuscate.py +0 -0
  34. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/config/__init__.py +0 -0
  35. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/config/ad_block_list.py +0 -0
  36. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/config/proxy_list.py +0 -0
  37. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/config/settings.py +0 -0
  38. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/console_scripts/__init__.py +0 -0
  39. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/console_scripts/logo_helper.py +0 -0
  40. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/console_scripts/rich_helper.py +0 -0
  41. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
  42. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
  43. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/console_scripts/sb_commander.py +0 -0
  44. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
  45. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
  46. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
  47. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
  48. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
  49. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/console_scripts/sb_objectify.py +0 -0
  50. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/console_scripts/sb_print.py +0 -0
  51. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/console_scripts/sb_recorder.py +0 -0
  52. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/core/__init__.py +0 -0
  53. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/core/application_manager.py +0 -0
  54. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/core/browser_launcher.py +0 -0
  55. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/core/capabilities_parser.py +0 -0
  56. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/core/colored_traceback.py +0 -0
  57. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/core/create_db_tables.sql +0 -0
  58. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/core/detect_b_ver.py +0 -0
  59. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/core/download_helper.py +0 -0
  60. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/core/encoded_images.py +0 -0
  61. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/core/jqc_helper.py +0 -0
  62. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/core/log_helper.py +0 -0
  63. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/core/mysql.py +0 -0
  64. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/core/nest_asyncio.py +0 -0
  65. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/core/proxy_helper.py +0 -0
  66. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/core/recorder_helper.py +0 -0
  67. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/core/report_helper.py +0 -0
  68. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/core/s3_manager.py +0 -0
  69. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/core/sb_cdp.py +0 -0
  70. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/core/sb_driver.py +0 -0
  71. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/core/session_helper.py +0 -0
  72. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/core/settings_parser.py +0 -0
  73. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/core/style_sheet.py +0 -0
  74. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/core/testcase_manager.py +0 -0
  75. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/core/tour_helper.py +0 -0
  76. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/core/visual_helper.py +0 -0
  77. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/drivers/__init__.py +0 -0
  78. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/drivers/brave_drivers/__init__.py +0 -0
  79. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/drivers/cft_drivers/__init__.py +0 -0
  80. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/drivers/chromium_drivers/__init__.py +0 -0
  81. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/drivers/chs_drivers/__init__.py +0 -0
  82. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/drivers/comet_drivers/__init__.py +0 -0
  83. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/drivers/opera_drivers/__init__.py +0 -0
  84. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/extensions/__init__.py +0 -0
  85. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/extensions/ad_block.zip +0 -0
  86. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/extensions/disable_csp.zip +0 -0
  87. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/extensions/recorder.zip +0 -0
  88. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/extensions/sbase_ext.zip +0 -0
  89. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/fixtures/__init__.py +0 -0
  90. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/fixtures/base_case.py +0 -0
  91. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/fixtures/constants.py +0 -0
  92. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/fixtures/css_to_xpath.py +0 -0
  93. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/fixtures/errors.py +0 -0
  94. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/fixtures/js_utils.py +0 -0
  95. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/fixtures/page_actions.py +0 -0
  96. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/fixtures/page_utils.py +0 -0
  97. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/fixtures/unittest_helper.py +0 -0
  98. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/fixtures/words.py +0 -0
  99. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/fixtures/xpath_to_css.py +0 -0
  100. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/js_code/__init__.py +0 -0
  101. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/js_code/active_css_js.py +0 -0
  102. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/js_code/live_js.py +0 -0
  103. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/js_code/recorder_js.py +0 -0
  104. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/masterqa/__init__.py +0 -0
  105. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/masterqa/master_qa.py +0 -0
  106. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/plugins/__init__.py +0 -0
  107. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/plugins/base_plugin.py +0 -0
  108. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/plugins/basic_test_info.py +0 -0
  109. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
  110. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/plugins/driver_manager.py +0 -0
  111. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/plugins/page_source.py +0 -0
  112. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/plugins/pytest_plugin.py +0 -0
  113. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
  114. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/plugins/sb_manager.py +0 -0
  115. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/plugins/screen_shots.py +0 -0
  116. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/plugins/selenium_plugin.py +0 -0
  117. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/resources/__init__.py +0 -0
  118. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/translate/__init__.py +0 -0
  119. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/translate/chinese.py +0 -0
  120. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/translate/dutch.py +0 -0
  121. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/translate/french.py +0 -0
  122. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/translate/italian.py +0 -0
  123. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/translate/japanese.py +0 -0
  124. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/translate/korean.py +0 -0
  125. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/translate/master_dict.py +0 -0
  126. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/translate/portuguese.py +0 -0
  127. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/translate/russian.py +0 -0
  128. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/translate/spanish.py +0 -0
  129. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/translate/translator.py +0 -0
  130. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/undetected/__init__.py +0 -0
  131. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/undetected/cdp.py +0 -0
  132. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/undetected/cdp_driver/__init__.py +0 -0
  133. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
  134. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/undetected/cdp_driver/browser.py +0 -0
  135. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/undetected/cdp_driver/cdp_util.py +0 -0
  136. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/undetected/cdp_driver/config.py +0 -0
  137. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/undetected/cdp_driver/connection.py +0 -0
  138. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/undetected/cdp_driver/element.py +0 -0
  139. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/undetected/cdp_driver/tab.py +0 -0
  140. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/undetected/dprocess.py +0 -0
  141. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/undetected/options.py +0 -0
  142. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/undetected/patcher.py +0 -0
  143. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/undetected/reactor.py +0 -0
  144. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/undetected/webelement.py +0 -0
  145. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/utilities/__init__.py +0 -0
  146. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
  147. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
  148. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/utilities/selenium_grid/font_color +0 -0
  149. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
  150. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
  151. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
  152. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
  153. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
  154. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
  155. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
  156. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
  157. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
  158. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
  159. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase.egg-info/SOURCES.txt +0 -0
  160. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase.egg-info/dependency_links.txt +0 -0
  161. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase.egg-info/entry_points.txt +0 -0
  162. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/seleniumbase.egg-info/top_level.txt +0 -0
  163. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/setup.cfg +0 -0
  164. {seleniumbase-4.57.0 → seleniumbase-4.57.1}/virtualenv_install.sh +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: seleniumbase
3
- Version: 4.57.0
3
+ Version: 4.57.1
4
4
  Summary: SeleniumBase is a framework for web crawling, scraping, and testing. Supports pytest. CDP Mode adds stealth. Includes many tools.
5
5
  Home-page: https://github.com/seleniumbase/SeleniumBase
6
6
  Author: Michael Mintz
@@ -68,7 +68,7 @@ Requires-Dist: exceptiongroup>=1.3.1
68
68
  Requires-Dist: websockets~=16.1.1; python_version == "3.10"
69
69
  Requires-Dist: websockets>=17.4; python_version >= "3.11"
70
70
  Requires-Dist: filelock==4.1.0; python_version == "3.10"
71
- Requires-Dist: filelock>=4.2.7; python_version >= "3.11"
71
+ Requires-Dist: filelock>=4.2.9; python_version >= "3.11"
72
72
  Requires-Dist: fasteners>=0.20
73
73
  Requires-Dist: mycdp>=1.4.0
74
74
  Requires-Dist: pynose>=1.5.5
@@ -116,7 +116,7 @@ Requires-Dist: pytest-xdist==3.8.0
116
116
  Requires-Dist: parameterized==0.9.0
117
117
  Requires-Dist: behave==1.2.6
118
118
  Requires-Dist: soupsieve~=2.10.0; python_version < "3.11.5"
119
- Requires-Dist: soupsieve~=3.0.4; python_version >= "3.11.5"
119
+ Requires-Dist: soupsieve~=4.0.1; python_version >= "3.11.5"
120
120
  Requires-Dist: beautifulsoup4~=4.15.0
121
121
  Requires-Dist: pyotp~=2.10.0
122
122
  Requires-Dist: python-xlib==0.33; platform_system == "Linux"
@@ -130,7 +130,7 @@ Requires-Dist: allure-python-commons>=2.16.0; extra == "allure"
130
130
  Requires-Dist: allure-behave>=2.16.0; extra == "allure"
131
131
  Provides-Extra: coverage
132
132
  Requires-Dist: coverage>=7.16.2; python_version == "3.10" and extra == "coverage"
133
- Requires-Dist: coverage>=7.17.0; python_version >= "3.11" and extra == "coverage"
133
+ Requires-Dist: coverage>=7.17.2; python_version >= "3.11" and extra == "coverage"
134
134
  Requires-Dist: pytest-cov>=7.1.0; extra == "coverage"
135
135
  Provides-Extra: flake8
136
136
  Requires-Dist: flake8==7.4.1; python_version == "3.10" and extra == "flake8"
@@ -189,37 +189,31 @@ Dynamic: summary
189
189
  <meta property="og:image" content="https://seleniumbase.github.io/cdn/img/mac_sb_logo_5b.png" />
190
190
  <link rel="icon" href="https://seleniumbase.github.io/img/logo7.png" />
191
191
 
192
- <h1 align="center">📊 SeleniumBase</h1>
192
+ <h1 align="center"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/super_logo_sb3.png" title="SeleniumBase" width="520" style="max-width: 100% !important; height: auto !important;" /></a></h1>
193
193
 
194
- <h3 align="center">APIs for Web Scraping, Browser Automation, and E2E Testing.<br /></h3>
195
-
196
- <p align="center"><b align="center">Includes stealth options for bypassing bot-detection and CAPTCHAs.<br /></b></p>
194
+ <h3 align="center">Browser Automation, Web Scraping, and End-to-End Testing.<br /></h3>
197
195
 
198
196
  <p align="center">
199
197
  <a href="https://pypi.python.org/pypi/seleniumbase" target="_blank" rel="noopener"><img src="https://img.shields.io/pypi/v/seleniumbase.svg?style=flat-square&color=3399EE" alt="PyPI version" height="20" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/actions" target="_blank" rel="noopener"><img src="https://img.shields.io/github/actions/workflow/status/seleniumbase/SeleniumBase/python-package.yml?branch=master&style=flat-square&label=CI" alt="SeleniumBase GitHub Actions" height="20" /></a> <a href="https://seleniumbase.io" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg?style=flat-square" alt="SeleniumBase Docs" height="20" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/LICENSE" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/license-MIT-33A6C6.svg?style=flat-square" title="SeleniumBase" height="20" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/tree/master/mcp_servers" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/MCP-tool_info-7C6EE5?style=flat-square" height="20" /></a> <a href="https://pepy.tech/projects/seleniumbase?timeRange=threeMonths&category=version&includeCIDownloads=true&granularity=daily&viewType=line&versions=*" target="_blank" rel="noopener"><img src="https://static.pepy.tech/badge/seleniumbase" alt="SeleniumBase PyPI downloads" height="20" /></a><br />
200
198
  <a href="https://www.youtube.com/playlist?list=PLp9uKicxkBc5UIlGi2BuE3aWC7JyXpD3m" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/docs-📺-D844E8.svg?style=flat-square&logo=YouTube&logoColor=white&label=YouTube" alt="YouTube Channel" height="20" /></a> <a href="https://www.facebook.com/SeleniumBase/" target="_blank" rel="noopener"> <img src="https://img.shields.io/badge/Facebook-4K_followers-1877F2?style=flat-square&logo=facebook&logoColor=white" alt="SeleniumBase Facebook Followers" height="20" /></a> <a href="https://x.com/seleniumbase" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/-1K_followers-1DA1F2?style=flat-square&logo=x&logoColor=white&labelColor=555555" alt="SeleniumBase X Followers" height="20" /></a> <a href="https://discord.gg/EdhQTn3EyE" target="_blank" rel="noopener"><img src="https://img.shields.io/discord/727927627830001734?style=flat-square&color=7289DA&label=Discord&logo=discord&logoColor=white" height="20" /></a> <a href="https://github.com/seleniumbase/SeleniumBase" target="_blank" rel="noopener"><img src="https://badgen.net/github/stars/seleniumbase/SeleniumBase" title="Stars" height="20" /></a>
201
199
  </p>
202
200
 
203
- <p align="center">
204
- <a href="https://trendshift.io/repositories/12493?utm_source=repository-badge&amp;utm_medium=badge&amp;utm_campaign=badge-repository-12493" target="_blank" rel="noopener"><img src="https://trendshift.io/api/badge/repositories/12493" alt="seleniumbase%2SeleniumBase | Trendshift" width="250" height="55"/></a>
205
- </p>
206
-
207
201
  <p align="center">
208
202
  <a href="#python_installation">🚀 Start</a> |
209
203
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/features_list.md">🏰 Features</a> |
210
204
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/customizing_test_runs.md">🎛️ Options</a> |
211
205
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/ReadMe.md">📚 Examples</a> |
212
206
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/console_scripts/ReadMe.md">💻 Scripts</a> |
213
- <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/locale_codes.md">🗾 Locale</a>
207
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/locale_codes.md">🗾 Locales</a>
214
208
  <br />
215
209
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/method_summary.md">📗 API</a> |
216
210
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/cdp_mode_methods.md">📘 Stealth API</a> |
217
- <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/syntax_formats.md"> 🔠 DesignPatterns</a> |
211
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/syntax_formats.md"> 🔠 Syntax Formats</a> |
218
212
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/recorder_mode.md">🔴 Recorder</a> |
219
213
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/example_logs/ReadMe.md">📊 Dashboard</a>
220
214
  <br />
221
215
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/commander.md">🎖️ GUI</a> |
222
- <a href="https://seleniumbase.io/demo_page">📰 TestPage</a> |
216
+ <a href="https://seleniumbase.io/demo_page">📰 Test Page</a> |
223
217
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/uc_mode.md">👤 UC Mode</a> |
224
218
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md">🐙 CDP Mode</a> |
225
219
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/chart_maker/ReadMe.md">📶 Charts</a> |
@@ -232,7 +226,7 @@ Dynamic: summary
232
226
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/tour_examples/ReadMe.md">🚎 Tours</a>
233
227
  <br />
234
228
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/mcp_servers/">🤖 MCP</a> |
235
- <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/js_package_manager.md">🟨 JS Mgr</a> |
229
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/js_package_manager.md">🟨 JS Tools</a> |
236
230
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/translations.md">🌏 Translator</a> |
237
231
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/presenter/ReadMe.md">🎞️ Presenter</a> |
238
232
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/visual_testing/ReadMe.md">🖼️ Visual</a> |
@@ -241,51 +235,38 @@ Dynamic: summary
241
235
 
242
236
  --------
243
237
 
244
- 🐙 <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/uc_mode.md"><a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md"><b>CDP Mode</b></a> bypasses bot-detection and <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/ReadMe.md">makes <span translate="no">Playwright</span> stealthy</a>.
238
+ 🧪 End-to-End Testing examples are located in [./examples/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples).
239
+
240
+ 🐙 Stealthy CDP Mode examples are located in [./examples/cdp_mode/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples/cdp_mode).
241
+
242
+ 🎭 Stealthy Playwright examples are located in [./examples/cdp_mode/playwright/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/).
245
243
 
246
- ℹ️ Example scripts that start or end with "<code>test</code>" run with <code><b>pytest</b></code>. Other scripts run directly with raw <code><b>python</b></code> (and start with "<code>raw</code>" to avoid confusion).
244
+ > [!NOTE]
245
+ > Examples that start with `test` run with **`pytest`**.<br />
246
+ > Other examples run directly with raw **`python`**.
247
247
 
248
248
  --------
249
249
 
250
- 📝 [This example](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_cdp_mode.py) uses <b><code translate="no">seleniumbase</code></b> <b><code translate="no">sb_cdp</code></b> (*[Pure CDP Mode](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md#Pure_CDP_Mode)*):<br /><em>(It bypasses BrowserScan, Sannysoft, and Cloudflare bot-detection)</em>
250
+ 📝 [This example](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_mode.py) uses <b><code translate="no">seleniumbase</code></b> <b><code translate="no">sb_cdp</code></b> (*[Pure CDP Mode](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md#Pure_CDP_Mode)*):<br /><em>(It shows some basic methods and bypasses a Cloudflare Turnstile)</em>
251
251
 
252
252
  ```python
253
253
  from seleniumbase import sb_cdp
254
254
 
255
- sb = sb_cdp.Chrome() # Launch a stealth browser
256
- sb.goto("https://browserscan.net/bot-detection")
257
- sb.assert_element('strong:contains("Normal")')
258
- sb.sleep(1)
259
-
260
- sb.goto("https://bot.sannysoft.com/")
261
- sb.assert_element(".passed")
262
- sb.assert_element_not_visible(".failed")
263
- sb.sleep(1)
264
-
255
+ sb = sb_cdp.Chrome() # Launches a stealth browser
265
256
  sb.goto("https://www.planetminecraft.com/account")
266
- sb.type('[name="email"]', "Name123")
257
+ sb.type('[name="email"]', "Test123")
267
258
  sb.type('[name="password"]', "Pass")
268
- sb.click("input#autologin")
269
- sb.solve_captcha() # Works on different CAPTCHAs
259
+ sb.click("input#autologin") # Unchecks a checkbox
260
+ sb.solve_captcha() # (as backup if not automatic)
270
261
  sb.assert_element('input[name="login"]')
271
262
  sb.assert_element_not_visible("input[disabled]")
272
- sb.sleep(1)
273
- sb.quit() # Quit browser before end-of-program
263
+ sb.sleep(1) # (only to slow down the live demo)
264
+ sb.quit() # (otherwise quits automatically at end)
274
265
  ```
275
266
 
276
- <p align="center">
277
- <img src="https://seleniumbase.github.io/cdn/img/results_normal.jpg" width="520" style="max-width: 100% !important; height: auto !important;" alt="BrowserScan Test Results: Normal" />
278
- <br /><em>(All BrowserScan bot-detection tests passed successfully)</em>
279
- </p>
280
-
281
- <p align="center">
282
- <img src="https://seleniumbase.github.io/other/sannysoft_success.jpg" width="428" style="max-width: 100% !important; height: auto !important;" alt="All Sannysoft tests passed successfully" />
283
- <br /><em>(All Sannysoft bot-detection tests passed successfully)</em>
284
- </p>
285
-
286
- <p align="center">
287
- <img src="https://seleniumbase.github.io/other/pmc_captcha_2.png" width="530" style="max-width: 100% !important; height: auto !important;" alt="Cloudflare Turnstile bypassed successfully" />
288
- <br /><em>(Cloudflare Turnstile bypassed successfully on Planet Minecraft)</em>
267
+ <p align="left">
268
+ <img src="https://seleniumbase.github.io/other/pmc_captcha_3.png" width="542" style="max-width: 100% !important; height: auto !important;" alt="Cloudflare Turnstile bypassed successfully" />
269
+ <br /><em>(Note that the click action only unchecked the "Stay signed in" checkbox.)</em>
289
270
  </p>
290
271
 
291
272
  --------
@@ -296,7 +277,7 @@ sb.quit() # Quit browser before end-of-program
296
277
 
297
278
  --------
298
279
 
299
- <p align="left">📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_yc_news.py" target="_blank" rel="noopener">This script</a> scrapes Hacker News listings:</p>
280
+ <p align="left">📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_yc_news.py" target="_blank" rel="noopener">This script</a> searches Hacker News via Algolia. Then prints items and saves to PDF:</p>
300
281
 
301
282
  ```python
302
283
  from seleniumbase import sb_cdp
@@ -305,7 +286,9 @@ sb = sb_cdp.Chrome(fast=True)
305
286
  sb.goto("https://hn.algolia.com/?query=seleniumbase")
306
287
  elements = sb.find_elements("div.Story_title > a")
307
288
  for element in elements:
308
- print("* " + element.text)
289
+ print("--> " + element.text)
290
+ sb.save_as_pdf("sb_news.pdf", folder="./downloaded_files/")
291
+ print("*** PDF saved to: ./downloaded_files/sb_news.pdf")
309
292
  ```
310
293
 
311
294
  ```
@@ -313,7 +296,7 @@ python raw_cdp_yc_news.py
313
296
  ```
314
297
 
315
298
  <p align="left">
316
- <img src="https://seleniumbase.github.io/other/yc_news_results.png" alt="SeleniumBase" width="510" style="max-width: 100% !important; height: auto !important;"/>
299
+ <img src="https://seleniumbase.github.io/other/yc_news_results_2.png" alt="SeleniumBase" width="510" style="max-width: 100% !important; height: auto !important;"/>
317
300
  </p>
318
301
 
319
302
  --------
@@ -342,14 +325,6 @@ python raw_gitlab.py
342
325
 
343
326
  --------
344
327
 
345
- 🧪 End-to-End Testing examples are located in [./examples/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples).
346
-
347
- 🐙 Stealthy CDP Mode examples are located in [./examples/cdp_mode/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples/cdp_mode).
348
-
349
- 🎭 Stealthy Playwright examples are located in [./examples/cdp_mode/playwright/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/).
350
-
351
- --------
352
-
353
328
  <h3 align="left">🌐 CLI Options for Supported Chromium Browsers</h3>
354
329
 
355
330
  <p>💡 You can set which Chromium browser to use via command-line parameters:</p>
@@ -8,37 +8,31 @@
8
8
  <meta property="og:image" content="https://seleniumbase.github.io/cdn/img/mac_sb_logo_5b.png" />
9
9
  <link rel="icon" href="https://seleniumbase.github.io/img/logo7.png" />
10
10
 
11
- <h1 align="center">📊 SeleniumBase</h1>
11
+ <h1 align="center"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/super_logo_sb3.png" title="SeleniumBase" width="520" style="max-width: 100% !important; height: auto !important;" /></a></h1>
12
12
 
13
- <h3 align="center">APIs for Web Scraping, Browser Automation, and E2E Testing.<br /></h3>
14
-
15
- <p align="center"><b align="center">Includes stealth options for bypassing bot-detection and CAPTCHAs.<br /></b></p>
13
+ <h3 align="center">Browser Automation, Web Scraping, and End-to-End Testing.<br /></h3>
16
14
 
17
15
  <p align="center">
18
16
  <a href="https://pypi.python.org/pypi/seleniumbase" target="_blank" rel="noopener"><img src="https://img.shields.io/pypi/v/seleniumbase.svg?style=flat-square&color=3399EE" alt="PyPI version" height="20" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/actions" target="_blank" rel="noopener"><img src="https://img.shields.io/github/actions/workflow/status/seleniumbase/SeleniumBase/python-package.yml?branch=master&style=flat-square&label=CI" alt="SeleniumBase GitHub Actions" height="20" /></a> <a href="https://seleniumbase.io" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg?style=flat-square" alt="SeleniumBase Docs" height="20" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/LICENSE" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/license-MIT-33A6C6.svg?style=flat-square" title="SeleniumBase" height="20" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/tree/master/mcp_servers" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/MCP-tool_info-7C6EE5?style=flat-square" height="20" /></a> <a href="https://pepy.tech/projects/seleniumbase?timeRange=threeMonths&category=version&includeCIDownloads=true&granularity=daily&viewType=line&versions=*" target="_blank" rel="noopener"><img src="https://static.pepy.tech/badge/seleniumbase" alt="SeleniumBase PyPI downloads" height="20" /></a><br />
19
17
  <a href="https://www.youtube.com/playlist?list=PLp9uKicxkBc5UIlGi2BuE3aWC7JyXpD3m" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/docs-📺-D844E8.svg?style=flat-square&logo=YouTube&logoColor=white&label=YouTube" alt="YouTube Channel" height="20" /></a> <a href="https://www.facebook.com/SeleniumBase/" target="_blank" rel="noopener"> <img src="https://img.shields.io/badge/Facebook-4K_followers-1877F2?style=flat-square&logo=facebook&logoColor=white" alt="SeleniumBase Facebook Followers" height="20" /></a> <a href="https://x.com/seleniumbase" target="_blank" rel="noopener"><img src="https://img.shields.io/badge/-1K_followers-1DA1F2?style=flat-square&logo=x&logoColor=white&labelColor=555555" alt="SeleniumBase X Followers" height="20" /></a> <a href="https://discord.gg/EdhQTn3EyE" target="_blank" rel="noopener"><img src="https://img.shields.io/discord/727927627830001734?style=flat-square&color=7289DA&label=Discord&logo=discord&logoColor=white" height="20" /></a> <a href="https://github.com/seleniumbase/SeleniumBase" target="_blank" rel="noopener"><img src="https://badgen.net/github/stars/seleniumbase/SeleniumBase" title="Stars" height="20" /></a>
20
18
  </p>
21
19
 
22
- <p align="center">
23
- <a href="https://trendshift.io/repositories/12493?utm_source=repository-badge&amp;utm_medium=badge&amp;utm_campaign=badge-repository-12493" target="_blank" rel="noopener"><img src="https://trendshift.io/api/badge/repositories/12493" alt="seleniumbase%2SeleniumBase | Trendshift" width="250" height="55"/></a>
24
- </p>
25
-
26
20
  <p align="center">
27
21
  <a href="#python_installation">🚀 Start</a> |
28
22
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/features_list.md">🏰 Features</a> |
29
23
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/customizing_test_runs.md">🎛️ Options</a> |
30
24
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/ReadMe.md">📚 Examples</a> |
31
25
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/console_scripts/ReadMe.md">💻 Scripts</a> |
32
- <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/locale_codes.md">🗾 Locale</a>
26
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/locale_codes.md">🗾 Locales</a>
33
27
  <br />
34
28
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/method_summary.md">📗 API</a> |
35
29
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/cdp_mode_methods.md">📘 Stealth API</a> |
36
- <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/syntax_formats.md"> 🔠 DesignPatterns</a> |
30
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/syntax_formats.md"> 🔠 Syntax Formats</a> |
37
31
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/recorder_mode.md">🔴 Recorder</a> |
38
32
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/example_logs/ReadMe.md">📊 Dashboard</a>
39
33
  <br />
40
34
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/commander.md">🎖️ GUI</a> |
41
- <a href="https://seleniumbase.io/demo_page">📰 TestPage</a> |
35
+ <a href="https://seleniumbase.io/demo_page">📰 Test Page</a> |
42
36
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/uc_mode.md">👤 UC Mode</a> |
43
37
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md">🐙 CDP Mode</a> |
44
38
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/chart_maker/ReadMe.md">📶 Charts</a> |
@@ -51,7 +45,7 @@
51
45
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/tour_examples/ReadMe.md">🚎 Tours</a>
52
46
  <br />
53
47
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/mcp_servers/">🤖 MCP</a> |
54
- <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/js_package_manager.md">🟨 JS Mgr</a> |
48
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/js_package_manager.md">🟨 JS Tools</a> |
55
49
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/translations.md">🌏 Translator</a> |
56
50
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/presenter/ReadMe.md">🎞️ Presenter</a> |
57
51
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/visual_testing/ReadMe.md">🖼️ Visual</a> |
@@ -60,51 +54,38 @@
60
54
 
61
55
  --------
62
56
 
63
- 🐙 <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/uc_mode.md"><a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md"><b>CDP Mode</b></a> bypasses bot-detection and <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/ReadMe.md">makes <span translate="no">Playwright</span> stealthy</a>.
57
+ 🧪 End-to-End Testing examples are located in [./examples/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples).
58
+
59
+ 🐙 Stealthy CDP Mode examples are located in [./examples/cdp_mode/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples/cdp_mode).
60
+
61
+ 🎭 Stealthy Playwright examples are located in [./examples/cdp_mode/playwright/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/).
64
62
 
65
- ℹ️ Example scripts that start or end with "<code>test</code>" run with <code><b>pytest</b></code>. Other scripts run directly with raw <code><b>python</b></code> (and start with "<code>raw</code>" to avoid confusion).
63
+ > [!NOTE]
64
+ > Examples that start with `test` run with **`pytest`**.<br />
65
+ > Other examples run directly with raw **`python`**.
66
66
 
67
67
  --------
68
68
 
69
- 📝 [This example](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_cdp_mode.py) uses <b><code translate="no">seleniumbase</code></b> <b><code translate="no">sb_cdp</code></b> (*[Pure CDP Mode](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md#Pure_CDP_Mode)*):<br /><em>(It bypasses BrowserScan, Sannysoft, and Cloudflare bot-detection)</em>
69
+ 📝 [This example](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_mode.py) uses <b><code translate="no">seleniumbase</code></b> <b><code translate="no">sb_cdp</code></b> (*[Pure CDP Mode](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md#Pure_CDP_Mode)*):<br /><em>(It shows some basic methods and bypasses a Cloudflare Turnstile)</em>
70
70
 
71
71
  ```python
72
72
  from seleniumbase import sb_cdp
73
73
 
74
- sb = sb_cdp.Chrome() # Launch a stealth browser
75
- sb.goto("https://browserscan.net/bot-detection")
76
- sb.assert_element('strong:contains("Normal")')
77
- sb.sleep(1)
78
-
79
- sb.goto("https://bot.sannysoft.com/")
80
- sb.assert_element(".passed")
81
- sb.assert_element_not_visible(".failed")
82
- sb.sleep(1)
83
-
74
+ sb = sb_cdp.Chrome() # Launches a stealth browser
84
75
  sb.goto("https://www.planetminecraft.com/account")
85
- sb.type('[name="email"]', "Name123")
76
+ sb.type('[name="email"]', "Test123")
86
77
  sb.type('[name="password"]', "Pass")
87
- sb.click("input#autologin")
88
- sb.solve_captcha() # Works on different CAPTCHAs
78
+ sb.click("input#autologin") # Unchecks a checkbox
79
+ sb.solve_captcha() # (as backup if not automatic)
89
80
  sb.assert_element('input[name="login"]')
90
81
  sb.assert_element_not_visible("input[disabled]")
91
- sb.sleep(1)
92
- sb.quit() # Quit browser before end-of-program
82
+ sb.sleep(1) # (only to slow down the live demo)
83
+ sb.quit() # (otherwise quits automatically at end)
93
84
  ```
94
85
 
95
- <p align="center">
96
- <img src="https://seleniumbase.github.io/cdn/img/results_normal.jpg" width="520" style="max-width: 100% !important; height: auto !important;" alt="BrowserScan Test Results: Normal" />
97
- <br /><em>(All BrowserScan bot-detection tests passed successfully)</em>
98
- </p>
99
-
100
- <p align="center">
101
- <img src="https://seleniumbase.github.io/other/sannysoft_success.jpg" width="428" style="max-width: 100% !important; height: auto !important;" alt="All Sannysoft tests passed successfully" />
102
- <br /><em>(All Sannysoft bot-detection tests passed successfully)</em>
103
- </p>
104
-
105
- <p align="center">
106
- <img src="https://seleniumbase.github.io/other/pmc_captcha_2.png" width="530" style="max-width: 100% !important; height: auto !important;" alt="Cloudflare Turnstile bypassed successfully" />
107
- <br /><em>(Cloudflare Turnstile bypassed successfully on Planet Minecraft)</em>
86
+ <p align="left">
87
+ <img src="https://seleniumbase.github.io/other/pmc_captcha_3.png" width="542" style="max-width: 100% !important; height: auto !important;" alt="Cloudflare Turnstile bypassed successfully" />
88
+ <br /><em>(Note that the click action only unchecked the "Stay signed in" checkbox.)</em>
108
89
  </p>
109
90
 
110
91
  --------
@@ -115,7 +96,7 @@ sb.quit() # Quit browser before end-of-program
115
96
 
116
97
  --------
117
98
 
118
- <p align="left">📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_yc_news.py" target="_blank" rel="noopener">This script</a> scrapes Hacker News listings:</p>
99
+ <p align="left">📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_cdp_yc_news.py" target="_blank" rel="noopener">This script</a> searches Hacker News via Algolia. Then prints items and saves to PDF:</p>
119
100
 
120
101
  ```python
121
102
  from seleniumbase import sb_cdp
@@ -124,7 +105,9 @@ sb = sb_cdp.Chrome(fast=True)
124
105
  sb.goto("https://hn.algolia.com/?query=seleniumbase")
125
106
  elements = sb.find_elements("div.Story_title > a")
126
107
  for element in elements:
127
- print("* " + element.text)
108
+ print("--> " + element.text)
109
+ sb.save_as_pdf("sb_news.pdf", folder="./downloaded_files/")
110
+ print("*** PDF saved to: ./downloaded_files/sb_news.pdf")
128
111
  ```
129
112
 
130
113
  ```
@@ -132,7 +115,7 @@ python raw_cdp_yc_news.py
132
115
  ```
133
116
 
134
117
  <p align="left">
135
- <img src="https://seleniumbase.github.io/other/yc_news_results.png" alt="SeleniumBase" width="510" style="max-width: 100% !important; height: auto !important;"/>
118
+ <img src="https://seleniumbase.github.io/other/yc_news_results_2.png" alt="SeleniumBase" width="510" style="max-width: 100% !important; height: auto !important;"/>
136
119
  </p>
137
120
 
138
121
  --------
@@ -161,14 +144,6 @@ python raw_gitlab.py
161
144
 
162
145
  --------
163
146
 
164
- 🧪 End-to-End Testing examples are located in [./examples/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples).
165
-
166
- 🐙 Stealthy CDP Mode examples are located in [./examples/cdp_mode/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples/cdp_mode).
167
-
168
- 🎭 Stealthy Playwright examples are located in [./examples/cdp_mode/playwright/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/).
169
-
170
- --------
171
-
172
147
  <h3 align="left">🌐 CLI Options for Supported Chromium Browsers</h3>
173
148
 
174
149
  <p>💡 You can set which Chromium browser to use via command-line parameters:</p>
@@ -8,7 +8,7 @@ exceptiongroup>=1.3.1
8
8
  websockets~=16.1.1;python_version=="3.10"
9
9
  websockets>=17.4;python_version>="3.11"
10
10
  filelock==4.1.0;python_version=="3.10"
11
- filelock>=4.2.7;python_version>="3.11"
11
+ filelock>=4.2.9;python_version>="3.11"
12
12
  fasteners>=0.20
13
13
  mycdp>=1.4.0
14
14
  pynose>=1.5.5
@@ -56,7 +56,7 @@ pytest-xdist==3.8.0
56
56
  parameterized==0.9.0
57
57
  behave==1.2.6
58
58
  soupsieve~=2.10.0;python_version<"3.11.5"
59
- soupsieve~=3.0.4;python_version>="3.11.5"
59
+ soupsieve~=4.0.1;python_version>="3.11.5"
60
60
  beautifulsoup4~=4.15.0
61
61
  pyotp~=2.10.0
62
62
  python-xlib==0.33;platform_system=="Linux"
@@ -69,7 +69,7 @@ rich>=15.0.0,<16
69
69
  # ("pip install -r requirements.txt" also installs this, but "pip install -e ." won't.)
70
70
 
71
71
  coverage>=7.16.2;python_version=="3.10"
72
- coverage>=7.17.0;python_version>="3.11"
72
+ coverage>=7.17.2;python_version>="3.11"
73
73
  pytest-cov>=7.1.0
74
74
  flake8==7.4.1;python_version=="3.10"
75
75
  flake8==7.5.0;python_version>="3.11"
@@ -1,2 +1,2 @@
1
1
  # seleniumbase package
2
- __version__ = "4.57.0"
2
+ __version__ = "4.57.1"
@@ -152,14 +152,14 @@ def show_install_usage():
152
152
  print(" sbase get chromedriver")
153
153
  print(" sbase get geckodriver")
154
154
  print(" sbase get edgedriver")
155
- print(" sbase get chromedriver 149")
156
- print(" sbase get chromedriver 149.0.7827.155")
155
+ print(" sbase get chromedriver 156")
156
+ print(" sbase get chromedriver 156.0.8078.80")
157
157
  print(" sbase get chromedriver stable")
158
158
  print(" sbase get chromedriver beta")
159
159
  print(" sbase get chromedriver -p")
160
160
  print(" sbase get chromium")
161
161
  print(" sbase get chromium --revision=1639046")
162
- print(" sbase get cft 149")
162
+ print(" sbase get cft 156")
163
163
  print(" sbase get chs")
164
164
  print("Output:")
165
165
  print(" Downloads driver/binary to seleniumbase/drivers/")
@@ -19,14 +19,14 @@ Examples:
19
19
  sbase get chromedriver
20
20
  sbase get geckodriver
21
21
  sbase get edgedriver
22
- sbase get chromedriver 149
23
- sbase get chromedriver 149.0.7827.155
22
+ sbase get chromedriver 156
23
+ sbase get chromedriver 156.0.8078.80
24
24
  sbase get chromedriver stable
25
25
  sbase get chromedriver beta
26
26
  sbase get chromedriver -p
27
27
  sbase get chromium
28
28
  sbase get chromium --revision=1639046
29
- sbase get cft 149
29
+ sbase get cft 156
30
30
  sbase get chs
31
31
  Output:
32
32
  Downloads driver/binary to seleniumbase/drivers/
@@ -72,7 +72,7 @@ DRIVER_DIR_CHROMIUM = os.path.dirname(
72
72
  )
73
73
  LOCAL_PATH = "/usr/local/bin/" # On Mac and Linux systems
74
74
  DEFAULT_CHROMEDRIVER_VERSION = "114.0.5735.90" # (If can't find LATEST_STABLE)
75
- DEFAULT_GECKODRIVER_VERSION = "v0.36.0"
75
+ DEFAULT_GECKODRIVER_VERSION = "v0.37.1"
76
76
  DEFAULT_EDGEDRIVER_VERSION = "115.0.1901.183" # (If can't find LATEST_STABLE)
77
77
 
78
78
 
@@ -96,14 +96,14 @@ def invalid_run_command():
96
96
  exp += " sbase get chromedriver\n"
97
97
  exp += " sbase get geckodriver\n"
98
98
  exp += " sbase get edgedriver\n"
99
- exp += " sbase get chromedriver 149\n"
100
- exp += " sbase get chromedriver 149.0.7827.155\n"
99
+ exp += " sbase get chromedriver 156\n"
100
+ exp += " sbase get chromedriver 156.0.8078.80\n"
101
101
  exp += " sbase get chromedriver stable\n"
102
102
  exp += " sbase get chromedriver beta\n"
103
103
  exp += " sbase get chromedriver -p\n"
104
104
  exp += " sbase get chromium\n"
105
105
  exp += " sbase get chromium --revision=1639046\n"
106
- exp += " sbase get cft 149\n"
106
+ exp += " sbase get cft 156\n"
107
107
  exp += " sbase get chs\n"
108
108
  exp += "Output:\n"
109
109
  exp += " Downloads driver/binary to seleniumbase/drivers/\n"
@@ -504,7 +504,10 @@ def main(override=None, intel_for_uc=None, force_uc=None):
504
504
  else:
505
505
  file_name = "chromedriver_mac64.zip"
506
506
  elif IS_LINUX:
507
- file_name = "chromedriver_linux64.zip"
507
+ if IS_ARM_LINUX:
508
+ file_name = "chromedriver-linux-arm64.zip"
509
+ else:
510
+ file_name = "chromedriver-linux64.zip"
508
511
  elif IS_WINDOWS:
509
512
  file_name = "chromedriver_win32.zip" # Works for win32 / win_x64
510
513
  if not get_latest and not get_v_latest and num_args < 4:
@@ -596,8 +599,12 @@ def main(override=None, intel_for_uc=None, force_uc=None):
596
599
  platform_code = "mac-x64"
597
600
  file_name = "chromedriver-mac-x64.zip"
598
601
  elif IS_LINUX:
599
- platform_code = "linux64"
600
- file_name = "chromedriver-linux64.zip"
602
+ if IS_ARM_LINUX:
603
+ platform_code = "linux-arm64"
604
+ file_name = "chromedriver-linux-arm64.zip"
605
+ else:
606
+ platform_code = "linux64"
607
+ file_name = "chromedriver-linux64.zip"
601
608
  elif IS_WINDOWS:
602
609
  if "64" in ARCH:
603
610
  platform_code = "win64"
@@ -715,8 +722,12 @@ def main(override=None, intel_for_uc=None, force_uc=None):
715
722
  platform_code = "mac-x64"
716
723
  file_name = "chrome-mac-x64.zip"
717
724
  elif IS_LINUX:
718
- platform_code = "linux64"
719
- file_name = "chrome-linux64.zip"
725
+ if IS_ARM_LINUX:
726
+ platform_code = "linux-arm64"
727
+ file_name = "chrome-linux-arm64.zip"
728
+ else:
729
+ platform_code = "linux64"
730
+ file_name = "chrome-linux64.zip"
720
731
  elif IS_WINDOWS:
721
732
  if "64" in ARCH:
722
733
  platform_code = "win64"
@@ -824,8 +835,12 @@ def main(override=None, intel_for_uc=None, force_uc=None):
824
835
  platform_code = "mac-x64"
825
836
  file_name = "chrome-headless-shell-mac-x64.zip"
826
837
  elif IS_LINUX:
827
- platform_code = "linux64"
828
- file_name = "chrome-headless-shell-linux64.zip"
838
+ if IS_ARM_LINUX:
839
+ platform_code = "linux-arm64"
840
+ file_name = "chrome-headless-shell-linux-arm64.zip"
841
+ else:
842
+ platform_code = "linux64"
843
+ file_name = "chrome-headless-shell-linux64.zip"
829
844
  elif IS_WINDOWS:
830
845
  if "64" in ARCH:
831
846
  platform_code = "win64"
@@ -869,7 +884,7 @@ def main(override=None, intel_for_uc=None, force_uc=None):
869
884
  file_name = "geckodriver-%s-macos.tar.gz" % use_version
870
885
  elif IS_LINUX:
871
886
  if "64" in ARCH:
872
- if "aarch64" in platform.processor():
887
+ if IS_ARM_LINUX:
873
888
  file_name = (
874
889
  "geckodriver-%s-linux-aarch64.tar.gz" % use_version
875
890
  )
@@ -79,13 +79,11 @@ def get_mfa_code(totp_key=None):
79
79
 
80
80
  def is_arm_linux():
81
81
  """Returns True if machine is ARM Linux.
82
- This will be useful once Google adds
83
- support for ARM Linux ChromeDriver.
84
82
  (Raspberry Pi uses ARM architecture.)"""
85
- return (
86
- platform.system() == "Linux"
87
- and platform.machine() == "aarch64"
83
+ is_linux = (
84
+ platform.system() == "Linux" or "linux" in sys.platform
88
85
  )
86
+ return is_linux and (platform.machine().lower() in ("aarch64", "arm64"))
89
87
 
90
88
 
91
89
  def is_arm_mac():