seleniumbase 4.49.0__tar.gz → 4.49.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 (163) hide show
  1. {seleniumbase-4.49.0/seleniumbase.egg-info → seleniumbase-4.49.1}/PKG-INFO +21 -21
  2. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/README.md +16 -15
  3. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/requirements.txt +1 -0
  4. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/__version__.py +1 -1
  5. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/undetected/__init__.py +24 -0
  6. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/undetected/cdp_driver/browser.py +23 -0
  7. {seleniumbase-4.49.0 → seleniumbase-4.49.1/seleniumbase.egg-info}/PKG-INFO +21 -21
  8. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase.egg-info/requires.txt +2 -4
  9. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/setup.py +6 -12
  10. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/.gitignore +0 -0
  11. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/LICENSE +0 -0
  12. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/MANIFEST.in +0 -0
  13. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/install.sh +0 -0
  14. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/pyproject.toml +0 -0
  15. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/pytest.ini +0 -0
  16. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/sbase/__init__.py +0 -0
  17. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/sbase/__main__.py +0 -0
  18. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/sbase/steps.py +0 -0
  19. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/__init__.py +0 -0
  20. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/__main__.py +0 -0
  21. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/behave/__init__.py +0 -0
  22. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/behave/behave_helper.py +0 -0
  23. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/behave/behave_sb.py +0 -0
  24. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/behave/steps.py +0 -0
  25. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/common/__init__.py +0 -0
  26. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/common/decorators.py +0 -0
  27. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/common/encryption.py +0 -0
  28. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/common/exceptions.py +0 -0
  29. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/common/obfuscate.py +0 -0
  30. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/common/unobfuscate.py +0 -0
  31. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/config/__init__.py +0 -0
  32. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/config/ad_block_list.py +0 -0
  33. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/config/proxy_list.py +0 -0
  34. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/config/settings.py +0 -0
  35. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/console_scripts/__init__.py +0 -0
  36. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/console_scripts/logo_helper.py +0 -0
  37. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/console_scripts/rich_helper.py +0 -0
  38. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/console_scripts/run.py +0 -0
  39. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
  40. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
  41. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/console_scripts/sb_commander.py +0 -0
  42. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/console_scripts/sb_install.py +0 -0
  43. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
  44. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
  45. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
  46. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
  47. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
  48. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/console_scripts/sb_objectify.py +0 -0
  49. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/console_scripts/sb_print.py +0 -0
  50. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/console_scripts/sb_recorder.py +0 -0
  51. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/__init__.py +0 -0
  52. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/application_manager.py +0 -0
  53. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/browser_launcher.py +0 -0
  54. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/capabilities_parser.py +0 -0
  55. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/colored_traceback.py +0 -0
  56. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/create_db_tables.sql +0 -0
  57. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/detect_b_ver.py +0 -0
  58. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/download_helper.py +0 -0
  59. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/encoded_images.py +0 -0
  60. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/jqc_helper.py +0 -0
  61. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/log_helper.py +0 -0
  62. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/mysql.py +0 -0
  63. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/nest_asyncio.py +0 -0
  64. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/proxy_helper.py +0 -0
  65. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/recorder_helper.py +0 -0
  66. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/report_helper.py +0 -0
  67. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/s3_manager.py +0 -0
  68. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/sb_cdp.py +0 -0
  69. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/sb_driver.py +0 -0
  70. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/session_helper.py +0 -0
  71. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/settings_parser.py +0 -0
  72. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/style_sheet.py +0 -0
  73. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/testcase_manager.py +0 -0
  74. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/tour_helper.py +0 -0
  75. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/core/visual_helper.py +0 -0
  76. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/drivers/__init__.py +0 -0
  77. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/drivers/atlas_drivers/__init__.py +0 -0
  78. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/drivers/brave_drivers/__init__.py +0 -0
  79. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/drivers/cft_drivers/__init__.py +0 -0
  80. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/drivers/chromium_drivers/__init__.py +0 -0
  81. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/drivers/chs_drivers/__init__.py +0 -0
  82. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/drivers/comet_drivers/__init__.py +0 -0
  83. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/drivers/opera_drivers/__init__.py +0 -0
  84. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/extensions/__init__.py +0 -0
  85. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/extensions/ad_block.zip +0 -0
  86. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/extensions/disable_csp.zip +0 -0
  87. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/extensions/recorder.zip +0 -0
  88. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/extensions/sbase_ext.zip +0 -0
  89. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/fixtures/__init__.py +0 -0
  90. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/fixtures/base_case.py +0 -0
  91. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/fixtures/constants.py +0 -0
  92. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/fixtures/css_to_xpath.py +0 -0
  93. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/fixtures/errors.py +0 -0
  94. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/fixtures/js_utils.py +0 -0
  95. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/fixtures/page_actions.py +0 -0
  96. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/fixtures/page_utils.py +0 -0
  97. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/fixtures/shared_utils.py +0 -0
  98. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/fixtures/unittest_helper.py +0 -0
  99. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/fixtures/words.py +0 -0
  100. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/fixtures/xpath_to_css.py +0 -0
  101. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/js_code/__init__.py +0 -0
  102. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/js_code/active_css_js.py +0 -0
  103. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/js_code/live_js.py +0 -0
  104. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/js_code/recorder_js.py +0 -0
  105. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/masterqa/__init__.py +0 -0
  106. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/masterqa/master_qa.py +0 -0
  107. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/plugins/__init__.py +0 -0
  108. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/plugins/base_plugin.py +0 -0
  109. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/plugins/basic_test_info.py +0 -0
  110. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
  111. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/plugins/driver_manager.py +0 -0
  112. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/plugins/page_source.py +0 -0
  113. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/plugins/pytest_plugin.py +0 -0
  114. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
  115. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/plugins/sb_manager.py +0 -0
  116. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/plugins/screen_shots.py +0 -0
  117. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/plugins/selenium_plugin.py +0 -0
  118. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/resources/__init__.py +0 -0
  119. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/translate/__init__.py +0 -0
  120. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/translate/chinese.py +0 -0
  121. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/translate/dutch.py +0 -0
  122. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/translate/french.py +0 -0
  123. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/translate/italian.py +0 -0
  124. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/translate/japanese.py +0 -0
  125. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/translate/korean.py +0 -0
  126. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/translate/master_dict.py +0 -0
  127. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/translate/portuguese.py +0 -0
  128. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/translate/russian.py +0 -0
  129. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/translate/spanish.py +0 -0
  130. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/translate/translator.py +0 -0
  131. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/undetected/cdp.py +0 -0
  132. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/undetected/cdp_driver/__init__.py +0 -0
  133. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
  134. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/undetected/cdp_driver/cdp_util.py +0 -0
  135. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/undetected/cdp_driver/config.py +0 -0
  136. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/undetected/cdp_driver/connection.py +0 -0
  137. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/undetected/cdp_driver/element.py +0 -0
  138. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/undetected/cdp_driver/tab.py +0 -0
  139. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/undetected/dprocess.py +0 -0
  140. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/undetected/options.py +0 -0
  141. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/undetected/patcher.py +0 -0
  142. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/undetected/reactor.py +0 -0
  143. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/undetected/webelement.py +0 -0
  144. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/utilities/__init__.py +0 -0
  145. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
  146. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
  147. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_grid/font_color +0 -0
  148. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
  149. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
  150. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
  151. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
  152. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
  153. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
  154. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
  155. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
  156. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
  157. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
  158. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase.egg-info/SOURCES.txt +0 -0
  159. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase.egg-info/dependency_links.txt +0 -0
  160. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase.egg-info/entry_points.txt +0 -0
  161. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/seleniumbase.egg-info/top_level.txt +0 -0
  162. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/setup.cfg +0 -0
  163. {seleniumbase-4.49.0 → seleniumbase-4.49.1}/virtualenv_install.sh +0 -0
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: seleniumbase
3
- Version: 4.49.0
4
- Summary: Stealthy automation (via CDP Mode) that passes every bot detection test with any Chromium browser you want. Includes a test framework.
3
+ Version: 4.49.1
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
7
7
  Author-email: mdmintz@gmail.com
@@ -16,7 +16,7 @@ Project-URL: PyPI, https://pypi.org/project/seleniumbase/
16
16
  Project-URL: Source, https://github.com/seleniumbase/SeleniumBase
17
17
  Project-URL: Repository, https://github.com/seleniumbase/SeleniumBase
18
18
  Project-URL: Documentation, https://seleniumbase.io/
19
- Keywords: pytest,selenium,framework,automation,browser,testing,webdriver,seleniumbase,sbase,web-crawling,web-scraping,scraping,stealth,chromium,playwright,anti-detect,antidetect,undetected,bot-detection,fingerprint,recaptcha,cloudflare,turnstile,datadome,captcha,headless
19
+ Keywords: pytest,selenium,framework,automation,browser,testing,webdriver,seleniumbase,sbase,web-crawling,web-scraping,stealth,chromium,playwright,undetected,bot-detection,fingerprint,recaptcha,cloudflare,turnstile,datadome,captcha,headless
20
20
  Platform: Windows
21
21
  Platform: Linux
22
22
  Platform: Mac OS-X
@@ -84,6 +84,7 @@ Requires-Dist: six>=1.17.0
84
84
  Requires-Dist: parse>=1.22.0
85
85
  Requires-Dist: parse-type>=0.6.6
86
86
  Requires-Dist: colorama>=0.4.6
87
+ Requires-Dist: psutil>=7.2.2
87
88
  Requires-Dist: pyyaml>=6.0.3
88
89
  Requires-Dist: pygments>=2.20.0
89
90
  Requires-Dist: pyreadline3>=3.5.4; platform_system == "Windows"
@@ -166,9 +167,7 @@ Requires-Dist: pip-system-certs==4.0; platform_system == "Windows" and extra ==
166
167
  Provides-Extra: proxy
167
168
  Requires-Dist: proxy.py==2.4.3; extra == "proxy"
168
169
  Provides-Extra: playwright
169
- Requires-Dist: playwright>=1.58.0; extra == "playwright"
170
- Provides-Extra: psutil
171
- Requires-Dist: psutil>=7.2.2; extra == "psutil"
170
+ Requires-Dist: playwright>=1.60.0; extra == "playwright"
172
171
  Provides-Extra: pyautogui
173
172
  Requires-Dist: PyAutoGUI>=0.9.54; platform_system != "Linux" and extra == "pyautogui"
174
173
  Provides-Extra: selenium-stealth
@@ -208,19 +207,12 @@ Dynamic: summary
208
207
  <meta property="og:image" content="https://seleniumbase.github.io/cdn/img/mac_sb_logo_5b.png" />
209
208
  <link rel="icon" href="https://seleniumbase.github.io/img/logo7.png" />
210
209
 
211
- <h1>SeleniumBase</h1>
212
-
213
210
  <p align="center"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/nice_logo_8t.png" alt="SeleniumBase" width="424" /></a></p>
214
211
 
215
212
  <p align="center"><a href="https://pypi.python.org/pypi/seleniumbase" target="_blank"><img src="https://img.shields.io/pypi/v/seleniumbase.svg?color=3399EE" alt="PyPI version" /></a> <a href="https://pepy.tech/projects/seleniumbase?timeRange=threeMonths&category=version&includeCIDownloads=true&granularity=daily&viewType=line&versions=*" target="_blank"><img src="https://static.pepy.tech/badge/seleniumbase" alt="SeleniumBase PyPI downloads" /></a> <a href="https://discord.gg/EdhQTn3EyE" target="_blank"><img src="https://img.shields.io/discord/727927627830001734?color=7289DA&label=Discord&logo=discord&logoColor=white"/></a><br /> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/LICENSE"><img src="https://img.shields.io/badge/license-MIT-22BBCC.svg" title="SeleniumBase" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/actions" target="_blank"><img src="https://github.com/seleniumbase/SeleniumBase/workflows/CI%20build/badge.svg" alt="SeleniumBase GitHub Actions" /></a> <a href="https://seleniumbase.io"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg" alt="SeleniumBase Docs" /></a></p>
216
213
  <p align="center"></p>
217
214
 
218
- <h3 align="center">Stealthy automation that passes every bot detection test.</h3>
219
-
220
- <table align="center"><tr><td>
221
- <b>Verified using multiple different Chromium browsers:<br />Chrome, Chrome-for-Testing, Chromium, Edge, Brave.</b>
222
- </td></tr></table>
223
-
215
+ <h3 align="center">Stealthy Chromium Automation and E2E Testing.</h3>
224
216
 
225
217
  <p align="center">
226
218
  <a href="#python_installation">🚀 Start</a> |
@@ -240,7 +232,7 @@ Dynamic: summary
240
232
  <a href="https://seleniumbase.io/demo_page">📰 TestPage</a> |
241
233
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/uc_mode.md">👤 UC Mode</a> |
242
234
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md">🐙 CDP Mode</a> |
243
- <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/chart_maker/ReadMe.md">📶 Charts</a> |
235
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/chart_maker/ReadMe.md">📶 Charts</a> |
244
236
  <a href="https://seleniumbase.io/devices/?url=seleniumbase.com">🖥️ Farm</a>
245
237
  <br />
246
238
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/how_it_works.md">👁️ How</a> |
@@ -260,9 +252,11 @@ Dynamic: summary
260
252
 
261
253
  🐙 <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md"><b>CDP Mode</b></a> bypasses bot-detection and handles CAPTCHAs by driving the browser directly through the <a href="https://chromedevtools.github.io/devtools-protocol/" translate="no">Chrome DevTools Protocol</a>. Includes <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/ReadMe.md"><b><span translate="no">Stealthy Playwright Mode</span></b></a>, which extends these advanced anti-detection patches to Playwright scripts.
262
254
 
263
- 📚 The [SeleniumBase/examples/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples) folder includes over 100 ready-to-run examples. Examples that start with `test_` or end with `_test.py`/`_tests.py` are specifically designed to run with `pytest`. Other examples run directly with raw `python` (those files generally start with `raw_` to avoid confusion).
255
+ 📚 The [SeleniumBase/examples/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples) folder includes over 100 ready-to-run examples of E2E testing. Examples that start with `test_` or end with `_test.py`/`_tests.py` are specifically designed to run with `pytest`. Other examples run directly with raw `python` (those files generally start with `raw_` to avoid confusion).
256
+
257
+ 🥷 Stealthy CDP Mode examples are located in [./examples/cdp_mode/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples/cdp_mode).
264
258
 
265
- 🥷 Stealthy examples are located in [SeleniumBase/examples/cdp_mode/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples/cdp_mode).
259
+ 🎭 Stealthy Playwright examples are located in [./examples/cdp_mode/playwright/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/).
266
260
 
267
261
  --------
268
262
 
@@ -283,13 +277,13 @@ url = "https://www.browserscan.net/bot-detection"
283
277
  sb = sb_cdp.Chrome(url, locale="en", ad_block=True)
284
278
  sb.flash("Test Results", duration=3, pause=1)
285
279
  sb.assert_element('strong:contains("Normal")')
286
- print("Bot Not detected")
280
+ print("Bot Not Detected")
287
281
  sb.flash('strong:contains("Normal")', duration=3, pause=2)
288
282
  ```
289
283
 
290
284
  <img src="https://seleniumbase.github.io/other/b_scan_results.jpg" width="628" alt="Stealthy architecture flowchart" />
291
285
 
292
- 📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/raw_browserscan_sync.py">This</a> also works as a drop-in replacement for Playwright (making it stealthy):
286
+ 📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/raw_browserscan_sync.py">This example</a> demonstrates the drop-in patch that makes Playwright stealthy:
293
287
 
294
288
  ```python
295
289
  from playwright.sync_api import sync_playwright
@@ -310,7 +304,7 @@ with sync_playwright() as p:
310
304
 
311
305
  --------
312
306
 
313
- For choosing which Chromium browser to use, you can set command-line options:
307
+ 💡 You can set which Chromium browser to use via command-line options:
314
308
 
315
309
  ```zsh
316
310
  python SCRIPT.py --use-chromium # Use the unbranded Chromium browser
@@ -319,7 +313,13 @@ python SCRIPT.py --edge # Use Microsoft Edge
319
313
  python SCRIPT.py --brave # Use Brave browser
320
314
  ```
321
315
 
322
- (Google Chrome is the default browser if not specified.)
316
+ Google Chrome is the default browser if not specified. Only unbranded Chromium and Chrome-for-Testing are installed automatically if not already installed.
317
+
318
+ You can also set the browser via method args, eg: `cft=True`, `use_chromium=True`, `browser="edge"`, `browser="brave"`, etc. Eg:
319
+
320
+ ```python
321
+ sb = sb_cdp.Chrome(url, use_chromium=True)
322
+ ```
323
323
 
324
324
  --------
325
325
 
@@ -7,19 +7,12 @@
7
7
  <meta property="og:image" content="https://seleniumbase.github.io/cdn/img/mac_sb_logo_5b.png" />
8
8
  <link rel="icon" href="https://seleniumbase.github.io/img/logo7.png" />
9
9
 
10
- <h1>SeleniumBase</h1>
11
-
12
10
  <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>
13
11
 
14
12
  <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>
15
13
  <p align="center"></p>
16
14
 
17
- <h3 align="center">Stealthy automation that passes every bot detection test.</h3>
18
-
19
- <table align="center"><tr><td>
20
- <b>Verified using multiple different Chromium browsers:<br />Chrome, Chrome-for-Testing, Chromium, Edge, Brave.</b>
21
- </td></tr></table>
22
-
15
+ <h3 align="center">Stealthy Chromium Automation and E2E Testing.</h3>
23
16
 
24
17
  <p align="center">
25
18
  <a href="#python_installation">🚀 Start</a> |
@@ -39,7 +32,7 @@
39
32
  <a href="https://seleniumbase.io/demo_page">📰 TestPage</a> |
40
33
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/uc_mode.md">👤 UC Mode</a> |
41
34
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md">🐙 CDP Mode</a> |
42
- <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/chart_maker/ReadMe.md">📶 Charts</a> |
35
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/chart_maker/ReadMe.md">📶 Charts</a> |
43
36
  <a href="https://seleniumbase.io/devices/?url=seleniumbase.com">🖥️ Farm</a>
44
37
  <br />
45
38
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/how_it_works.md">👁️ How</a> |
@@ -59,9 +52,11 @@
59
52
 
60
53
  🐙 <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md"><b>CDP Mode</b></a> bypasses bot-detection and handles CAPTCHAs by driving the browser directly through the <a href="https://chromedevtools.github.io/devtools-protocol/" translate="no">Chrome DevTools Protocol</a>. Includes <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/ReadMe.md"><b><span translate="no">Stealthy Playwright Mode</span></b></a>, which extends these advanced anti-detection patches to Playwright scripts.
61
54
 
62
- 📚 The [SeleniumBase/examples/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples) folder includes over 100 ready-to-run examples. Examples that start with `test_` or end with `_test.py`/`_tests.py` are specifically designed to run with `pytest`. Other examples run directly with raw `python` (those files generally start with `raw_` to avoid confusion).
55
+ 📚 The [SeleniumBase/examples/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples) folder includes over 100 ready-to-run examples of E2E testing. Examples that start with `test_` or end with `_test.py`/`_tests.py` are specifically designed to run with `pytest`. Other examples run directly with raw `python` (those files generally start with `raw_` to avoid confusion).
56
+
57
+ 🥷 Stealthy CDP Mode examples are located in [./examples/cdp_mode/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples/cdp_mode).
63
58
 
64
- 🥷 Stealthy examples are located in [SeleniumBase/examples/cdp_mode/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples/cdp_mode).
59
+ 🎭 Stealthy Playwright examples are located in [./examples/cdp_mode/playwright/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/).
65
60
 
66
61
  --------
67
62
 
@@ -82,13 +77,13 @@ url = "https://www.browserscan.net/bot-detection"
82
77
  sb = sb_cdp.Chrome(url, locale="en", ad_block=True)
83
78
  sb.flash("Test Results", duration=3, pause=1)
84
79
  sb.assert_element('strong:contains("Normal")')
85
- print("Bot Not detected")
80
+ print("Bot Not Detected")
86
81
  sb.flash('strong:contains("Normal")', duration=3, pause=2)
87
82
  ```
88
83
 
89
84
  <img src="https://seleniumbase.github.io/other/b_scan_results.jpg" width="628" alt="Stealthy architecture flowchart" />
90
85
 
91
- 📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/raw_browserscan_sync.py">This</a> also works as a drop-in replacement for Playwright (making it stealthy):
86
+ 📝 <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:
92
87
 
93
88
  ```python
94
89
  from playwright.sync_api import sync_playwright
@@ -109,7 +104,7 @@ with sync_playwright() as p:
109
104
 
110
105
  --------
111
106
 
112
- For choosing which Chromium browser to use, you can set command-line options:
107
+ 💡 You can set which Chromium browser to use via command-line options:
113
108
 
114
109
  ```zsh
115
110
  python SCRIPT.py --use-chromium # Use the unbranded Chromium browser
@@ -118,7 +113,13 @@ python SCRIPT.py --edge # Use Microsoft Edge
118
113
  python SCRIPT.py --brave # Use Brave browser
119
114
  ```
120
115
 
121
- (Google Chrome is the default browser if not specified.)
116
+ Google Chrome is the default browser if not specified. Only unbranded Chromium and Chrome-for-Testing are installed automatically if not already installed.
117
+
118
+ You can also set the browser via method args, eg: `cft=True`, `use_chromium=True`, `browser="edge"`, `browser="brave"`, etc. Eg:
119
+
120
+ ```python
121
+ sb = sb_cdp.Chrome(url, use_chromium=True)
122
+ ```
122
123
 
123
124
  --------
124
125
 
@@ -24,6 +24,7 @@ six>=1.17.0
24
24
  parse>=1.22.0
25
25
  parse-type>=0.6.6
26
26
  colorama>=0.4.6
27
+ psutil>=7.2.2
27
28
  pyyaml>=6.0.3
28
29
  pygments>=2.20.0
29
30
  pyreadline3>=3.5.4;platform_system=="Windows"
@@ -1,2 +1,2 @@
1
1
  # seleniumbase package
2
- __version__ = "4.49.0"
2
+ __version__ = "4.49.1"
@@ -1,6 +1,7 @@
1
1
  import logging
2
2
  import os
3
3
  import re
4
+ import psutil
4
5
  import requests
5
6
  import subprocess
6
7
  import sys
@@ -299,6 +300,13 @@ class Chrome(selenium.webdriver.chrome.webdriver.WebDriver):
299
300
  creationflags=creationflags,
300
301
  )
301
302
  self.browser_pid = browser.pid
303
+ self._process_pid = browser.pid
304
+ try:
305
+ self._process_create_time = (
306
+ psutil.Process(self._process_pid).create_time()
307
+ )
308
+ except psutil.NoSuchProcess:
309
+ self._process_create_time = None
302
310
  service_ = None
303
311
  log_output = subprocess.PIPE
304
312
  if patch_driver:
@@ -392,6 +400,22 @@ class Chrome(selenium.webdriver.chrome.webdriver.WebDriver):
392
400
  },
393
401
  )
394
402
 
403
+ def is_running(self):
404
+ """Check if the browser is still running."""
405
+ if not getattr(self, "_process_pid", None):
406
+ return False
407
+ # Not good enough: return psutil.pid_exists(self._process_pid)
408
+ try:
409
+ process = psutil.Process(self._process_pid)
410
+ # Check for PID recycling: Is this actually our process?
411
+ if hasattr(self, "_process_create_time"):
412
+ if process.create_time() != self._process_create_time:
413
+ return False # The PID was reused by a different process!
414
+ # If the process is a zombie, assume the browser isn't running
415
+ return process.status() != psutil.STATUS_ZOMBIE
416
+ except psutil.NoSuchProcess:
417
+ return False
418
+
395
419
  def remove_cdc_props_as_needed(self):
396
420
  cdc_props = self._get_cdc_props()
397
421
  if len(cdc_props) > 0:
@@ -9,6 +9,7 @@ import logging
9
9
  import os
10
10
  import pathlib
11
11
  import pickle
12
+ import psutil
12
13
  import re
13
14
  import shutil
14
15
  import time
@@ -263,6 +264,22 @@ class Browser:
263
264
  )
264
265
  self.targets.remove(current_tab)
265
266
 
267
+ def is_running(self):
268
+ """Check if the browser is still running."""
269
+ if not getattr(self, "_process_pid", None):
270
+ return False
271
+ # Not good enough: return psutil.pid_exists(self._process_pid)
272
+ try:
273
+ process = psutil.Process(self._process_pid)
274
+ # Check for PID recycling: Is this actually our process?
275
+ if hasattr(self, "_process_create_time"):
276
+ if process.create_time() != self._process_create_time:
277
+ return False # The PID was reused by a different process!
278
+ # If the process is a zombie, assume the browser isn't running
279
+ return process.status() != psutil.STATUS_ZOMBIE
280
+ except psutil.NoSuchProcess:
281
+ return False
282
+
266
283
  def get_rd_host(self):
267
284
  return self.config.host
268
285
 
@@ -617,6 +634,12 @@ class Browser:
617
634
  )
618
635
  await asyncio.sleep(0.05)
619
636
  self._process_pid = self._process.pid
637
+ try:
638
+ self._process_create_time = (
639
+ psutil.Process(self._process_pid).create_time()
640
+ )
641
+ except psutil.NoSuchProcess:
642
+ self._process_create_time = None
620
643
  await asyncio.sleep(0.05)
621
644
  self._http = HTTPApi((self.config.host, self.config.port))
622
645
  await asyncio.sleep(0.05)
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: seleniumbase
3
- Version: 4.49.0
4
- Summary: Stealthy automation (via CDP Mode) that passes every bot detection test with any Chromium browser you want. Includes a test framework.
3
+ Version: 4.49.1
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
7
7
  Author-email: mdmintz@gmail.com
@@ -16,7 +16,7 @@ Project-URL: PyPI, https://pypi.org/project/seleniumbase/
16
16
  Project-URL: Source, https://github.com/seleniumbase/SeleniumBase
17
17
  Project-URL: Repository, https://github.com/seleniumbase/SeleniumBase
18
18
  Project-URL: Documentation, https://seleniumbase.io/
19
- Keywords: pytest,selenium,framework,automation,browser,testing,webdriver,seleniumbase,sbase,web-crawling,web-scraping,scraping,stealth,chromium,playwright,anti-detect,antidetect,undetected,bot-detection,fingerprint,recaptcha,cloudflare,turnstile,datadome,captcha,headless
19
+ Keywords: pytest,selenium,framework,automation,browser,testing,webdriver,seleniumbase,sbase,web-crawling,web-scraping,stealth,chromium,playwright,undetected,bot-detection,fingerprint,recaptcha,cloudflare,turnstile,datadome,captcha,headless
20
20
  Platform: Windows
21
21
  Platform: Linux
22
22
  Platform: Mac OS-X
@@ -84,6 +84,7 @@ Requires-Dist: six>=1.17.0
84
84
  Requires-Dist: parse>=1.22.0
85
85
  Requires-Dist: parse-type>=0.6.6
86
86
  Requires-Dist: colorama>=0.4.6
87
+ Requires-Dist: psutil>=7.2.2
87
88
  Requires-Dist: pyyaml>=6.0.3
88
89
  Requires-Dist: pygments>=2.20.0
89
90
  Requires-Dist: pyreadline3>=3.5.4; platform_system == "Windows"
@@ -166,9 +167,7 @@ Requires-Dist: pip-system-certs==4.0; platform_system == "Windows" and extra ==
166
167
  Provides-Extra: proxy
167
168
  Requires-Dist: proxy.py==2.4.3; extra == "proxy"
168
169
  Provides-Extra: playwright
169
- Requires-Dist: playwright>=1.58.0; extra == "playwright"
170
- Provides-Extra: psutil
171
- Requires-Dist: psutil>=7.2.2; extra == "psutil"
170
+ Requires-Dist: playwright>=1.60.0; extra == "playwright"
172
171
  Provides-Extra: pyautogui
173
172
  Requires-Dist: PyAutoGUI>=0.9.54; platform_system != "Linux" and extra == "pyautogui"
174
173
  Provides-Extra: selenium-stealth
@@ -208,19 +207,12 @@ Dynamic: summary
208
207
  <meta property="og:image" content="https://seleniumbase.github.io/cdn/img/mac_sb_logo_5b.png" />
209
208
  <link rel="icon" href="https://seleniumbase.github.io/img/logo7.png" />
210
209
 
211
- <h1>SeleniumBase</h1>
212
-
213
210
  <p align="center"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/nice_logo_8t.png" alt="SeleniumBase" width="424" /></a></p>
214
211
 
215
212
  <p align="center"><a href="https://pypi.python.org/pypi/seleniumbase" target="_blank"><img src="https://img.shields.io/pypi/v/seleniumbase.svg?color=3399EE" alt="PyPI version" /></a> <a href="https://pepy.tech/projects/seleniumbase?timeRange=threeMonths&category=version&includeCIDownloads=true&granularity=daily&viewType=line&versions=*" target="_blank"><img src="https://static.pepy.tech/badge/seleniumbase" alt="SeleniumBase PyPI downloads" /></a> <a href="https://discord.gg/EdhQTn3EyE" target="_blank"><img src="https://img.shields.io/discord/727927627830001734?color=7289DA&label=Discord&logo=discord&logoColor=white"/></a><br /> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/LICENSE"><img src="https://img.shields.io/badge/license-MIT-22BBCC.svg" title="SeleniumBase" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/actions" target="_blank"><img src="https://github.com/seleniumbase/SeleniumBase/workflows/CI%20build/badge.svg" alt="SeleniumBase GitHub Actions" /></a> <a href="https://seleniumbase.io"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg" alt="SeleniumBase Docs" /></a></p>
216
213
  <p align="center"></p>
217
214
 
218
- <h3 align="center">Stealthy automation that passes every bot detection test.</h3>
219
-
220
- <table align="center"><tr><td>
221
- <b>Verified using multiple different Chromium browsers:<br />Chrome, Chrome-for-Testing, Chromium, Edge, Brave.</b>
222
- </td></tr></table>
223
-
215
+ <h3 align="center">Stealthy Chromium Automation and E2E Testing.</h3>
224
216
 
225
217
  <p align="center">
226
218
  <a href="#python_installation">🚀 Start</a> |
@@ -240,7 +232,7 @@ Dynamic: summary
240
232
  <a href="https://seleniumbase.io/demo_page">📰 TestPage</a> |
241
233
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/uc_mode.md">👤 UC Mode</a> |
242
234
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md">🐙 CDP Mode</a> |
243
- <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/chart_maker/ReadMe.md">📶 Charts</a> |
235
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/chart_maker/ReadMe.md">📶 Charts</a> |
244
236
  <a href="https://seleniumbase.io/devices/?url=seleniumbase.com">🖥️ Farm</a>
245
237
  <br />
246
238
  <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/how_it_works.md">👁️ How</a> |
@@ -260,9 +252,11 @@ Dynamic: summary
260
252
 
261
253
  🐙 <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md"><b>CDP Mode</b></a> bypasses bot-detection and handles CAPTCHAs by driving the browser directly through the <a href="https://chromedevtools.github.io/devtools-protocol/" translate="no">Chrome DevTools Protocol</a>. Includes <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/ReadMe.md"><b><span translate="no">Stealthy Playwright Mode</span></b></a>, which extends these advanced anti-detection patches to Playwright scripts.
262
254
 
263
- 📚 The [SeleniumBase/examples/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples) folder includes over 100 ready-to-run examples. Examples that start with `test_` or end with `_test.py`/`_tests.py` are specifically designed to run with `pytest`. Other examples run directly with raw `python` (those files generally start with `raw_` to avoid confusion).
255
+ 📚 The [SeleniumBase/examples/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples) folder includes over 100 ready-to-run examples of E2E testing. Examples that start with `test_` or end with `_test.py`/`_tests.py` are specifically designed to run with `pytest`. Other examples run directly with raw `python` (those files generally start with `raw_` to avoid confusion).
256
+
257
+ 🥷 Stealthy CDP Mode examples are located in [./examples/cdp_mode/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples/cdp_mode).
264
258
 
265
- 🥷 Stealthy examples are located in [SeleniumBase/examples/cdp_mode/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples/cdp_mode).
259
+ 🎭 Stealthy Playwright examples are located in [./examples/cdp_mode/playwright/](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/).
266
260
 
267
261
  --------
268
262
 
@@ -283,13 +277,13 @@ url = "https://www.browserscan.net/bot-detection"
283
277
  sb = sb_cdp.Chrome(url, locale="en", ad_block=True)
284
278
  sb.flash("Test Results", duration=3, pause=1)
285
279
  sb.assert_element('strong:contains("Normal")')
286
- print("Bot Not detected")
280
+ print("Bot Not Detected")
287
281
  sb.flash('strong:contains("Normal")', duration=3, pause=2)
288
282
  ```
289
283
 
290
284
  <img src="https://seleniumbase.github.io/other/b_scan_results.jpg" width="628" alt="Stealthy architecture flowchart" />
291
285
 
292
- 📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/raw_browserscan_sync.py">This</a> also works as a drop-in replacement for Playwright (making it stealthy):
286
+ 📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/raw_browserscan_sync.py">This example</a> demonstrates the drop-in patch that makes Playwright stealthy:
293
287
 
294
288
  ```python
295
289
  from playwright.sync_api import sync_playwright
@@ -310,7 +304,7 @@ with sync_playwright() as p:
310
304
 
311
305
  --------
312
306
 
313
- For choosing which Chromium browser to use, you can set command-line options:
307
+ 💡 You can set which Chromium browser to use via command-line options:
314
308
 
315
309
  ```zsh
316
310
  python SCRIPT.py --use-chromium # Use the unbranded Chromium browser
@@ -319,7 +313,13 @@ python SCRIPT.py --edge # Use Microsoft Edge
319
313
  python SCRIPT.py --brave # Use Brave browser
320
314
  ```
321
315
 
322
- (Google Chrome is the default browser if not specified.)
316
+ Google Chrome is the default browser if not specified. Only unbranded Chromium and Chrome-for-Testing are installed automatically if not already installed.
317
+
318
+ You can also set the browser via method args, eg: `cft=True`, `use_chromium=True`, `browser="edge"`, `browser="brave"`, etc. Eg:
319
+
320
+ ```python
321
+ sb = sb_cdp.Chrome(url, use_chromium=True)
322
+ ```
323
323
 
324
324
  --------
325
325
 
@@ -14,6 +14,7 @@ six>=1.17.0
14
14
  parse>=1.22.0
15
15
  parse-type>=0.6.6
16
16
  colorama>=0.4.6
17
+ psutil>=7.2.2
17
18
  pyyaml>=6.0.3
18
19
  pygments>=2.20.0
19
20
  tabcompleter>=1.4.1
@@ -139,14 +140,11 @@ Pillow>=12.2.0
139
140
  pip-system-certs==4.0
140
141
 
141
142
  [playwright]
142
- playwright>=1.58.0
143
+ playwright>=1.60.0
143
144
 
144
145
  [proxy]
145
146
  proxy.py==2.4.3
146
147
 
147
- [psutil]
148
- psutil>=7.2.2
149
-
150
148
  [pyautogui]
151
149
 
152
150
  [pyautogui:platform_system != "Linux"]
@@ -75,8 +75,8 @@ setup(
75
75
  name="seleniumbase",
76
76
  version=about["__version__"],
77
77
  description=(
78
- "Stealthy automation (via CDP Mode) that passes every bot detection "
79
- "test with any Chromium browser you want. Includes a test framework."
78
+ "A framework for stealthy Chromium automation with CDP Mode. "
79
+ "Includes CAPTCHA-bypass, E2E Testing, and a Playwright integration."
80
80
  ),
81
81
  long_description=long_description,
82
82
  long_description_content_type="text/markdown",
@@ -109,12 +109,9 @@ setup(
109
109
  "sbase",
110
110
  "web-crawling",
111
111
  "web-scraping",
112
- "scraping",
113
112
  "stealth",
114
113
  "chromium",
115
114
  "playwright",
116
- "anti-detect",
117
- "antidetect",
118
115
  "undetected",
119
116
  "bot-detection",
120
117
  "fingerprint",
@@ -185,11 +182,12 @@ setup(
185
182
  'typing-extensions>=4.15.0',
186
183
  'sbvirtualdisplay>=1.4.0',
187
184
  'MarkupSafe>=3.0.3',
188
- "Jinja2>=3.1.6",
189
- "six>=1.17.0",
185
+ 'Jinja2>=3.1.6',
186
+ 'six>=1.17.0',
190
187
  'parse>=1.22.0',
191
188
  'parse-type>=0.6.6',
192
189
  'colorama>=0.4.6',
190
+ 'psutil>=7.2.2',
193
191
  'pyyaml>=6.0.3',
194
192
  'pygments>=2.20.0',
195
193
  'pyreadline3>=3.5.4;platform_system=="Windows"',
@@ -306,11 +304,7 @@ setup(
306
304
  # pip install -e .[playwright]
307
305
  # (For the Playwright integration.)
308
306
  "playwright": [
309
- "playwright>=1.58.0",
310
- ],
311
- # pip install -e .[psutil]
312
- "psutil": [
313
- "psutil>=7.2.2",
307
+ "playwright>=1.60.0",
314
308
  ],
315
309
  # pip install -e .[pyautogui]
316
310
  # (Already a required dependency on Linux now.)
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes