seleniumbase 4.35.3__tar.gz → 4.35.7__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 (155) hide show
  1. {seleniumbase-4.35.3/seleniumbase.egg-info → seleniumbase-4.35.7}/PKG-INFO +12 -10
  2. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/README.md +5 -4
  3. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/requirements.txt +6 -5
  4. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/__version__.py +1 -1
  5. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/core/browser_launcher.py +44 -2
  6. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/core/sb_cdp.py +45 -1
  7. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/fixtures/base_case.py +41 -6
  8. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/plugins/driver_manager.py +17 -0
  9. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/plugins/sb_manager.py +17 -0
  10. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/undetected/__init__.py +1 -0
  11. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/undetected/cdp_driver/browser.py +1 -1
  12. {seleniumbase-4.35.3 → seleniumbase-4.35.7/seleniumbase.egg-info}/PKG-INFO +12 -10
  13. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase.egg-info/requires.txt +6 -5
  14. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/setup.py +6 -5
  15. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/.gitignore +0 -0
  16. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/LICENSE +0 -0
  17. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/MANIFEST.in +0 -0
  18. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/install.sh +0 -0
  19. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/pyproject.toml +0 -0
  20. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/pytest.ini +0 -0
  21. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/sbase/__init__.py +0 -0
  22. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/sbase/__main__.py +0 -0
  23. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/sbase/steps.py +0 -0
  24. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/__init__.py +0 -0
  25. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/__main__.py +0 -0
  26. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/behave/__init__.py +0 -0
  27. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/behave/behave_helper.py +0 -0
  28. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/behave/behave_sb.py +0 -0
  29. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/behave/steps.py +0 -0
  30. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/common/__init__.py +0 -0
  31. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/common/decorators.py +0 -0
  32. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/common/encryption.py +0 -0
  33. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/common/exceptions.py +0 -0
  34. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/common/obfuscate.py +0 -0
  35. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/common/unobfuscate.py +0 -0
  36. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/config/__init__.py +0 -0
  37. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/config/ad_block_list.py +0 -0
  38. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/config/proxy_list.py +0 -0
  39. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/config/settings.py +0 -0
  40. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/console_scripts/__init__.py +0 -0
  41. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/console_scripts/logo_helper.py +0 -0
  42. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/console_scripts/rich_helper.py +0 -0
  43. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/console_scripts/run.py +0 -0
  44. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
  45. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
  46. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/console_scripts/sb_commander.py +0 -0
  47. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/console_scripts/sb_install.py +0 -0
  48. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
  49. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
  50. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
  51. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
  52. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
  53. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/console_scripts/sb_objectify.py +0 -0
  54. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/console_scripts/sb_print.py +0 -0
  55. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/console_scripts/sb_recorder.py +0 -0
  56. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/core/__init__.py +0 -0
  57. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/core/application_manager.py +0 -0
  58. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/core/capabilities_parser.py +0 -0
  59. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/core/colored_traceback.py +0 -0
  60. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/core/create_db_tables.sql +0 -0
  61. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/core/detect_b_ver.py +0 -0
  62. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/core/download_helper.py +0 -0
  63. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/core/encoded_images.py +0 -0
  64. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/core/jqc_helper.py +0 -0
  65. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/core/log_helper.py +0 -0
  66. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/core/mysql.py +0 -0
  67. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/core/proxy_helper.py +0 -0
  68. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/core/recorder_helper.py +0 -0
  69. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/core/report_helper.py +0 -0
  70. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/core/s3_manager.py +0 -0
  71. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/core/sb_driver.py +0 -0
  72. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/core/session_helper.py +0 -0
  73. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/core/settings_parser.py +0 -0
  74. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/core/style_sheet.py +0 -0
  75. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/core/testcase_manager.py +0 -0
  76. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/core/tour_helper.py +0 -0
  77. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/core/visual_helper.py +0 -0
  78. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/drivers/__init__.py +0 -0
  79. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/extensions/__init__.py +0 -0
  80. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/extensions/ad_block.zip +0 -0
  81. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/extensions/disable_csp.zip +0 -0
  82. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/extensions/recorder.zip +0 -0
  83. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/extensions/sbase_ext.zip +0 -0
  84. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/fixtures/__init__.py +0 -0
  85. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/fixtures/constants.py +0 -0
  86. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/fixtures/css_to_xpath.py +0 -0
  87. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/fixtures/errors.py +0 -0
  88. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/fixtures/js_utils.py +0 -0
  89. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/fixtures/page_actions.py +0 -0
  90. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/fixtures/page_utils.py +0 -0
  91. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/fixtures/shared_utils.py +0 -0
  92. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/fixtures/unittest_helper.py +0 -0
  93. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/fixtures/words.py +0 -0
  94. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/fixtures/xpath_to_css.py +0 -0
  95. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/js_code/__init__.py +0 -0
  96. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/js_code/active_css_js.py +0 -0
  97. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/js_code/live_js.py +0 -0
  98. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/js_code/recorder_js.py +0 -0
  99. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/masterqa/__init__.py +0 -0
  100. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/masterqa/master_qa.py +0 -0
  101. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/plugins/__init__.py +0 -0
  102. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/plugins/base_plugin.py +0 -0
  103. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/plugins/basic_test_info.py +0 -0
  104. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
  105. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/plugins/page_source.py +0 -0
  106. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/plugins/pytest_plugin.py +0 -0
  107. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
  108. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/plugins/screen_shots.py +0 -0
  109. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/plugins/selenium_plugin.py +0 -0
  110. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/resources/__init__.py +0 -0
  111. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/translate/__init__.py +0 -0
  112. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/translate/chinese.py +0 -0
  113. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/translate/dutch.py +0 -0
  114. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/translate/french.py +0 -0
  115. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/translate/italian.py +0 -0
  116. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/translate/japanese.py +0 -0
  117. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/translate/korean.py +0 -0
  118. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/translate/master_dict.py +0 -0
  119. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/translate/portuguese.py +0 -0
  120. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/translate/russian.py +0 -0
  121. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/translate/spanish.py +0 -0
  122. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/translate/translator.py +0 -0
  123. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/undetected/cdp.py +0 -0
  124. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/undetected/cdp_driver/__init__.py +0 -0
  125. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
  126. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/undetected/cdp_driver/cdp_util.py +0 -0
  127. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/undetected/cdp_driver/config.py +0 -0
  128. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/undetected/cdp_driver/connection.py +0 -0
  129. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/undetected/cdp_driver/element.py +0 -0
  130. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/undetected/cdp_driver/tab.py +0 -0
  131. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/undetected/dprocess.py +0 -0
  132. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/undetected/options.py +0 -0
  133. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/undetected/patcher.py +0 -0
  134. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/undetected/reactor.py +0 -0
  135. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/undetected/webelement.py +0 -0
  136. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/utilities/__init__.py +0 -0
  137. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
  138. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
  139. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/utilities/selenium_grid/font_color +0 -0
  140. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
  141. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
  142. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
  143. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
  144. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
  145. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
  146. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
  147. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
  148. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
  149. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
  150. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase.egg-info/SOURCES.txt +0 -0
  151. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase.egg-info/dependency_links.txt +0 -0
  152. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase.egg-info/entry_points.txt +0 -0
  153. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/seleniumbase.egg-info/top_level.txt +0 -0
  154. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/setup.cfg +0 -0
  155. {seleniumbase-4.35.3 → seleniumbase-4.35.7}/virtualenv_install.sh +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: seleniumbase
3
- Version: 4.35.3
3
+ Version: 4.35.7
4
4
  Summary: A complete web automation framework for end-to-end testing.
5
5
  Home-page: https://github.com/seleniumbase/SeleniumBase
6
6
  Author: Michael Mintz
@@ -62,24 +62,24 @@ License-File: LICENSE
62
62
  Requires-Dist: pip>=25.0.1
63
63
  Requires-Dist: packaging>=24.2
64
64
  Requires-Dist: setuptools~=70.2; python_version < "3.10"
65
- Requires-Dist: setuptools>=75.8.2; python_version >= "3.10"
65
+ Requires-Dist: setuptools>=76.0.0; python_version >= "3.10"
66
66
  Requires-Dist: wheel>=0.45.1
67
67
  Requires-Dist: attrs>=25.1.0
68
68
  Requires-Dist: certifi>=2025.1.31
69
69
  Requires-Dist: exceptiongroup>=1.2.2
70
70
  Requires-Dist: websockets~=13.1; python_version < "3.9"
71
- Requires-Dist: websockets>=15.0; python_version >= "3.9"
71
+ Requires-Dist: websockets>=15.0.1; python_version >= "3.9"
72
72
  Requires-Dist: filelock~=3.16.1; python_version < "3.9"
73
73
  Requires-Dist: filelock>=3.17.0; python_version >= "3.9"
74
74
  Requires-Dist: fasteners>=0.19
75
- Requires-Dist: mycdp>=1.1.0
75
+ Requires-Dist: mycdp>=1.1.1
76
76
  Requires-Dist: pynose>=1.5.4
77
77
  Requires-Dist: platformdirs>=4.3.6
78
78
  Requires-Dist: typing-extensions>=4.12.2
79
79
  Requires-Dist: sbvirtualdisplay>=1.4.0
80
80
  Requires-Dist: MarkupSafe==2.1.5; python_version < "3.9"
81
81
  Requires-Dist: MarkupSafe>=3.0.2; python_version >= "3.9"
82
- Requires-Dist: Jinja2>=3.1.5
82
+ Requires-Dist: Jinja2>=3.1.6
83
83
  Requires-Dist: six>=1.17.0
84
84
  Requires-Dist: parse>=1.20.2
85
85
  Requires-Dist: parse-type>=0.6.4
@@ -105,7 +105,8 @@ Requires-Dist: wsproto==1.2.0
105
105
  Requires-Dist: websocket-client==1.8.0
106
106
  Requires-Dist: selenium==4.27.1; python_version < "3.9"
107
107
  Requires-Dist: selenium==4.29.0; python_version >= "3.9"
108
- Requires-Dist: cssselect==1.2.0
108
+ Requires-Dist: cssselect==1.2.0; python_version < "3.9"
109
+ Requires-Dist: cssselect==1.3.0; python_version >= "3.9"
109
110
  Requires-Dist: sortedcontainers==2.4.0
110
111
  Requires-Dist: execnet==2.1.1
111
112
  Requires-Dist: iniconfig==2.0.0
@@ -205,7 +206,6 @@ Dynamic: summary
205
206
 
206
207
  <p align="center"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/super_logo_sb3.png" alt="SeleniumBase" title="SeleniumBase" width="350" /></a></p>
207
208
 
208
-
209
209
  <p align="center" class="hero__title"><b>All-in-one Browser Automation Framework:<br />Web Crawling / Testing / Scraping / Stealth</b></p>
210
210
 
211
211
  <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://github.com/seleniumbase/SeleniumBase/releases" target="_blank"><img src="https://img.shields.io/github/v/release/seleniumbase/SeleniumBase.svg?color=22AAEE" alt="GitHub version" /></a> <a href="https://seleniumbase.io"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg" alt="SeleniumBase Docs" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/actions" target="_blank"><img src="https://github.com/seleniumbase/SeleniumBase/workflows/CI%20build/badge.svg" alt="SeleniumBase GitHub Actions" /></a> <a href="https://discord.gg/EdhQTn3EyE" target="_blank"><img src="https://img.shields.io/badge/join-discord-infomational" alt="Join the SeleniumBase chat on Discord"/></a></p>
@@ -248,7 +248,9 @@ Dynamic: summary
248
248
  <br />
249
249
  </p>
250
250
 
251
- <p>SeleniumBase is the professional toolkit for web automation activities. Built for testing websites, bypassing CAPTCHAs, enhancing productivity, completing tasks, and scaling your business.</p>
251
+ <p align="center"><a href="https://trendshift.io/repositories/12493" target="_blank"><img src="https://trendshift.io/api/badge/repositories/12493" alt="seleniumbase%2FSeleniumBase | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a></p>
252
+
253
+ <p>SeleniumBase is the professional toolkit for web automation. Built for testing websites, bypassing CAPTCHAs, completing tasks, and scaling your business.</p>
252
254
 
253
255
  --------
254
256
 
@@ -275,7 +277,7 @@ with SB(test=True, uc=True) as sb:
275
277
 
276
278
  > `python raw_google.py`
277
279
 
278
- <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_google.py"><img src="https://seleniumbase.github.io/cdn/gif/google_search.gif" alt="SeleniumBase Test" title="SeleniumBase Test" width="420" /></a>
280
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_google.py"><img src="https://seleniumbase.github.io/cdn/gif/google_search.gif" alt="SeleniumBase Test" title="SeleniumBase Test" width="480" /></a>
279
281
 
280
282
  --------
281
283
 
@@ -1587,5 +1589,5 @@ pytest --reruns=1 --reruns-delay=1
1587
1589
  <div><a href="https://seleniumbase.io"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg" alt="SeleniumBase Docs" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/LICENSE"><img src="https://img.shields.io/badge/license-MIT-22BBCC.svg" title="SeleniumBase" /></a></div>
1588
1590
  <div><a href="https://github.com/seleniumbase/SeleniumBase"><img src="https://img.shields.io/badge/tested%20with-SeleniumBase-04C38E.svg" alt="Tested with SeleniumBase" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/stargazers"><img src="https://img.shields.io/github/stars/seleniumbase/seleniumbase.svg?color=19A57B" title="Stargazers" /></a></div>
1589
1591
  <div><a href="https://hellogithub.com/repository/c6be2d0f1969448697683d11a4ff915e" target="_blank"><img src="https://abroad.hellogithub.com/v1/widgets/recommend.svg?rid=c6be2d0f1969448697683d11a4ff915e&claim_uid=xcrm4p9j3d6JCO5&theme=small" alt="Featured|HelloGitHub" /></a> <a href="https://discord.gg/EdhQTn3EyE" target="_blank"><img src="https://img.shields.io/badge/join-discord-infomational" alt="Join the SeleniumBase chat on Discord"/></a> <a href="https://gitter.im/seleniumbase/SeleniumBase" target="_blank"><img src="https://img.shields.io/gitter/room/seleniumbase/SeleniumBase.svg" alt="Gitter chat"/></a></div>
1590
- <div><a href="https://pepy.tech/project/seleniumbase" target="_blank"><img src="https://static.pepy.tech/badge/seleniumbase" alt="SeleniumBase PyPI downloads" /></a> <img src="https://views.whatilearened.today/views/github/seleniumbase/SeleniumBase.svg" width="98px" height="20px" alt="Views" /></div>
1592
+ <div><a href="https://pepy.tech/projects/seleniumbase?timeRange=threeMonths&category=version&includeCIDownloads=true&granularity=daily&viewType=line&versions=*" target="_blank"><img src="https://static.pepy.tech/badge/seleniumbase" alt="SeleniumBase PyPI downloads" /></a> <img src="https://views.whatilearened.today/views/github/seleniumbase/SeleniumBase.svg" width="98px" height="20px" alt="Views" /></div>
1591
1593
  <div align="left"></div>
@@ -11,7 +11,6 @@
11
11
 
12
12
  <p align="center"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/super_logo_sb3.png" alt="SeleniumBase" title="SeleniumBase" width="350" /></a></p>
13
13
 
14
-
15
14
  <p align="center" class="hero__title"><b>All-in-one Browser Automation Framework:<br />Web Crawling / Testing / Scraping / Stealth</b></p>
16
15
 
17
16
  <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://github.com/seleniumbase/SeleniumBase/releases" target="_blank"><img src="https://img.shields.io/github/v/release/seleniumbase/SeleniumBase.svg?color=22AAEE" alt="GitHub version" /></a> <a href="https://seleniumbase.io"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg" alt="SeleniumBase Docs" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/actions" target="_blank"><img src="https://github.com/seleniumbase/SeleniumBase/workflows/CI%20build/badge.svg" alt="SeleniumBase GitHub Actions" /></a> <a href="https://discord.gg/EdhQTn3EyE" target="_blank"><img src="https://img.shields.io/badge/join-discord-infomational" alt="Join the SeleniumBase chat on Discord"/></a></p>
@@ -54,7 +53,9 @@
54
53
  <br />
55
54
  </p>
56
55
 
57
- <p>SeleniumBase is the professional toolkit for web automation activities. Built for testing websites, bypassing CAPTCHAs, enhancing productivity, completing tasks, and scaling your business.</p>
56
+ <p align="center"><a href="https://trendshift.io/repositories/12493" target="_blank"><img src="https://trendshift.io/api/badge/repositories/12493" alt="seleniumbase%2FSeleniumBase | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a></p>
57
+
58
+ <p>SeleniumBase is the professional toolkit for web automation. Built for testing websites, bypassing CAPTCHAs, completing tasks, and scaling your business.</p>
58
59
 
59
60
  --------
60
61
 
@@ -81,7 +82,7 @@ with SB(test=True, uc=True) as sb:
81
82
 
82
83
  > `python raw_google.py`
83
84
 
84
- <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_google.py"><img src="https://seleniumbase.github.io/cdn/gif/google_search.gif" alt="SeleniumBase Test" title="SeleniumBase Test" width="420" /></a>
85
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_google.py"><img src="https://seleniumbase.github.io/cdn/gif/google_search.gif" alt="SeleniumBase Test" title="SeleniumBase Test" width="480" /></a>
85
86
 
86
87
  --------
87
88
 
@@ -1393,5 +1394,5 @@ pytest --reruns=1 --reruns-delay=1
1393
1394
  <div><a href="https://seleniumbase.io"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg" alt="SeleniumBase Docs" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/LICENSE"><img src="https://img.shields.io/badge/license-MIT-22BBCC.svg" title="SeleniumBase" /></a></div>
1394
1395
  <div><a href="https://github.com/seleniumbase/SeleniumBase"><img src="https://img.shields.io/badge/tested%20with-SeleniumBase-04C38E.svg" alt="Tested with SeleniumBase" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/stargazers"><img src="https://img.shields.io/github/stars/seleniumbase/seleniumbase.svg?color=19A57B" title="Stargazers" /></a></div>
1395
1396
  <div><a href="https://hellogithub.com/repository/c6be2d0f1969448697683d11a4ff915e" target="_blank"><img src="https://abroad.hellogithub.com/v1/widgets/recommend.svg?rid=c6be2d0f1969448697683d11a4ff915e&claim_uid=xcrm4p9j3d6JCO5&theme=small" alt="Featured|HelloGitHub" /></a> <a href="https://discord.gg/EdhQTn3EyE" target="_blank"><img src="https://img.shields.io/badge/join-discord-infomational" alt="Join the SeleniumBase chat on Discord"/></a> <a href="https://gitter.im/seleniumbase/SeleniumBase" target="_blank"><img src="https://img.shields.io/gitter/room/seleniumbase/SeleniumBase.svg" alt="Gitter chat"/></a></div>
1396
- <div><a href="https://pepy.tech/project/seleniumbase" target="_blank"><img src="https://static.pepy.tech/badge/seleniumbase" alt="SeleniumBase PyPI downloads" /></a> <img src="https://views.whatilearened.today/views/github/seleniumbase/SeleniumBase.svg" width="98px" height="20px" alt="Views" /></div>
1397
+ <div><a href="https://pepy.tech/projects/seleniumbase?timeRange=threeMonths&category=version&includeCIDownloads=true&granularity=daily&viewType=line&versions=*" target="_blank"><img src="https://static.pepy.tech/badge/seleniumbase" alt="SeleniumBase PyPI downloads" /></a> <img src="https://views.whatilearened.today/views/github/seleniumbase/SeleniumBase.svg" width="98px" height="20px" alt="Views" /></div>
1397
1398
  <div align="left"></div>
@@ -1,24 +1,24 @@
1
1
  pip>=25.0.1
2
2
  packaging>=24.2
3
3
  setuptools~=70.2;python_version<"3.10"
4
- setuptools>=75.8.2;python_version>="3.10"
4
+ setuptools>=76.0.0;python_version>="3.10"
5
5
  wheel>=0.45.1
6
6
  attrs>=25.1.0
7
7
  certifi>=2025.1.31
8
8
  exceptiongroup>=1.2.2
9
9
  websockets~=13.1;python_version<"3.9"
10
- websockets>=15.0;python_version>="3.9"
10
+ websockets>=15.0.1;python_version>="3.9"
11
11
  filelock~=3.16.1;python_version<"3.9"
12
12
  filelock>=3.17.0;python_version>="3.9"
13
13
  fasteners>=0.19
14
- mycdp>=1.1.0
14
+ mycdp>=1.1.1
15
15
  pynose>=1.5.4
16
16
  platformdirs>=4.3.6
17
17
  typing-extensions>=4.12.2
18
18
  sbvirtualdisplay>=1.4.0
19
19
  MarkupSafe==2.1.5;python_version<"3.9"
20
20
  MarkupSafe>=3.0.2;python_version>="3.9"
21
- Jinja2>=3.1.5
21
+ Jinja2>=3.1.6
22
22
  six>=1.17.0
23
23
  parse>=1.20.2
24
24
  parse-type>=0.6.4
@@ -44,7 +44,8 @@ wsproto==1.2.0
44
44
  websocket-client==1.8.0
45
45
  selenium==4.27.1;python_version<"3.9"
46
46
  selenium==4.29.0;python_version>="3.9"
47
- cssselect==1.2.0
47
+ cssselect==1.2.0;python_version<"3.9"
48
+ cssselect==1.3.0;python_version>="3.9"
48
49
  sortedcontainers==2.4.0
49
50
  execnet==2.1.1
50
51
  iniconfig==2.0.0
@@ -1,2 +1,2 @@
1
1
  # seleniumbase package
2
- __version__ = "4.35.3"
2
+ __version__ = "4.35.7"
@@ -662,6 +662,7 @@ def uc_open_with_cdp_mode(driver, url=None):
662
662
  cdp.press_keys = CDPM.press_keys
663
663
  cdp.type = CDPM.type
664
664
  cdp.set_value = CDPM.set_value
665
+ cdp.submit = CDPM.submit
665
666
  cdp.evaluate = CDPM.evaluate
666
667
  cdp.js_dumps = CDPM.js_dumps
667
668
  cdp.maximize = CDPM.maximize
@@ -670,6 +671,8 @@ def uc_open_with_cdp_mode(driver, url=None):
670
671
  cdp.set_window_rect = CDPM.set_window_rect
671
672
  cdp.reset_window_size = CDPM.reset_window_size
672
673
  cdp.set_locale = CDPM.set_locale
674
+ cdp.set_local_storage_item = CDPM.set_local_storage_item
675
+ cdp.set_session_storage_item = CDPM.set_session_storage_item
673
676
  cdp.set_attributes = CDPM.set_attributes
674
677
  cdp.gui_press_key = CDPM.gui_press_key
675
678
  cdp.gui_press_keys = CDPM.gui_press_keys
@@ -682,8 +685,10 @@ def uc_open_with_cdp_mode(driver, url=None):
682
685
  cdp.gui_hover_element = CDPM.gui_hover_element
683
686
  cdp.gui_hover_and_click = CDPM.gui_hover_and_click
684
687
  cdp.internalize_links = CDPM.internalize_links
688
+ cdp.open_new_window = CDPM.open_new_window
685
689
  cdp.switch_to_window = CDPM.switch_to_window
686
690
  cdp.switch_to_newest_window = CDPM.switch_to_newest_window
691
+ cdp.open_new_tab = CDPM.open_new_tab
687
692
  cdp.switch_to_tab = CDPM.switch_to_tab
688
693
  cdp.switch_to_newest_tab = CDPM.switch_to_newest_tab
689
694
  cdp.close_active_tab = CDPM.close_active_tab
@@ -703,6 +708,8 @@ def uc_open_with_cdp_mode(driver, url=None):
703
708
  cdp.get_user_agent = CDPM.get_user_agent
704
709
  cdp.get_cookie_string = CDPM.get_cookie_string
705
710
  cdp.get_locale_code = CDPM.get_locale_code
711
+ cdp.get_local_storage_item = CDPM.get_local_storage_item
712
+ cdp.get_session_storage_item = CDPM.get_session_storage_item
706
713
  cdp.get_text = CDPM.get_text
707
714
  cdp.get_title = CDPM.get_title
708
715
  cdp.get_page_title = CDPM.get_title
@@ -1286,6 +1293,13 @@ def _uc_gui_click_captcha(
1286
1293
  and driver.is_element_present("form div:not(:has(*))")
1287
1294
  ):
1288
1295
  frame = "form div:not(:has(*))"
1296
+ elif (
1297
+ driver.is_element_present('[src*="/turnstile/"]')
1298
+ and driver.is_element_present(
1299
+ "body > div#check > div:not([class])"
1300
+ )
1301
+ ):
1302
+ frame = "body > div#check > div:not([class])"
1289
1303
  elif driver.is_element_present(".cf-turnstile-wrapper"):
1290
1304
  frame = ".cf-turnstile-wrapper"
1291
1305
  elif driver.is_element_present(
@@ -1317,15 +1331,36 @@ def _uc_gui_click_captcha(
1317
1331
  driver.cdp.evaluate(script)
1318
1332
  else:
1319
1333
  driver.execute_script(script)
1334
+ elif (
1335
+ driver.is_element_present("form")
1336
+ and (
1337
+ driver.is_element_present('form div[style*="center"]')
1338
+ or driver.is_element_present('form div[style*="right"]')
1339
+ )
1340
+ ):
1341
+ script = (
1342
+ """var $elements = document.querySelectorAll(
1343
+ 'form[style], form div[style]');
1344
+ var index = 0, length = $elements.length;
1345
+ for(; index < length; index++){
1346
+ the_style = $elements[index].getAttribute('style');
1347
+ new_style = the_style.replaceAll('center', 'left');
1348
+ new_style = new_style.replaceAll('right', 'left');
1349
+ $elements[index].setAttribute('style', new_style);}"""
1350
+ )
1351
+ if __is_cdp_swap_needed(driver):
1352
+ driver.cdp.evaluate(script)
1353
+ else:
1354
+ driver.execute_script(script)
1320
1355
  elif (
1321
1356
  driver.is_element_present("form")
1322
1357
  and driver.is_element_present(
1323
- "form.turnstile #turnstile-widget > div:not([class])"
1358
+ 'form [id*="turnstile"] > div:not([class])'
1324
1359
  )
1325
1360
  ):
1326
1361
  script = (
1327
1362
  """var $elements = document.querySelectorAll(
1328
- 'form.turnstile #turnstile-widget');
1363
+ 'form [id*="turnstile"]');
1329
1364
  var index = 0, length = $elements.length;
1330
1365
  for(; index < length; index++){
1331
1366
  $elements[index].setAttribute('align', 'left');}"""
@@ -1575,6 +1610,13 @@ def _uc_gui_handle_captcha_(driver, frame="iframe", ctype=None):
1575
1610
  ):
1576
1611
  frame = "form div:not(:has(*))"
1577
1612
  tab_up_first = True
1613
+ elif (
1614
+ driver.is_element_present('[src*="/turnstile/"]')
1615
+ and driver.is_element_present(
1616
+ "body > div#check > div:not([class])"
1617
+ )
1618
+ ):
1619
+ frame = "body > div#check > div:not([class])"
1578
1620
  else:
1579
1621
  return
1580
1622
  else:
@@ -106,7 +106,7 @@ class CDPMethods():
106
106
  driver = self.driver
107
107
  if hasattr(driver, "cdp_base"):
108
108
  driver = driver.cdp_base
109
- self.page = self.loop.run_until_complete(driver.get(url))
109
+ self.loop.run_until_complete(self.page.get(url))
110
110
  url_protocol = url.split(":")[0]
111
111
  safe_url = True
112
112
  if url_protocol not in ["about", "data", "chrome"]:
@@ -955,6 +955,20 @@ class CDPMethods():
955
955
  self.__slow_mode_pause_if_set()
956
956
  self.loop.run_until_complete(self.page.sleep(0.025))
957
957
 
958
+ def submit(self, selector):
959
+ submit_script = (
960
+ """elm = document.querySelector('%s');
961
+ const event = new KeyboardEvent("keydown", {
962
+ key: "Enter",
963
+ keyCode: 13,
964
+ code: "Enter",
965
+ which: 13,
966
+ bubbles: true
967
+ });
968
+ elm.dispatchEvent(event);""" % selector
969
+ )
970
+ self.loop.run_until_complete(self.page.evaluate(submit_script))
971
+
958
972
  def evaluate(self, expression):
959
973
  """Run a JavaScript expression and return the result."""
960
974
  expression = expression.strip()
@@ -1014,12 +1028,22 @@ class CDPMethods():
1014
1028
  self.set_window_rect(x, y, width, height)
1015
1029
  self.__add_light_pause()
1016
1030
 
1031
+ def open_new_window(self, url=None, switch_to=True):
1032
+ return self.open_new_tab(url=url, switch_to=switch_to)
1033
+
1017
1034
  def switch_to_window(self, window):
1018
1035
  self.switch_to_tab(window)
1019
1036
 
1020
1037
  def switch_to_newest_window(self):
1021
1038
  self.switch_to_tab(-1)
1022
1039
 
1040
+ def open_new_tab(self, url=None, switch_to=True):
1041
+ if not isinstance(url, str):
1042
+ url = "about:blank"
1043
+ self.loop.run_until_complete(self.page.get(url, new_tab=True))
1044
+ if switch_to:
1045
+ self.switch_to_newest_tab()
1046
+
1023
1047
  def switch_to_tab(self, tab):
1024
1048
  driver = self.driver
1025
1049
  if hasattr(driver, "cdp_base"):
@@ -1105,6 +1129,16 @@ class CDPMethods():
1105
1129
  self.page.evaluate("navigator.language || navigator.languages[0]")
1106
1130
  )
1107
1131
 
1132
+ def get_local_storage_item(self, key):
1133
+ js_code = """localStorage.getItem('%s');""" % key
1134
+ with suppress(Exception):
1135
+ return self.loop.run_until_complete(self.page.evaluate(js_code))
1136
+
1137
+ def get_session_storage_item(self, key):
1138
+ js_code = """sessionStorage.getItem('%s');""" % key
1139
+ with suppress(Exception):
1140
+ return self.loop.run_until_complete(self.page.evaluate(js_code))
1141
+
1108
1142
  def get_screen_rect(self):
1109
1143
  coordinates = self.loop.run_until_complete(
1110
1144
  self.page.js_dumps("window.screen")
@@ -1292,6 +1326,16 @@ class CDPMethods():
1292
1326
  """(Settings will take effect on the next page load)"""
1293
1327
  self.loop.run_until_complete(self.page.set_locale(locale))
1294
1328
 
1329
+ def set_local_storage_item(self, key, value):
1330
+ js_code = """localStorage.setItem('%s','%s');""" % (key, value)
1331
+ with suppress(Exception):
1332
+ self.loop.run_until_complete(self.page.evaluate(js_code))
1333
+
1334
+ def set_session_storage_item(self, key, value):
1335
+ js_code = """sessionStorage.setItem('%s','%s');""" % (key, value)
1336
+ with suppress(Exception):
1337
+ self.loop.run_until_complete(self.page.evaluate(js_code))
1338
+
1295
1339
  def set_attributes(self, selector, attribute, value):
1296
1340
  """This method uses JavaScript to set/update a common attribute.
1297
1341
  All matching selectors from querySelectorAll() are used.
@@ -1164,6 +1164,9 @@ class BaseCase(unittest.TestCase):
1164
1164
  """Alternative to self.driver.find_element_by_*(SELECTOR).submit()"""
1165
1165
  self.__check_scope()
1166
1166
  selector, by = self.__recalculate_selector(selector, by)
1167
+ if self.__is_cdp_swap_needed():
1168
+ self.cdp.submit(selector)
1169
+ return
1167
1170
  element = self.wait_for_element_clickable(
1168
1171
  selector, by=by, timeout=settings.SMALL_TIMEOUT
1169
1172
  )
@@ -3896,6 +3899,9 @@ class BaseCase(unittest.TestCase):
3896
3899
 
3897
3900
  def open_new_window(self, switch_to=True):
3898
3901
  """Opens a new browser tab/window and switches to it by default."""
3902
+ if self.__is_cdp_swap_needed():
3903
+ self.cdp.open_new_tab(switch_to=switch_to)
3904
+ return
3899
3905
  self.wait_for_ready_state_complete()
3900
3906
  if switch_to:
3901
3907
  try:
@@ -8067,10 +8073,6 @@ class BaseCase(unittest.TestCase):
8067
8073
  else:
8068
8074
  found = False
8069
8075
  message = entry["message"]
8070
- if message.count(" - Failed to load resource") == 1:
8071
- message = message.split(
8072
- " - Failed to load resource"
8073
- )[0]
8074
8076
  for substring in exclude:
8075
8077
  substring = str(substring)
8076
8078
  if (
@@ -8088,7 +8090,30 @@ class BaseCase(unittest.TestCase):
8088
8090
  u_c_t_e = " Uncaught TypeError: "
8089
8091
  if f_t_l_r in errors[n]["message"]:
8090
8092
  url = errors[n]["message"].split(f_t_l_r)[0]
8091
- errors[n] = {"Error 404 (broken link)": url}
8093
+ if "status of 400" in errors[n]["message"]:
8094
+ errors[n] = {"Error 400 (Bad Request)": url}
8095
+ elif "status of 401" in errors[n]["message"]:
8096
+ errors[n] = {"Error 401 (Unauthorized)": url}
8097
+ elif "status of 402" in errors[n]["message"]:
8098
+ errors[n] = {"Error 402 (Payment Required)": url}
8099
+ elif "status of 403" in errors[n]["message"]:
8100
+ errors[n] = {"Error 403 (Forbidden)": url}
8101
+ elif "status of 404" in errors[n]["message"]:
8102
+ errors[n] = {"Error 404 (Not Found)": url}
8103
+ elif "status of 405" in errors[n]["message"]:
8104
+ errors[n] = {"Error 405 (Method Not Allowed)": url}
8105
+ elif "status of 406" in errors[n]["message"]:
8106
+ errors[n] = {"Error 406 (Not Acceptable)": url}
8107
+ elif "status of 407" in errors[n]["message"]:
8108
+ errors[n] = {"Error 407 (Proxy Auth Required)": url}
8109
+ elif "status of 408" in errors[n]["message"]:
8110
+ errors[n] = {"Error 408 (Request Timeout)": url}
8111
+ elif "status of 409" in errors[n]["message"]:
8112
+ errors[n] = {"Error 409 (Conflict)": url}
8113
+ elif "status of 410" in errors[n]["message"]:
8114
+ errors[n] = {"Error 410 (Gone)": url}
8115
+ else:
8116
+ errors[n] = {"Failed to load resource": url}
8092
8117
  elif u_c_s_e in errors[n]["message"]:
8093
8118
  url = errors[n]["message"].split(u_c_s_e)[0]
8094
8119
  error = errors[n]["message"].split(u_c_s_e)[1]
@@ -8778,6 +8803,9 @@ class BaseCase(unittest.TestCase):
8778
8803
  self.__check_scope()
8779
8804
  if not self.__is_valid_storage_url():
8780
8805
  raise WebDriverException("Local Storage is not available here!")
8806
+ if self.__is_cdp_swap_needed():
8807
+ self.cdp.set_local_storage_item(key, value)
8808
+ return
8781
8809
  self.execute_script(
8782
8810
  "window.localStorage.setItem('{}', '{}');".format(key, value)
8783
8811
  )
@@ -8786,6 +8814,8 @@ class BaseCase(unittest.TestCase):
8786
8814
  self.__check_scope()
8787
8815
  if not self.__is_valid_storage_url():
8788
8816
  raise WebDriverException("Local Storage is not available here!")
8817
+ if self.__is_cdp_swap_needed():
8818
+ return self.cdp.get_local_storage_item(key)
8789
8819
  return self.execute_script(
8790
8820
  "return window.localStorage.getItem('{}');".format(key)
8791
8821
  )
@@ -8837,6 +8867,9 @@ class BaseCase(unittest.TestCase):
8837
8867
  self.__check_scope()
8838
8868
  if not self.__is_valid_storage_url():
8839
8869
  raise WebDriverException("Session Storage is not available here!")
8870
+ if self.__is_cdp_swap_needed():
8871
+ self.cdp.set_session_storage_item(key, value)
8872
+ return
8840
8873
  self.execute_script(
8841
8874
  "window.sessionStorage.setItem('{}', '{}');".format(key, value)
8842
8875
  )
@@ -8845,6 +8878,8 @@ class BaseCase(unittest.TestCase):
8845
8878
  self.__check_scope()
8846
8879
  if not self.__is_valid_storage_url():
8847
8880
  raise WebDriverException("Session Storage is not available here!")
8881
+ if self.__is_cdp_swap_needed():
8882
+ return self.cdp.get_session_storage_item(key)
8848
8883
  return self.execute_script(
8849
8884
  "return window.sessionStorage.getItem('{}');".format(key)
8850
8885
  )
@@ -10339,7 +10374,7 @@ class BaseCase(unittest.TestCase):
10339
10374
  timeout = self.__get_new_timeout(timeout)
10340
10375
  selector, by = self.__recalculate_selector(selector, by)
10341
10376
  if self.__is_cdp_swap_needed():
10342
- return self.cdp.wait_for_text(
10377
+ return self.cdp.wait_for_text_not_visible(
10343
10378
  text, selector=selector, timeout=timeout
10344
10379
  )
10345
10380
  return page_actions.wait_for_text_not_visible(
@@ -781,6 +781,23 @@ def Driver(
781
781
  swiftshader = False
782
782
  if locale is not None and locale_code is None:
783
783
  locale_code = locale
784
+ if locale_code is None:
785
+ if '--locale="' in arg_join:
786
+ locale_code = (
787
+ arg_join.split('--locale="')[1].split('"')[0]
788
+ )
789
+ elif '--locale=' in arg_join:
790
+ locale_code = (
791
+ arg_join.split('--locale=')[1].split(' ')[0]
792
+ )
793
+ elif '--locale-code="' in arg_join:
794
+ locale_code = (
795
+ arg_join.split('--locale-code="')[1].split('"')[0]
796
+ )
797
+ elif '--locale-code=' in arg_join:
798
+ locale_code = (
799
+ arg_join.split('--locale-code=')[1].split(' ')[0]
800
+ )
784
801
  if ad_block is not None and ad_block_on is None:
785
802
  ad_block_on = ad_block
786
803
  if ad_block_on is None:
@@ -942,6 +942,23 @@ def SB(
942
942
  swiftshader = False
943
943
  if locale is not None and locale_code is None:
944
944
  locale_code = locale
945
+ if locale_code is None:
946
+ if '--locale="' in arg_join:
947
+ locale_code = (
948
+ arg_join.split('--locale="')[1].split('"')[0]
949
+ )
950
+ elif '--locale=' in arg_join:
951
+ locale_code = (
952
+ arg_join.split('--locale=')[1].split(' ')[0]
953
+ )
954
+ elif '--locale-code="' in arg_join:
955
+ locale_code = (
956
+ arg_join.split('--locale-code="')[1].split('"')[0]
957
+ )
958
+ elif '--locale-code=' in arg_join:
959
+ locale_code = (
960
+ arg_join.split('--locale-code=')[1].split(' ')[0]
961
+ )
945
962
  if ad_block is not None and ad_block_on is None:
946
963
  ad_block_on = ad_block
947
964
  if ad_block_on is None:
@@ -477,6 +477,7 @@ class Chrome(selenium.webdriver.chrome.webdriver.WebDriver):
477
477
  with suppress(Exception):
478
478
  if self.service.is_connectable():
479
479
  self.stop_client()
480
+ time.sleep(0.003)
480
481
  self.service.stop()
481
482
  self._is_connected = False
482
483
 
@@ -792,7 +792,7 @@ class CookieJar:
792
792
  connection = self._browser.connection
793
793
  cookies = await connection.send(cdp.network.get_cookies())
794
794
  if cookies:
795
- await connection.send(cdp.network.clear_cookies())
795
+ await connection.send(cdp.storage.clear_cookies())
796
796
 
797
797
 
798
798
  class HTTPApi:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: seleniumbase
3
- Version: 4.35.3
3
+ Version: 4.35.7
4
4
  Summary: A complete web automation framework for end-to-end testing.
5
5
  Home-page: https://github.com/seleniumbase/SeleniumBase
6
6
  Author: Michael Mintz
@@ -62,24 +62,24 @@ License-File: LICENSE
62
62
  Requires-Dist: pip>=25.0.1
63
63
  Requires-Dist: packaging>=24.2
64
64
  Requires-Dist: setuptools~=70.2; python_version < "3.10"
65
- Requires-Dist: setuptools>=75.8.2; python_version >= "3.10"
65
+ Requires-Dist: setuptools>=76.0.0; python_version >= "3.10"
66
66
  Requires-Dist: wheel>=0.45.1
67
67
  Requires-Dist: attrs>=25.1.0
68
68
  Requires-Dist: certifi>=2025.1.31
69
69
  Requires-Dist: exceptiongroup>=1.2.2
70
70
  Requires-Dist: websockets~=13.1; python_version < "3.9"
71
- Requires-Dist: websockets>=15.0; python_version >= "3.9"
71
+ Requires-Dist: websockets>=15.0.1; python_version >= "3.9"
72
72
  Requires-Dist: filelock~=3.16.1; python_version < "3.9"
73
73
  Requires-Dist: filelock>=3.17.0; python_version >= "3.9"
74
74
  Requires-Dist: fasteners>=0.19
75
- Requires-Dist: mycdp>=1.1.0
75
+ Requires-Dist: mycdp>=1.1.1
76
76
  Requires-Dist: pynose>=1.5.4
77
77
  Requires-Dist: platformdirs>=4.3.6
78
78
  Requires-Dist: typing-extensions>=4.12.2
79
79
  Requires-Dist: sbvirtualdisplay>=1.4.0
80
80
  Requires-Dist: MarkupSafe==2.1.5; python_version < "3.9"
81
81
  Requires-Dist: MarkupSafe>=3.0.2; python_version >= "3.9"
82
- Requires-Dist: Jinja2>=3.1.5
82
+ Requires-Dist: Jinja2>=3.1.6
83
83
  Requires-Dist: six>=1.17.0
84
84
  Requires-Dist: parse>=1.20.2
85
85
  Requires-Dist: parse-type>=0.6.4
@@ -105,7 +105,8 @@ Requires-Dist: wsproto==1.2.0
105
105
  Requires-Dist: websocket-client==1.8.0
106
106
  Requires-Dist: selenium==4.27.1; python_version < "3.9"
107
107
  Requires-Dist: selenium==4.29.0; python_version >= "3.9"
108
- Requires-Dist: cssselect==1.2.0
108
+ Requires-Dist: cssselect==1.2.0; python_version < "3.9"
109
+ Requires-Dist: cssselect==1.3.0; python_version >= "3.9"
109
110
  Requires-Dist: sortedcontainers==2.4.0
110
111
  Requires-Dist: execnet==2.1.1
111
112
  Requires-Dist: iniconfig==2.0.0
@@ -205,7 +206,6 @@ Dynamic: summary
205
206
 
206
207
  <p align="center"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/super_logo_sb3.png" alt="SeleniumBase" title="SeleniumBase" width="350" /></a></p>
207
208
 
208
-
209
209
  <p align="center" class="hero__title"><b>All-in-one Browser Automation Framework:<br />Web Crawling / Testing / Scraping / Stealth</b></p>
210
210
 
211
211
  <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://github.com/seleniumbase/SeleniumBase/releases" target="_blank"><img src="https://img.shields.io/github/v/release/seleniumbase/SeleniumBase.svg?color=22AAEE" alt="GitHub version" /></a> <a href="https://seleniumbase.io"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg" alt="SeleniumBase Docs" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/actions" target="_blank"><img src="https://github.com/seleniumbase/SeleniumBase/workflows/CI%20build/badge.svg" alt="SeleniumBase GitHub Actions" /></a> <a href="https://discord.gg/EdhQTn3EyE" target="_blank"><img src="https://img.shields.io/badge/join-discord-infomational" alt="Join the SeleniumBase chat on Discord"/></a></p>
@@ -248,7 +248,9 @@ Dynamic: summary
248
248
  <br />
249
249
  </p>
250
250
 
251
- <p>SeleniumBase is the professional toolkit for web automation activities. Built for testing websites, bypassing CAPTCHAs, enhancing productivity, completing tasks, and scaling your business.</p>
251
+ <p align="center"><a href="https://trendshift.io/repositories/12493" target="_blank"><img src="https://trendshift.io/api/badge/repositories/12493" alt="seleniumbase%2FSeleniumBase | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a></p>
252
+
253
+ <p>SeleniumBase is the professional toolkit for web automation. Built for testing websites, bypassing CAPTCHAs, completing tasks, and scaling your business.</p>
252
254
 
253
255
  --------
254
256
 
@@ -275,7 +277,7 @@ with SB(test=True, uc=True) as sb:
275
277
 
276
278
  > `python raw_google.py`
277
279
 
278
- <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_google.py"><img src="https://seleniumbase.github.io/cdn/gif/google_search.gif" alt="SeleniumBase Test" title="SeleniumBase Test" width="420" /></a>
280
+ <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_google.py"><img src="https://seleniumbase.github.io/cdn/gif/google_search.gif" alt="SeleniumBase Test" title="SeleniumBase Test" width="480" /></a>
279
281
 
280
282
  --------
281
283
 
@@ -1587,5 +1589,5 @@ pytest --reruns=1 --reruns-delay=1
1587
1589
  <div><a href="https://seleniumbase.io"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg" alt="SeleniumBase Docs" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/blob/master/LICENSE"><img src="https://img.shields.io/badge/license-MIT-22BBCC.svg" title="SeleniumBase" /></a></div>
1588
1590
  <div><a href="https://github.com/seleniumbase/SeleniumBase"><img src="https://img.shields.io/badge/tested%20with-SeleniumBase-04C38E.svg" alt="Tested with SeleniumBase" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/stargazers"><img src="https://img.shields.io/github/stars/seleniumbase/seleniumbase.svg?color=19A57B" title="Stargazers" /></a></div>
1589
1591
  <div><a href="https://hellogithub.com/repository/c6be2d0f1969448697683d11a4ff915e" target="_blank"><img src="https://abroad.hellogithub.com/v1/widgets/recommend.svg?rid=c6be2d0f1969448697683d11a4ff915e&claim_uid=xcrm4p9j3d6JCO5&theme=small" alt="Featured|HelloGitHub" /></a> <a href="https://discord.gg/EdhQTn3EyE" target="_blank"><img src="https://img.shields.io/badge/join-discord-infomational" alt="Join the SeleniumBase chat on Discord"/></a> <a href="https://gitter.im/seleniumbase/SeleniumBase" target="_blank"><img src="https://img.shields.io/gitter/room/seleniumbase/SeleniumBase.svg" alt="Gitter chat"/></a></div>
1590
- <div><a href="https://pepy.tech/project/seleniumbase" target="_blank"><img src="https://static.pepy.tech/badge/seleniumbase" alt="SeleniumBase PyPI downloads" /></a> <img src="https://views.whatilearened.today/views/github/seleniumbase/SeleniumBase.svg" width="98px" height="20px" alt="Views" /></div>
1592
+ <div><a href="https://pepy.tech/projects/seleniumbase?timeRange=threeMonths&category=version&includeCIDownloads=true&granularity=daily&viewType=line&versions=*" target="_blank"><img src="https://static.pepy.tech/badge/seleniumbase" alt="SeleniumBase PyPI downloads" /></a> <img src="https://views.whatilearened.today/views/github/seleniumbase/SeleniumBase.svg" width="98px" height="20px" alt="Views" /></div>
1591
1593
  <div align="left"></div>