seleniumbase 4.49.3__tar.gz → 4.49.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. {seleniumbase-4.49.3/seleniumbase.egg-info → seleniumbase-4.49.4}/PKG-INFO +15 -12
  2. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/README.md +13 -10
  3. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/requirements.txt +1 -1
  4. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/__version__.py +1 -1
  5. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/undetected/__init__.py +3 -1
  6. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/undetected/cdp_driver/browser.py +3 -1
  7. {seleniumbase-4.49.3 → seleniumbase-4.49.4/seleniumbase.egg-info}/PKG-INFO +15 -12
  8. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase.egg-info/requires.txt +1 -1
  9. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/setup.py +1 -1
  10. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/.gitignore +0 -0
  11. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/LICENSE +0 -0
  12. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/MANIFEST.in +0 -0
  13. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/install.sh +0 -0
  14. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/pyproject.toml +0 -0
  15. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/pytest.ini +0 -0
  16. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/sbase/__init__.py +0 -0
  17. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/sbase/__main__.py +0 -0
  18. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/sbase/steps.py +0 -0
  19. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/__init__.py +0 -0
  20. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/__main__.py +0 -0
  21. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/behave/__init__.py +0 -0
  22. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/behave/behave_helper.py +0 -0
  23. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/behave/behave_sb.py +0 -0
  24. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/behave/steps.py +0 -0
  25. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/common/__init__.py +0 -0
  26. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/common/decorators.py +0 -0
  27. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/common/encryption.py +0 -0
  28. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/common/exceptions.py +0 -0
  29. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/common/obfuscate.py +0 -0
  30. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/common/unobfuscate.py +0 -0
  31. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/config/__init__.py +0 -0
  32. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/config/ad_block_list.py +0 -0
  33. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/config/proxy_list.py +0 -0
  34. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/config/settings.py +0 -0
  35. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/console_scripts/__init__.py +0 -0
  36. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/console_scripts/logo_helper.py +0 -0
  37. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/console_scripts/rich_helper.py +0 -0
  38. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/console_scripts/run.py +0 -0
  39. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
  40. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
  41. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/console_scripts/sb_commander.py +0 -0
  42. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/console_scripts/sb_install.py +0 -0
  43. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
  44. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
  45. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
  46. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
  47. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
  48. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/console_scripts/sb_objectify.py +0 -0
  49. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/console_scripts/sb_print.py +0 -0
  50. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/console_scripts/sb_recorder.py +0 -0
  51. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/core/__init__.py +0 -0
  52. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/core/application_manager.py +0 -0
  53. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/core/browser_launcher.py +0 -0
  54. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/core/capabilities_parser.py +0 -0
  55. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/core/colored_traceback.py +0 -0
  56. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/core/create_db_tables.sql +0 -0
  57. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/core/detect_b_ver.py +0 -0
  58. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/core/download_helper.py +0 -0
  59. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/core/encoded_images.py +0 -0
  60. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/core/jqc_helper.py +0 -0
  61. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/core/log_helper.py +0 -0
  62. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/core/mysql.py +0 -0
  63. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/core/nest_asyncio.py +0 -0
  64. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/core/proxy_helper.py +0 -0
  65. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/core/recorder_helper.py +0 -0
  66. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/core/report_helper.py +0 -0
  67. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/core/s3_manager.py +0 -0
  68. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/core/sb_cdp.py +0 -0
  69. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/core/sb_driver.py +0 -0
  70. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/core/session_helper.py +0 -0
  71. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/core/settings_parser.py +0 -0
  72. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/core/style_sheet.py +0 -0
  73. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/core/testcase_manager.py +0 -0
  74. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/core/tour_helper.py +0 -0
  75. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/core/visual_helper.py +0 -0
  76. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/drivers/__init__.py +0 -0
  77. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/drivers/atlas_drivers/__init__.py +0 -0
  78. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/drivers/brave_drivers/__init__.py +0 -0
  79. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/drivers/cft_drivers/__init__.py +0 -0
  80. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/drivers/chromium_drivers/__init__.py +0 -0
  81. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/drivers/chs_drivers/__init__.py +0 -0
  82. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/drivers/comet_drivers/__init__.py +0 -0
  83. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/drivers/opera_drivers/__init__.py +0 -0
  84. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/extensions/__init__.py +0 -0
  85. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/extensions/ad_block.zip +0 -0
  86. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/extensions/disable_csp.zip +0 -0
  87. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/extensions/recorder.zip +0 -0
  88. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/extensions/sbase_ext.zip +0 -0
  89. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/fixtures/__init__.py +0 -0
  90. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/fixtures/base_case.py +0 -0
  91. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/fixtures/constants.py +0 -0
  92. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/fixtures/css_to_xpath.py +0 -0
  93. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/fixtures/errors.py +0 -0
  94. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/fixtures/js_utils.py +0 -0
  95. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/fixtures/page_actions.py +0 -0
  96. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/fixtures/page_utils.py +0 -0
  97. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/fixtures/shared_utils.py +0 -0
  98. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/fixtures/unittest_helper.py +0 -0
  99. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/fixtures/words.py +0 -0
  100. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/fixtures/xpath_to_css.py +0 -0
  101. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/js_code/__init__.py +0 -0
  102. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/js_code/active_css_js.py +0 -0
  103. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/js_code/live_js.py +0 -0
  104. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/js_code/recorder_js.py +0 -0
  105. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/masterqa/__init__.py +0 -0
  106. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/masterqa/master_qa.py +0 -0
  107. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/plugins/__init__.py +0 -0
  108. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/plugins/base_plugin.py +0 -0
  109. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/plugins/basic_test_info.py +0 -0
  110. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
  111. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/plugins/driver_manager.py +0 -0
  112. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/plugins/page_source.py +0 -0
  113. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/plugins/pytest_plugin.py +0 -0
  114. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
  115. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/plugins/sb_manager.py +0 -0
  116. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/plugins/screen_shots.py +0 -0
  117. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/plugins/selenium_plugin.py +0 -0
  118. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/resources/__init__.py +0 -0
  119. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/translate/__init__.py +0 -0
  120. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/translate/chinese.py +0 -0
  121. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/translate/dutch.py +0 -0
  122. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/translate/french.py +0 -0
  123. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/translate/italian.py +0 -0
  124. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/translate/japanese.py +0 -0
  125. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/translate/korean.py +0 -0
  126. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/translate/master_dict.py +0 -0
  127. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/translate/portuguese.py +0 -0
  128. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/translate/russian.py +0 -0
  129. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/translate/spanish.py +0 -0
  130. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/translate/translator.py +0 -0
  131. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/undetected/cdp.py +0 -0
  132. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/undetected/cdp_driver/__init__.py +0 -0
  133. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
  134. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/undetected/cdp_driver/cdp_util.py +0 -0
  135. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/undetected/cdp_driver/config.py +0 -0
  136. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/undetected/cdp_driver/connection.py +0 -0
  137. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/undetected/cdp_driver/element.py +0 -0
  138. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/undetected/cdp_driver/tab.py +0 -0
  139. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/undetected/dprocess.py +0 -0
  140. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/undetected/options.py +0 -0
  141. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/undetected/patcher.py +0 -0
  142. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/undetected/reactor.py +0 -0
  143. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/undetected/webelement.py +0 -0
  144. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/utilities/__init__.py +0 -0
  145. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
  146. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
  147. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/utilities/selenium_grid/font_color +0 -0
  148. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
  149. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
  150. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
  151. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
  152. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
  153. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
  154. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
  155. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
  156. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
  157. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
  158. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase.egg-info/SOURCES.txt +0 -0
  159. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase.egg-info/dependency_links.txt +0 -0
  160. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase.egg-info/entry_points.txt +0 -0
  161. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/seleniumbase.egg-info/top_level.txt +0 -0
  162. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/setup.cfg +0 -0
  163. {seleniumbase-4.49.3 → seleniumbase-4.49.4}/virtualenv_install.sh +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: seleniumbase
3
- Version: 4.49.3
3
+ Version: 4.49.4
4
4
  Summary: A framework for stealthy Chromium automation with CDP Mode. Includes CAPTCHA-bypass, E2E Testing, and a Playwright integration.
5
5
  Home-page: https://github.com/seleniumbase/SeleniumBase
6
6
  Author: Michael Mintz
@@ -59,7 +59,7 @@ Requires-Python: >=3.9
59
59
  Description-Content-Type: text/markdown
60
60
  License-File: LICENSE
61
61
  Requires-Dist: pip>=26.0.1; python_version < "3.10"
62
- Requires-Dist: pip>=26.1.1; python_version >= "3.10"
62
+ Requires-Dist: pip>=26.1.2; python_version >= "3.10"
63
63
  Requires-Dist: packaging>=26.2
64
64
  Requires-Dist: setuptools~=70.2; python_version < "3.10"
65
65
  Requires-Dist: setuptools>=82.0.1; python_version >= "3.10"
@@ -262,7 +262,7 @@ Dynamic: summary
262
262
 
263
263
  --------
264
264
 
265
- <b>📝 Here's a Python example that uses <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md#-pure-cdp-mode-sb_cdp">Pure CDP Mode</a> (<code>sb_cdp</code>):</b><br />(It navigates to Browserscan to show it bypassing bot-detection.)
265
+ <b>📝 Here's a Python example that uses <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md#-pure-cdp-mode-sb_cdp">Pure CDP Mode</a> (<code>sb_cdp</code>):</b><br />(It navigates to Browserscan where it bypasses bot-detection.)
266
266
 
267
267
  ```python
268
268
  from seleniumbase import sb_cdp
@@ -275,7 +275,7 @@ sb.quit()
275
275
 
276
276
  <p align="center">
277
277
  <img src="https://seleniumbase.github.io/cdn/img/results_normal.jpg" width="578" alt="BrowserScan Test Results: Normal">
278
- <br><em>(All BrowserScan bot-detection checks were passed successfully.)</em>
278
+ <br><em>(All BrowserScan bot-detection checks were passed successfully.)</em></br>
279
279
  </p>
280
280
 
281
281
  <b>🎭 Here's an example script that uses <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/ReadMe.md"><span translate="no">Stealthy Playwright Mode</span></a>:</b><br />(Playwright connects to a stealthy SeleniumBase browser session.)
@@ -338,7 +338,7 @@ for element in elements:
338
338
 
339
339
  <p align="center">
340
340
  <img src="https://seleniumbase.github.io/other/sb_architecture.png" width="646" alt="Stealthy architecture flowchart">
341
- <br><em>(For maximum stealth, use <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md">CDP Mode</a>, which includes <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/ReadMe.md">Stealthy Playwright Mode</a>)</em>
341
+ <br><em>(For maximum stealth, use <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md">CDP Mode</a>, which includes <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/ReadMe.md">Stealthy Playwright Mode</a>.)</em></br>
342
342
  </p>
343
343
 
344
344
  --------
@@ -364,7 +364,7 @@ sb = sb_cdp.Chrome(url, use_chromium=True)
364
364
 
365
365
  --------
366
366
 
367
- <p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_google.py" target="_blank">This example</a> saves Google Search results with UC + CDP Mode:</b><br />(Results are saved as PDF, HTML, and PNG files)</p>
367
+ <p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_google.py" target="_blank">This example</a> saves Google Search results with UC + CDP Mode:</b><br />(Results are saved as PDF, HTML, and PNG files to <code>./latest_logs/</code>)</p>
368
368
 
369
369
  ```python
370
370
  from seleniumbase import SB
@@ -385,7 +385,7 @@ with SB(uc=True, test=True) as sb:
385
385
 
386
386
  --------
387
387
 
388
- <p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_gitlab.py" target="_blank">This example</a> bypasses Cloudflare's challenge page with UC + CDP Mode:</b></p>
388
+ <p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_gitlab.py" target="_blank">This example</a> bypasses Cloudflare's challenge page with UC + CDP Mode:</b><br />(If the Turnstile isn't bypassed automatically, <b><code>sb.solve_captcha()</code></b> handles it.)</p>
389
389
 
390
390
  ```python
391
391
  from seleniumbase import SB
@@ -403,9 +403,12 @@ with SB(uc=True, test=True, locale="en") as sb:
403
403
  sb.post_message("SeleniumBase wasn't detected", duration=4)
404
404
  ```
405
405
 
406
+ <p align="center">
406
407
  <img src="https://seleniumbase.github.io/other/cf_sec.jpg" alt="SeleniumBase" width="346"> <img src="https://seleniumbase.github.io/other/gitlab_bypass.png" alt="SeleniumBase" width="300">
408
+ <br><em>(Successfully bypassed bot-detection on a Cloudflare challenge page.)</em></br>
409
+ </p>
407
410
 
408
- (<b><code>sb.solve_captcha()</code></b> <b>handles CAPTCHAs</b> that aren't bypassed automatically.)
411
+ 💡 <b><code>sb.solve_captcha()</code></b> handles CAPTCHAs that aren't bypassed automatically.<br />(If no CAPTCHA is present on the current page, then nothing happens.)
409
412
 
410
413
  --------
411
414
 
@@ -703,10 +706,10 @@ pip install -e .
703
706
  <summary> ▶️ Here's sample output from a chromedriver download. (<b>click to expand</b>)</summary>
704
707
 
705
708
  ```zsh
706
- *** chromedriver to download = 141.0.7390.78 (Latest Stable)
709
+ *** chromedriver to download = 148.0.7778.178 (Latest Stable)
707
710
 
708
711
  Downloading chromedriver-mac-arm64.zip from:
709
- https://storage.googleapis.com/chrome-for-testing-public/141.0.7390.78/mac-arm64/chromedriver-mac-arm64.zip ...
712
+ https://storage.googleapis.com/chrome-for-testing-public/148.0.7778.178/mac-arm64/chromedriver-mac-arm64.zip ...
710
713
  Download Complete!
711
714
 
712
715
  Extracting ['chromedriver'] from chromedriver-mac-arm64.zip ...
@@ -716,8 +719,8 @@ The file [chromedriver] was saved to:
716
719
  ~/github/SeleniumBase/seleniumbase/drivers/
717
720
  chromedriver
718
721
 
719
- Making [chromedriver 141.0.7390.78] executable ...
720
- [chromedriver 141.0.7390.78] is now ready for use!
722
+ Making [chromedriver 148.0.7778.178] executable ...
723
+ [chromedriver 148.0.7778.178] is now ready for use!
721
724
  ```
722
725
 
723
726
  </details>
@@ -60,7 +60,7 @@
60
60
 
61
61
  --------
62
62
 
63
- <b>📝 Here's a Python example that uses <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md#-pure-cdp-mode-sb_cdp">Pure CDP Mode</a> (<code>sb_cdp</code>):</b><br />(It navigates to Browserscan to show it bypassing bot-detection.)
63
+ <b>📝 Here's a Python example that uses <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md#-pure-cdp-mode-sb_cdp">Pure CDP Mode</a> (<code>sb_cdp</code>):</b><br />(It navigates to Browserscan where it bypasses bot-detection.)
64
64
 
65
65
  ```python
66
66
  from seleniumbase import sb_cdp
@@ -73,7 +73,7 @@ sb.quit()
73
73
 
74
74
  <p align="center">
75
75
  <img src="https://seleniumbase.github.io/cdn/img/results_normal.jpg" width="578" alt="BrowserScan Test Results: Normal">
76
- <br><em>(All BrowserScan bot-detection checks were passed successfully.)</em>
76
+ <br><em>(All BrowserScan bot-detection checks were passed successfully.)</em></br>
77
77
  </p>
78
78
 
79
79
  <b>🎭 Here's an example script that uses <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/ReadMe.md"><span translate="no">Stealthy Playwright Mode</span></a>:</b><br />(Playwright connects to a stealthy SeleniumBase browser session.)
@@ -136,7 +136,7 @@ for element in elements:
136
136
 
137
137
  <p align="center">
138
138
  <img src="https://seleniumbase.github.io/other/sb_architecture.png" width="646" alt="Stealthy architecture flowchart">
139
- <br><em>(For maximum stealth, use <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md">CDP Mode</a>, which includes <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/ReadMe.md">Stealthy Playwright Mode</a>)</em>
139
+ <br><em>(For maximum stealth, use <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md">CDP Mode</a>, which includes <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/ReadMe.md">Stealthy Playwright Mode</a>.)</em></br>
140
140
  </p>
141
141
 
142
142
  --------
@@ -162,7 +162,7 @@ sb = sb_cdp.Chrome(url, use_chromium=True)
162
162
 
163
163
  --------
164
164
 
165
- <p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_google.py" target="_blank">This example</a> saves Google Search results with UC + CDP Mode:</b><br />(Results are saved as PDF, HTML, and PNG files)</p>
165
+ <p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_google.py" target="_blank">This example</a> saves Google Search results with UC + CDP Mode:</b><br />(Results are saved as PDF, HTML, and PNG files to <code>./latest_logs/</code>)</p>
166
166
 
167
167
  ```python
168
168
  from seleniumbase import SB
@@ -183,7 +183,7 @@ with SB(uc=True, test=True) as sb:
183
183
 
184
184
  --------
185
185
 
186
- <p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_gitlab.py" target="_blank">This example</a> bypasses Cloudflare's challenge page with UC + CDP Mode:</b></p>
186
+ <p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_gitlab.py" target="_blank">This example</a> bypasses Cloudflare's challenge page with UC + CDP Mode:</b><br />(If the Turnstile isn't bypassed automatically, <b><code>sb.solve_captcha()</code></b> handles it.)</p>
187
187
 
188
188
  ```python
189
189
  from seleniumbase import SB
@@ -201,9 +201,12 @@ with SB(uc=True, test=True, locale="en") as sb:
201
201
  sb.post_message("SeleniumBase wasn't detected", duration=4)
202
202
  ```
203
203
 
204
+ <p align="center">
204
205
  <img src="https://seleniumbase.github.io/other/cf_sec.jpg" alt="SeleniumBase" width="346"> <img src="https://seleniumbase.github.io/other/gitlab_bypass.png" alt="SeleniumBase" width="300">
206
+ <br><em>(Successfully bypassed bot-detection on a Cloudflare challenge page.)</em></br>
207
+ </p>
205
208
 
206
- (<b><code>sb.solve_captcha()</code></b> <b>handles CAPTCHAs</b> that aren't bypassed automatically.)
209
+ 💡 <b><code>sb.solve_captcha()</code></b> handles CAPTCHAs that aren't bypassed automatically.<br />(If no CAPTCHA is present on the current page, then nothing happens.)
207
210
 
208
211
  --------
209
212
 
@@ -501,10 +504,10 @@ pip install -e .
501
504
  <summary> ▶️ Here's sample output from a chromedriver download. (<b>click to expand</b>)</summary>
502
505
 
503
506
  ```zsh
504
- *** chromedriver to download = 141.0.7390.78 (Latest Stable)
507
+ *** chromedriver to download = 148.0.7778.178 (Latest Stable)
505
508
 
506
509
  Downloading chromedriver-mac-arm64.zip from:
507
- https://storage.googleapis.com/chrome-for-testing-public/141.0.7390.78/mac-arm64/chromedriver-mac-arm64.zip ...
510
+ https://storage.googleapis.com/chrome-for-testing-public/148.0.7778.178/mac-arm64/chromedriver-mac-arm64.zip ...
508
511
  Download Complete!
509
512
 
510
513
  Extracting ['chromedriver'] from chromedriver-mac-arm64.zip ...
@@ -514,8 +517,8 @@ The file [chromedriver] was saved to:
514
517
  ~/github/SeleniumBase/seleniumbase/drivers/
515
518
  chromedriver
516
519
 
517
- Making [chromedriver 141.0.7390.78] executable ...
518
- [chromedriver 141.0.7390.78] is now ready for use!
520
+ Making [chromedriver 148.0.7778.178] executable ...
521
+ [chromedriver 148.0.7778.178] is now ready for use!
519
522
  ```
520
523
 
521
524
  </details>
@@ -1,5 +1,5 @@
1
1
  pip>=26.0.1;python_version<"3.10"
2
- pip>=26.1.1;python_version>="3.10"
2
+ pip>=26.1.2;python_version>="3.10"
3
3
  packaging>=26.2
4
4
  setuptools~=70.2;python_version<"3.10"
5
5
  setuptools>=82.0.1;python_version>="3.10"
@@ -1,2 +1,2 @@
1
1
  # seleniumbase package
2
- __version__ = "4.49.3"
2
+ __version__ = "4.49.4"
@@ -305,7 +305,7 @@ class Chrome(selenium.webdriver.chrome.webdriver.WebDriver):
305
305
  self._process_create_time = (
306
306
  psutil.Process(self._process_pid).create_time()
307
307
  )
308
- except psutil.NoSuchProcess:
308
+ except (psutil.NoSuchProcess, PermissionError):
309
309
  self._process_create_time = None
310
310
  service_ = None
311
311
  log_output = subprocess.PIPE
@@ -415,6 +415,8 @@ class Chrome(selenium.webdriver.chrome.webdriver.WebDriver):
415
415
  return process.status() != psutil.STATUS_ZOMBIE
416
416
  except psutil.NoSuchProcess:
417
417
  return False
418
+ except PermissionError:
419
+ return None
418
420
 
419
421
  def remove_cdc_props_as_needed(self):
420
422
  cdc_props = self._get_cdc_props()
@@ -279,6 +279,8 @@ class Browser:
279
279
  return process.status() != psutil.STATUS_ZOMBIE
280
280
  except psutil.NoSuchProcess:
281
281
  return False
282
+ except PermissionError:
283
+ return None
282
284
 
283
285
  def get_rd_host(self):
284
286
  return self.config.host
@@ -648,7 +650,7 @@ class Browser:
648
650
  self._process_create_time = (
649
651
  psutil.Process(self._process_pid).create_time()
650
652
  )
651
- except psutil.NoSuchProcess:
653
+ except (psutil.NoSuchProcess, PermissionError):
652
654
  self._process_create_time = None
653
655
  await asyncio.sleep(0.05)
654
656
  self._http = HTTPApi((self.config.host, self.config.port))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: seleniumbase
3
- Version: 4.49.3
3
+ Version: 4.49.4
4
4
  Summary: A framework for stealthy Chromium automation with CDP Mode. Includes CAPTCHA-bypass, E2E Testing, and a Playwright integration.
5
5
  Home-page: https://github.com/seleniumbase/SeleniumBase
6
6
  Author: Michael Mintz
@@ -59,7 +59,7 @@ Requires-Python: >=3.9
59
59
  Description-Content-Type: text/markdown
60
60
  License-File: LICENSE
61
61
  Requires-Dist: pip>=26.0.1; python_version < "3.10"
62
- Requires-Dist: pip>=26.1.1; python_version >= "3.10"
62
+ Requires-Dist: pip>=26.1.2; python_version >= "3.10"
63
63
  Requires-Dist: packaging>=26.2
64
64
  Requires-Dist: setuptools~=70.2; python_version < "3.10"
65
65
  Requires-Dist: setuptools>=82.0.1; python_version >= "3.10"
@@ -262,7 +262,7 @@ Dynamic: summary
262
262
 
263
263
  --------
264
264
 
265
- <b>📝 Here's a Python example that uses <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md#-pure-cdp-mode-sb_cdp">Pure CDP Mode</a> (<code>sb_cdp</code>):</b><br />(It navigates to Browserscan to show it bypassing bot-detection.)
265
+ <b>📝 Here's a Python example that uses <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md#-pure-cdp-mode-sb_cdp">Pure CDP Mode</a> (<code>sb_cdp</code>):</b><br />(It navigates to Browserscan where it bypasses bot-detection.)
266
266
 
267
267
  ```python
268
268
  from seleniumbase import sb_cdp
@@ -275,7 +275,7 @@ sb.quit()
275
275
 
276
276
  <p align="center">
277
277
  <img src="https://seleniumbase.github.io/cdn/img/results_normal.jpg" width="578" alt="BrowserScan Test Results: Normal">
278
- <br><em>(All BrowserScan bot-detection checks were passed successfully.)</em>
278
+ <br><em>(All BrowserScan bot-detection checks were passed successfully.)</em></br>
279
279
  </p>
280
280
 
281
281
  <b>🎭 Here's an example script that uses <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/ReadMe.md"><span translate="no">Stealthy Playwright Mode</span></a>:</b><br />(Playwright connects to a stealthy SeleniumBase browser session.)
@@ -338,7 +338,7 @@ for element in elements:
338
338
 
339
339
  <p align="center">
340
340
  <img src="https://seleniumbase.github.io/other/sb_architecture.png" width="646" alt="Stealthy architecture flowchart">
341
- <br><em>(For maximum stealth, use <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md">CDP Mode</a>, which includes <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/ReadMe.md">Stealthy Playwright Mode</a>)</em>
341
+ <br><em>(For maximum stealth, use <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/ReadMe.md">CDP Mode</a>, which includes <a translate="no" href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/playwright/ReadMe.md">Stealthy Playwright Mode</a>.)</em></br>
342
342
  </p>
343
343
 
344
344
  --------
@@ -364,7 +364,7 @@ sb = sb_cdp.Chrome(url, use_chromium=True)
364
364
 
365
365
  --------
366
366
 
367
- <p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_google.py" target="_blank">This example</a> saves Google Search results with UC + CDP Mode:</b><br />(Results are saved as PDF, HTML, and PNG files)</p>
367
+ <p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_google.py" target="_blank">This example</a> saves Google Search results with UC + CDP Mode:</b><br />(Results are saved as PDF, HTML, and PNG files to <code>./latest_logs/</code>)</p>
368
368
 
369
369
  ```python
370
370
  from seleniumbase import SB
@@ -385,7 +385,7 @@ with SB(uc=True, test=True) as sb:
385
385
 
386
386
  --------
387
387
 
388
- <p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_gitlab.py" target="_blank">This example</a> bypasses Cloudflare's challenge page with UC + CDP Mode:</b></p>
388
+ <p align="left"><b>📝 <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/cdp_mode/raw_gitlab.py" target="_blank">This example</a> bypasses Cloudflare's challenge page with UC + CDP Mode:</b><br />(If the Turnstile isn't bypassed automatically, <b><code>sb.solve_captcha()</code></b> handles it.)</p>
389
389
 
390
390
  ```python
391
391
  from seleniumbase import SB
@@ -403,9 +403,12 @@ with SB(uc=True, test=True, locale="en") as sb:
403
403
  sb.post_message("SeleniumBase wasn't detected", duration=4)
404
404
  ```
405
405
 
406
+ <p align="center">
406
407
  <img src="https://seleniumbase.github.io/other/cf_sec.jpg" alt="SeleniumBase" width="346"> <img src="https://seleniumbase.github.io/other/gitlab_bypass.png" alt="SeleniumBase" width="300">
408
+ <br><em>(Successfully bypassed bot-detection on a Cloudflare challenge page.)</em></br>
409
+ </p>
407
410
 
408
- (<b><code>sb.solve_captcha()</code></b> <b>handles CAPTCHAs</b> that aren't bypassed automatically.)
411
+ 💡 <b><code>sb.solve_captcha()</code></b> handles CAPTCHAs that aren't bypassed automatically.<br />(If no CAPTCHA is present on the current page, then nothing happens.)
409
412
 
410
413
  --------
411
414
 
@@ -703,10 +706,10 @@ pip install -e .
703
706
  <summary> ▶️ Here's sample output from a chromedriver download. (<b>click to expand</b>)</summary>
704
707
 
705
708
  ```zsh
706
- *** chromedriver to download = 141.0.7390.78 (Latest Stable)
709
+ *** chromedriver to download = 148.0.7778.178 (Latest Stable)
707
710
 
708
711
  Downloading chromedriver-mac-arm64.zip from:
709
- https://storage.googleapis.com/chrome-for-testing-public/141.0.7390.78/mac-arm64/chromedriver-mac-arm64.zip ...
712
+ https://storage.googleapis.com/chrome-for-testing-public/148.0.7778.178/mac-arm64/chromedriver-mac-arm64.zip ...
710
713
  Download Complete!
711
714
 
712
715
  Extracting ['chromedriver'] from chromedriver-mac-arm64.zip ...
@@ -716,8 +719,8 @@ The file [chromedriver] was saved to:
716
719
  ~/github/SeleniumBase/seleniumbase/drivers/
717
720
  chromedriver
718
721
 
719
- Making [chromedriver 141.0.7390.78] executable ...
720
- [chromedriver 141.0.7390.78] is now ready for use!
722
+ Making [chromedriver 148.0.7778.178] executable ...
723
+ [chromedriver 148.0.7778.178] is now ready for use!
721
724
  ```
722
725
 
723
726
  </details>
@@ -68,7 +68,7 @@ markdown-it-py==3.0.0
68
68
  pytest==8.4.2
69
69
 
70
70
  [:python_version >= "3.10"]
71
- pip>=26.1.1
71
+ pip>=26.1.2
72
72
  setuptools>=82.0.1
73
73
  websockets>=16.0
74
74
  filelock>=3.29.0
@@ -162,7 +162,7 @@ setup(
162
162
  python_requires=">=3.9",
163
163
  install_requires=[
164
164
  'pip>=26.0.1;python_version<"3.10"',
165
- 'pip>=26.1.1;python_version>="3.10"',
165
+ 'pip>=26.1.2;python_version>="3.10"',
166
166
  'packaging>=26.2',
167
167
  'setuptools~=70.2;python_version<"3.10"', # Newer ones had issues
168
168
  'setuptools>=82.0.1;python_version>="3.10"',
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes