seleniumbase 4.53.4__tar.gz → 4.53.6__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (164) hide show
  1. {seleniumbase-4.53.4/seleniumbase.egg-info → seleniumbase-4.53.6}/PKG-INFO +2 -2
  2. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/mcp_servers/server.py +166 -111
  3. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/__version__.py +1 -1
  4. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/core/browser_launcher.py +1 -0
  5. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/core/proxy_helper.py +7 -1
  6. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/core/sb_cdp.py +22 -1
  7. {seleniumbase-4.53.4 → seleniumbase-4.53.6/seleniumbase.egg-info}/PKG-INFO +2 -2
  8. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase.egg-info/requires.txt +1 -1
  9. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/setup.py +1 -1
  10. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/.gitignore +0 -0
  11. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/LICENSE +0 -0
  12. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/MANIFEST.in +0 -0
  13. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/README.md +0 -0
  14. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/install.sh +0 -0
  15. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/mcp_servers/__init__.py +0 -0
  16. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/pyproject.toml +0 -0
  17. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/pytest.ini +0 -0
  18. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/requirements.txt +0 -0
  19. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/sbase/__init__.py +0 -0
  20. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/sbase/__main__.py +0 -0
  21. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/sbase/steps.py +0 -0
  22. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/__init__.py +0 -0
  23. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/__main__.py +0 -0
  24. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/behave/__init__.py +0 -0
  25. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/behave/behave_helper.py +0 -0
  26. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/behave/behave_sb.py +0 -0
  27. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/behave/steps.py +0 -0
  28. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/common/__init__.py +0 -0
  29. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/common/decorators.py +0 -0
  30. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/common/encryption.py +0 -0
  31. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/common/exceptions.py +0 -0
  32. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/common/obfuscate.py +0 -0
  33. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/common/unobfuscate.py +0 -0
  34. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/config/__init__.py +0 -0
  35. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/config/ad_block_list.py +0 -0
  36. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/config/proxy_list.py +0 -0
  37. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/config/settings.py +0 -0
  38. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/console_scripts/__init__.py +0 -0
  39. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/console_scripts/logo_helper.py +0 -0
  40. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/console_scripts/rich_helper.py +0 -0
  41. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/console_scripts/run.py +0 -0
  42. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
  43. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
  44. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/console_scripts/sb_commander.py +0 -0
  45. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/console_scripts/sb_install.py +0 -0
  46. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
  47. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
  48. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
  49. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
  50. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
  51. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/console_scripts/sb_objectify.py +0 -0
  52. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/console_scripts/sb_print.py +0 -0
  53. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/console_scripts/sb_recorder.py +0 -0
  54. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/core/__init__.py +0 -0
  55. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/core/application_manager.py +0 -0
  56. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/core/capabilities_parser.py +0 -0
  57. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/core/colored_traceback.py +0 -0
  58. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/core/create_db_tables.sql +0 -0
  59. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/core/detect_b_ver.py +0 -0
  60. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/core/download_helper.py +0 -0
  61. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/core/encoded_images.py +0 -0
  62. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/core/jqc_helper.py +0 -0
  63. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/core/log_helper.py +0 -0
  64. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/core/mysql.py +0 -0
  65. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/core/nest_asyncio.py +0 -0
  66. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/core/recorder_helper.py +0 -0
  67. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/core/report_helper.py +0 -0
  68. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/core/s3_manager.py +0 -0
  69. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/core/sb_driver.py +0 -0
  70. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/core/session_helper.py +0 -0
  71. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/core/settings_parser.py +0 -0
  72. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/core/style_sheet.py +0 -0
  73. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/core/testcase_manager.py +0 -0
  74. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/core/tour_helper.py +0 -0
  75. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/core/visual_helper.py +0 -0
  76. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/drivers/__init__.py +0 -0
  77. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/drivers/brave_drivers/__init__.py +0 -0
  78. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/drivers/cft_drivers/__init__.py +0 -0
  79. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/drivers/chromium_drivers/__init__.py +0 -0
  80. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/drivers/chs_drivers/__init__.py +0 -0
  81. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/drivers/comet_drivers/__init__.py +0 -0
  82. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/drivers/opera_drivers/__init__.py +0 -0
  83. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/extensions/__init__.py +0 -0
  84. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/extensions/ad_block.zip +0 -0
  85. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/extensions/disable_csp.zip +0 -0
  86. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/extensions/recorder.zip +0 -0
  87. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/extensions/sbase_ext.zip +0 -0
  88. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/fixtures/__init__.py +0 -0
  89. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/fixtures/base_case.py +0 -0
  90. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/fixtures/constants.py +0 -0
  91. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/fixtures/css_to_xpath.py +0 -0
  92. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/fixtures/errors.py +0 -0
  93. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/fixtures/js_utils.py +0 -0
  94. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/fixtures/page_actions.py +0 -0
  95. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/fixtures/page_utils.py +0 -0
  96. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/fixtures/shared_utils.py +0 -0
  97. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/fixtures/unittest_helper.py +0 -0
  98. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/fixtures/words.py +0 -0
  99. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/fixtures/xpath_to_css.py +0 -0
  100. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/js_code/__init__.py +0 -0
  101. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/js_code/active_css_js.py +0 -0
  102. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/js_code/live_js.py +0 -0
  103. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/js_code/recorder_js.py +0 -0
  104. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/masterqa/__init__.py +0 -0
  105. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/masterqa/master_qa.py +0 -0
  106. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/plugins/__init__.py +0 -0
  107. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/plugins/base_plugin.py +0 -0
  108. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/plugins/basic_test_info.py +0 -0
  109. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
  110. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/plugins/driver_manager.py +0 -0
  111. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/plugins/page_source.py +0 -0
  112. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/plugins/pytest_plugin.py +0 -0
  113. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
  114. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/plugins/sb_manager.py +0 -0
  115. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/plugins/screen_shots.py +0 -0
  116. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/plugins/selenium_plugin.py +0 -0
  117. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/resources/__init__.py +0 -0
  118. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/translate/__init__.py +0 -0
  119. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/translate/chinese.py +0 -0
  120. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/translate/dutch.py +0 -0
  121. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/translate/french.py +0 -0
  122. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/translate/italian.py +0 -0
  123. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/translate/japanese.py +0 -0
  124. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/translate/korean.py +0 -0
  125. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/translate/master_dict.py +0 -0
  126. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/translate/portuguese.py +0 -0
  127. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/translate/russian.py +0 -0
  128. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/translate/spanish.py +0 -0
  129. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/translate/translator.py +0 -0
  130. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/undetected/__init__.py +0 -0
  131. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/undetected/cdp.py +0 -0
  132. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/undetected/cdp_driver/__init__.py +0 -0
  133. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
  134. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/undetected/cdp_driver/browser.py +0 -0
  135. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/undetected/cdp_driver/cdp_util.py +0 -0
  136. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/undetected/cdp_driver/config.py +0 -0
  137. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/undetected/cdp_driver/connection.py +0 -0
  138. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/undetected/cdp_driver/element.py +0 -0
  139. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/undetected/cdp_driver/tab.py +0 -0
  140. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/undetected/dprocess.py +0 -0
  141. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/undetected/options.py +0 -0
  142. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/undetected/patcher.py +0 -0
  143. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/undetected/reactor.py +0 -0
  144. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/undetected/webelement.py +0 -0
  145. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/utilities/__init__.py +0 -0
  146. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
  147. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
  148. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/utilities/selenium_grid/font_color +0 -0
  149. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
  150. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
  151. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
  152. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
  153. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
  154. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
  155. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
  156. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
  157. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
  158. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
  159. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase.egg-info/SOURCES.txt +0 -0
  160. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase.egg-info/dependency_links.txt +0 -0
  161. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase.egg-info/entry_points.txt +0 -0
  162. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/seleniumbase.egg-info/top_level.txt +0 -0
  163. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/setup.cfg +0 -0
  164. {seleniumbase-4.53.4 → seleniumbase-4.53.6}/virtualenv_install.sh +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: seleniumbase
3
- Version: 4.53.4
3
+ Version: 4.53.6
4
4
  Summary: SeleniumBase is a framework for web crawling, scraping, and testing. Supports pytest. CDP Mode adds stealth. Includes many tools.
5
5
  Home-page: https://github.com/seleniumbase/SeleniumBase
6
6
  Author: Michael Mintz
@@ -155,7 +155,7 @@ Requires-Dist: pyee>=13.0.1; extra == "playwright"
155
155
  Provides-Extra: pyautogui
156
156
  Requires-Dist: PyAutoGUI>=0.9.54; platform_system != "Linux" and extra == "pyautogui"
157
157
  Provides-Extra: uv
158
- Requires-Dist: uv>=0.12.8; extra == "uv"
158
+ Requires-Dist: uv>=0.12.9; extra == "uv"
159
159
  Dynamic: author
160
160
  Dynamic: author-email
161
161
  Dynamic: classifier
@@ -23,16 +23,15 @@ access to the underlying browser-automation capabilities without
23
23
  having to choose between multiple near-identical tools.
24
24
 
25
25
  Tool-selection philosophy:
26
- - Use get_page_info for browser/page metadata such as URL, title, origin,
27
- and navigation history.
26
+ - Use get_page_info for browser/page metadata such as URL, title, or origin.
28
27
  - Use get_content for reading visible text or HTML.
29
28
  - Use find_elements for discovering and inspecting multiple matching
30
29
  elements as structured data.
31
- - Use check_state for an immediate, non-waiting state check.
30
+ - Use check_for_condition for an immediate, non-waiting state check.
32
31
  - Use wait_for when the agent needs to wait for a condition to become true.
33
- - Use assert_that when the agent needs to verify an expected condition and
34
- treat failure as an assertion error.
35
- - Use click/fill_input/select_option/hover_with_action/focus_on for
32
+ - Use assert_condition when the agent needs to verify an expected condition
33
+ and treat failure as an assertion error.
34
+ - Use click/type_text/select_option/hover_with_action/focus_on for
36
35
  interactions and element positioning.
37
36
  """
38
37
  from __future__ import annotations
@@ -93,7 +92,7 @@ def start_browser(
93
92
  """Launch a persistent SeleniumBase Pure CDP Mode browser session.
94
93
 
95
94
  This must be called before browser interaction tools such as navigate,
96
- get_content, click, fill_input, or find_elements. The same browser
95
+ get_content, click, type_text, or find_elements. The same browser
97
96
  session remains active across subsequent MCP tool calls until
98
97
  close_browser is called or the server process exits.
99
98
 
@@ -205,18 +204,33 @@ def start_browser(
205
204
  f"(url={url!r}, headless={effective_headless}, "
206
205
  f"use_chromium={use_chromium})"
207
206
  )
208
- except Exception as e:
209
- if _sb is not None:
210
- try:
211
- _sb.quit()
212
- except Exception:
213
- pass
214
- _sb = None
215
-
216
- return (
217
- f"Error starting browser: "
218
- f"{e.__class__.__name__} - {str(e).strip()}"
219
- )
207
+ except Exception:
208
+ # Retry once if the first launch attempt fails.
209
+ # (A retry helped when testing on Glama's MCP Inspector.)
210
+ try:
211
+ if _sb is not None:
212
+ try:
213
+ _sb.quit()
214
+ except Exception:
215
+ pass
216
+ _sb = None
217
+ _sb = sb_cdp.Chrome(url, **kwargs)
218
+ return (
219
+ f"Started Pure CDP Mode browser "
220
+ f"(url={url!r}, headless={effective_headless}, "
221
+ f"use_chromium={use_chromium})"
222
+ )
223
+ except Exception as e:
224
+ if _sb is not None:
225
+ try:
226
+ _sb.quit()
227
+ except Exception:
228
+ pass
229
+ _sb = None
230
+ return (
231
+ f"Error starting browser: "
232
+ f"{e.__class__.__name__} - {str(e).strip()}"
233
+ )
220
234
 
221
235
 
222
236
  @mcp.tool()
@@ -268,16 +282,14 @@ def get_page_info() -> dict | str:
268
282
  - title: The current document title.
269
283
  - origin: The current page origin (scheme, host, and port).
270
284
  - user_agent: The browser's current User-Agent string.
271
- - history: The browser navigation history for the current session.
272
285
 
273
286
  Tool selection:
274
- - Need URL, title, origin, User-Agent, or navigation history ->
275
- use get_page_info.
287
+ - Need URL, title, origin, or User-Agent -> use get_page_info.
276
288
  - Need visible page text or HTML -> use get_content.
277
289
  - Need information about matching elements -> use find_elements.
278
- - Need an immediate state check -> use check_state.
290
+ - Need an immediate state check -> use check_for_condition.
279
291
  - Need to wait for a condition -> use wait_for.
280
- - Need to verify an expected condition -> use assert_that.
292
+ - Need to verify an expected condition -> use assert_condition.
281
293
 
282
294
  Unlike a dedicated browser-status tool, get_page_info is the single
283
295
  source of browser/page metadata. If no browser session is active, it
@@ -296,7 +308,6 @@ def get_page_info() -> dict | str:
296
308
  "title": _sb.get_title(),
297
309
  "origin": _sb.get_origin(),
298
310
  "user_agent": _sb.get_user_agent(),
299
- "history": _sb.get_navigation_history(),
300
311
  }
301
312
  except Exception as e:
302
313
  return {
@@ -436,7 +447,7 @@ def find_elements(
436
447
  use get_content.
437
448
  - Need to click one of several matches -> use click with nth.
438
449
  - Need to know whether an element is present/visible ->
439
- use check_state.
450
+ use check_for_condition.
440
451
 
441
452
  Note:
442
453
  Element handles cannot be persisted across MCP calls. If you find
@@ -512,15 +523,14 @@ def get_content(
512
523
  URLs before navigating to them.
513
524
 
514
525
  Tool selection:
515
- - Need URL, title, origin, User-Agent, or navigation history ->
516
- use get_page_info.
526
+ - Need URL, title, origin, or User-Agent -> use get_page_info.
517
527
  - Need visible text -> use output_format="text".
518
528
  - Need page or element HTML -> use output_format="html".
519
529
  - Need URLs from the page or an element -> use output_format="urls".
520
530
  - Need structured information about matching elements ->
521
531
  use find_elements.
522
532
  - Need to check whether an element is present or visible ->
523
- use check_state.
533
+ use check_for_condition.
524
534
  - Need to wait for content to appear -> use wait_for.
525
535
  """
526
536
  sb = _get_sb()
@@ -549,15 +559,26 @@ def get_attributes(
549
559
  ) -> Any:
550
560
  """Read HTML attributes from a matching element.
551
561
 
562
+ Use this tool when you need the value of one or more HTML attributes
563
+ such as href, src, value, class, id, name, type, aria-label, or data-*.
564
+
552
565
  Args:
553
566
  selector: CSS selector or SeleniumBase text-matching selector for
554
567
  the target element.
555
568
  attribute: Specific HTML attribute to retrieve. When omitted, return
556
- all available attributes as a dictionary.
569
+ all HTML attributes of the element as a dictionary.
557
570
 
558
571
  Returns:
559
572
  The requested attribute value, or a dictionary containing all
560
- attributes when attribute is omitted.
573
+ HTML attributes of the element when attribute is omitted.
574
+
575
+ Tool selection:
576
+ - Need one or more HTML attribute values from a specific element ->
577
+ use this tool.
578
+ - Need to discover multiple matching elements or inspect their text ->
579
+ use 'find_elements'.
580
+ - Need visible text or HTML content -> use 'get_content'.
581
+ - Need to check presence or visibility -> use 'check_for_condition'.
561
582
 
562
583
  This is a read-only operation and does not modify the element.
563
584
  """
@@ -571,7 +592,7 @@ def get_attributes(
571
592
 
572
593
  @mcp.tool()
573
594
  @handle_sb_errors
574
- def check_state(
595
+ def check_for_condition(
575
596
  check: Literal["present", "visible", "count", "text_visible"] = "visible",
576
597
  selector: str = "body",
577
598
  text: str | None = None,
@@ -580,7 +601,7 @@ def check_state(
580
601
 
581
602
  Use this tool when you need an observation of the current state and do
582
603
  NOT want to wait for a condition. For waiting behavior, use wait_for.
583
- For an expectation that should fail as an assertion, use assert_that.
604
+ For an expectation that should fail as an assertion, use assert_condition.
584
605
 
585
606
  Args:
586
607
  check:
@@ -599,10 +620,10 @@ def check_state(
599
620
  count. Missing elements do not cause an exception for these checks.
600
621
 
601
622
  Tool selection:
602
- - Immediate yes/no/count observation -> use check_state.
623
+ - Immediate yes/no/count observation -> use check_for_condition.
603
624
  - Wait until a state becomes true/false -> use wait_for.
604
625
  - Verify an expected condition and fail when it is not met ->
605
- use assert_that.
626
+ use assert_condition.
606
627
 
607
628
  Note:
608
629
  Except for count's short lookup, this tool does not wait for elements
@@ -784,62 +805,64 @@ def hover_with_action(
784
805
 
785
806
  @mcp.tool()
786
807
  @handle_sb_errors
787
- def fill_input(
808
+ def type_text(
788
809
  selector: str,
789
810
  text: str = "",
790
811
  mode: Literal[
791
- "type",
812
+ "fill_input",
792
813
  "append",
793
- "set_value",
794
814
  "fast_type",
795
- "clear",
796
- ] = "type",
815
+ "set_value",
816
+ "clear_only",
817
+ ] = "fill_input",
797
818
  timeout: int | float | None = 7,
798
819
  ) -> str:
799
- """Enter, append, directly set, or clear text in a form control.
820
+ """Fill, append, fast-type, directly set, or clear a form control.
800
821
 
801
822
  Use this tool for input elements, textareas, and contenteditable elements.
802
823
 
803
824
  Args:
804
825
  selector: CSS selector or SeleniumBase selector identifying the
805
826
  input, textarea, or contenteditable element.
806
- text: Text to enter or set. Ignored when mode="clear".
827
+ text: Text to enter or set. Not used when mode="clear_only".
807
828
  mode:
808
- - "type": Clear the field and type text normally.
809
- - "append": Keep the existing value and send text as keystrokes.
829
+ - "fill_input": Clear the field and then type text normally.
830
+ - "append": Keep the existing value and add text as keystrokes.
831
+ - "fast_type": Clear the field and type text without pauses.
810
832
  - "set_value": Set the value directly and immediately. This can
811
833
  be useful for fast form filling but does not simulate normal
812
- key events.
813
- - "fast_type": Clear the field and type text quickly.
814
- - "clear": Empty the field; text is ignored.
834
+ key events. It can also be used to handle input sliders,
835
+ e.g. 'input[type="range"]'.
836
+ - "clear_only": Empty the text field; text is ignored.
815
837
  timeout: Maximum seconds to wait for the target element.
816
838
 
817
839
  Tool selection:
818
- - Normal human-like text entry -> mode="type".
819
- - Add text without clearing -> mode="append".
820
- - Directly set a value -> mode="set_value".
821
- - Fast typing -> mode="fast_type".
822
- - Empty a field -> mode="clear".
840
+ - Normal text entry to replace existing text -> mode="fill_input".
841
+ - Add text without clearing the field first -> mode="append".
842
+ - Fast typing to replace existing text -> mode="fast_type".
843
+ - Directly set a value (e.g. input slider) -> mode="set_value".
844
+ - Empty a field of all text -> mode="clear_only".
823
845
  """
824
846
  sb = _get_sb()
825
847
 
826
- if mode == "type":
848
+ if mode == "fill_input":
827
849
  sb.type(selector, text, timeout=timeout)
828
850
  elif mode == "append":
829
851
  sb.send_keys(selector, text, timeout=timeout)
830
- elif mode == "set_value":
831
- sb.set_value(selector, text, timeout=timeout)
832
852
  elif mode == "fast_type":
833
853
  sb.fast_type(selector, text, timeout=timeout)
834
- elif mode == "clear":
854
+ elif mode == "set_value":
855
+ sb.set_value(selector, text, timeout=timeout)
856
+ elif mode == "clear_only":
835
857
  sb.clear_input(selector, timeout=timeout)
836
858
  else:
837
859
  return (
838
860
  f"Error: unknown mode '{mode}'. "
839
- "Use 'type', 'append', 'set_value', 'fast_type', or 'clear'."
861
+ "Use 'fill_input', 'append', 'fast_type', "
862
+ "'set_value', or 'clear_only'."
840
863
  )
841
864
 
842
- return f"fill_input(mode={mode!r}) done for {selector}"
865
+ return f"type_text(mode={mode!r}) done for {selector}"
843
866
 
844
867
 
845
868
  @mcp.tool()
@@ -915,7 +938,7 @@ def focus_on(
915
938
  - Focus an element -> use focus_on(action="focus").
916
939
  - Highlight element for debugging -> use focus_on(action="highlight").
917
940
  - Click -> use click.
918
- - Type into a form control -> use fill_input.
941
+ - Type text into a text field -> use type_text.
919
942
  - Hover -> use hover_with_action.
920
943
  """
921
944
  sb = _get_sb()
@@ -957,8 +980,9 @@ def wait_for(
957
980
  Use this tool when the page is dynamic and an automation step must wait
958
981
  for a condition before continuing.
959
982
 
960
- Unlike check_state, this tool intentionally waits. Unlike assert_that,
961
- its purpose is synchronization rather than validating a test expectation.
983
+ Unlike check_for_condition, this tool intentionally waits.
984
+ Unlike assert_condition, its purpose is synchronization
985
+ rather than validating a test expectation.
962
986
 
963
987
  Args:
964
988
  state:
@@ -977,9 +1001,9 @@ def wait_for(
977
1001
  A confirmation when the requested condition is reached.
978
1002
 
979
1003
  Tool selection:
980
- - Check current state immediately -> use check_state.
1004
+ - Check current state immediately -> use check_for_condition.
981
1005
  - Wait for a state/content transition -> use wait_for.
982
- - Verify an expected value/condition -> use assert_that.
1006
+ - Verify an expected value/condition -> use assert_condition.
983
1007
  """
984
1008
  sb = _get_sb()
985
1009
 
@@ -1009,11 +1033,11 @@ def wait_for(
1009
1033
 
1010
1034
  @mcp.tool()
1011
1035
  @handle_sb_errors
1012
- def assert_that(
1036
+ def assert_condition(
1013
1037
  check: Literal[
1014
1038
  "element_present",
1015
1039
  "element_visible",
1016
- "text",
1040
+ "text_visible",
1017
1041
  "title",
1018
1042
  "url",
1019
1043
  "url_contains",
@@ -1025,24 +1049,26 @@ def assert_that(
1025
1049
  ) -> str:
1026
1050
  """Verify an expected browser condition and fail when it is not met.
1027
1051
 
1028
- Use this tool for explicit verification. Unlike check_state, which simply
1029
- reports the current state, assert_that treats a failed expectation as an
1030
- error. Unlike wait_for, URL/title checks do not wait.
1052
+ Use this tool for explicit verification. Unlike check_for_condition,
1053
+ which simply reports True or False on the current state,
1054
+ assert_condition treats a failed expectation as an error.
1055
+ Unlike wait_for, URL/title checks do not wait.
1031
1056
 
1032
1057
  Args:
1033
1058
  check:
1034
1059
  - "element_present": Verify selector identifies a present element.
1035
1060
  - "element_visible": Verify selector identifies a visible element.
1036
- - "text": Verify expected text within selector, or within the
1037
- whole HTML document when selector is omitted.
1061
+ - "text_visible": Verify expected text is visible within selector,
1062
+ or within the whole HTML document when selector is omitted.
1038
1063
  - "title": Verify the exact page title.
1039
1064
  - "url": Verify the exact current URL.
1040
1065
  - "url_contains": Verify that the current URL contains expected.
1041
1066
  selector: Element selector for element_present, element_visible, and
1042
- text checks.
1043
- expected: Expected text/title/URL value for text, title, url, and
1044
- url_contains.
1045
- exact: For check="text", require exact text rather than a substring.
1067
+ text_visible checks.
1068
+ expected: Expected text/title/URL value for text_visible, title, url,
1069
+ and url_contains.
1070
+ exact: For check="text_visible", require exact text
1071
+ rather than a substring.
1046
1072
  timeout: Maximum seconds to wait for element/text checks.
1047
1073
 
1048
1074
  Returns:
@@ -1053,16 +1079,18 @@ def assert_that(
1053
1079
  fails; the MCP error wrapper converts it to a descriptive result.
1054
1080
 
1055
1081
  Tool selection:
1056
- - Just inspect current state -> use check_state.
1082
+ - Just inspect current state -> use check_for_condition.
1057
1083
  - Wait for a condition to become true -> use wait_for.
1058
- - Verify that an expected condition is true -> use assert_that.
1084
+ - Verify that an expected condition is true -> use assert_condition.
1059
1085
  """
1060
1086
  sb = _get_sb()
1061
1087
 
1062
1088
  if check in ("element_present", "element_visible") and selector is None:
1063
1089
  return f"Error: check='{check}' requires value for `selector`."
1064
1090
 
1065
- if check in ("text", "title", "url", "url_contains") and expected is None:
1091
+ if check in (
1092
+ "text_visible", "title", "url", "url_contains"
1093
+ ) and expected is None:
1066
1094
  return f"Error: check='{check}' requires value for `expected`."
1067
1095
 
1068
1096
  if check == "element_present":
@@ -1073,13 +1101,13 @@ def assert_that(
1073
1101
  sb.assert_element_visible(selector, timeout=timeout)
1074
1102
  return f"Confirmed {selector} is visible."
1075
1103
 
1076
- if check == "text":
1104
+ if check == "text_visible":
1077
1105
  target = selector or "html"
1078
1106
  if exact:
1079
1107
  sb.assert_exact_text(expected, target, timeout=timeout)
1080
1108
  else:
1081
1109
  sb.assert_text(expected, target, timeout=timeout)
1082
- return f"Confirmed text in {target}."
1110
+ return f"Confirmed visible text {expected} in {target}."
1083
1111
 
1084
1112
  if check == "title":
1085
1113
  sb.assert_title(expected)
@@ -1095,7 +1123,8 @@ def assert_that(
1095
1123
 
1096
1124
  return (
1097
1125
  f"Error: unknown check '{check}'. Use 'element_present', "
1098
- f"'element_visible', 'text', 'title', 'url', or 'url_contains'."
1126
+ "'element_visible', 'text_visible', 'title', 'url', "
1127
+ "or 'url_contains'."
1099
1128
  )
1100
1129
 
1101
1130
 
@@ -1184,6 +1213,24 @@ def manage_storage(
1184
1213
  ) -> Any:
1185
1214
  """Get or set a key in localStorage or sessionStorage.
1186
1215
 
1216
+ Use this tool when the browser workflow needs to inspect or modify
1217
+ JavaScript Web Storage belonging to the current page origin.
1218
+
1219
+ Tool selection:
1220
+ - Need localStorage/sessionStorage -> use this tool.
1221
+ - Need cookies or authentication cookies -> use manage_cookies.
1222
+ - Need arbitrary JavaScript or storage operations not covered here ->
1223
+ use run_javascript.
1224
+ - Need visible page content or HTML -> use get_content.
1225
+ - Need an element's HTML attributes -> use get_attributes.
1226
+
1227
+ When not to use:
1228
+ - Do not use this tool for HTTP cookies; use manage_cookies instead.
1229
+ - Do not use this tool for arbitrary page JavaScript;
1230
+ use run_javascript when a higher-level tool is insufficient.
1231
+ - Do not use this tool to inspect values from another origin;
1232
+ storage is scoped to the current page origin.
1233
+
1187
1234
  Args:
1188
1235
  key: Storage key to read or modify.
1189
1236
  value: Value to store when action="set". Required for set.
@@ -1202,27 +1249,6 @@ def manage_storage(
1202
1249
  Storage belongs to the current page origin. Values from one website
1203
1250
  are not generally available to another origin.
1204
1251
  """
1205
- sb = _get_sb()
1206
-
1207
- if action not in ("get", "set"):
1208
- return "Error: action must be 'get' or 'set'."
1209
-
1210
- if action == "set" and value is None:
1211
- return "Error: value is required when action='set'."
1212
-
1213
- if storage == "local":
1214
- if action == "get":
1215
- return sb.get_local_storage_item(key)
1216
- sb.set_local_storage_item(key, value)
1217
- return f"Set localStorage[{key!r}]"
1218
-
1219
- if storage == "session":
1220
- if action == "get":
1221
- return sb.get_session_storage_item(key)
1222
- sb.set_session_storage_item(key, value)
1223
- return f"Set sessionStorage[{key!r}]"
1224
-
1225
- return f"Error: unknown storage '{storage}'. Use 'local' or 'session'."
1226
1252
 
1227
1253
 
1228
1254
  # ---------------------------------------------------------------------------
@@ -1436,8 +1462,8 @@ def solve_captcha() -> str:
1436
1462
  1. Inspect the page with get_content when you need to determine
1437
1463
  whether CAPTCHA-related controls are present.
1438
1464
  2. Call solve_captcha to attempt the interaction.
1439
- 3. Use get_page_info, get_content, check_state, or manage_cookies
1440
- to inspect resulting page/session state.
1465
+ 3. Use get_page_info, get_content, check_for_condition,
1466
+ or manage_cookies to inspect resulting page/session state.
1441
1467
 
1442
1468
  Returns:
1443
1469
  A message confirming that the CAPTCHA interaction was attempted, not
@@ -1504,22 +1530,51 @@ def save_output(
1504
1530
  @mcp.tool()
1505
1531
  @handle_sb_errors
1506
1532
  def run_javascript(expression: str) -> Any:
1507
- """Evaluate arbitrary JavaScript in the current page context.
1533
+ """Evaluate a JavaScript expression in the current page context.
1508
1534
 
1509
1535
  Use this only when the required browser operation cannot be accomplished
1510
1536
  through the higher-level SeleniumBase tools.
1511
1537
 
1512
- The expression is evaluated through the Chrome DevTools Protocol
1513
- Runtime.evaluate mechanism. Promise results are awaited and values are
1514
- returned by value.
1538
+ The expression is evaluated through Chrome DevTools Protocol
1539
+ Runtime.evaluate in the currently active page. It executes with access
1540
+ to the page's JavaScript context, including DOM APIs, browser storage,
1541
+ and other same-origin page resources available to JavaScript.
1542
+
1543
+ Tool selection:
1544
+ - Prefer click, type_text, select_option, hover_with_action,
1545
+ focus_on, scroll, and other higher-level tools for normal browser
1546
+ interactions.
1547
+ - Prefer get_content, get_attributes, and find_elements for reading
1548
+ page content or element information.
1549
+ - Prefer manage_storage for ordinary localStorage/sessionStorage
1550
+ reads and writes.
1551
+ - Prefer manage_cookies for browser cookie operations.
1552
+ - Use this tool when a required operation needs arbitrary JavaScript
1553
+ that the higher-level tools do not expose.
1515
1554
 
1516
1555
  Args:
1517
- expression: JavaScript expression to evaluate in the current page
1518
- context.
1556
+ expression: A JavaScript expression or executable JavaScript code
1557
+ evaluated in the current page. It may reference standard browser
1558
+ globals such as document and window and may use DOM APIs.
1559
+
1560
+ Examples:
1561
+ - "document.title"
1562
+ - "document.querySelector('button')?.textContent"
1563
+ - "localStorage.getItem('theme')"
1564
+ - "document.body.classList.contains('dark')"
1565
+ - "document.querySelector('#slider').value = '50'"
1566
+
1567
+ The expression should produce a value when a result is needed.
1568
+ JavaScript that returns a Promise is supported and its resolved
1569
+ value is returned.
1519
1570
 
1520
1571
  Returns:
1521
- The JavaScript evaluation result when it can be represented across
1522
- the MCP boundary.
1572
+ The JavaScript evaluation result when it can be serialized and
1573
+ returned across the MCP boundary. Primitive values, arrays, plain
1574
+ objects, and null are generally suitable return values. DOM objects,
1575
+ functions, symbols, and other non-serializable JavaScript values may
1576
+ not be returned directly; extract the needed property or convert the
1577
+ value to a serializable form first.
1523
1578
 
1524
1579
  Security:
1525
1580
  This provides unrestricted JavaScript execution in the current browser
@@ -1,2 +1,2 @@
1
1
  # seleniumbase package
2
- __version__ = "4.53.4"
2
+ __version__ = "4.53.6"
@@ -821,6 +821,7 @@ def uc_open_with_cdp_mode(driver, url=None, **kwargs):
821
821
  cdp.remove_from_dom = CDPM.remove_from_dom
822
822
  cdp.remove_elements = CDPM.remove_elements
823
823
  cdp.send_keys = CDPM.send_keys
824
+ cdp.fast_keys = CDPM.fast_keys
824
825
  cdp.press_keys = CDPM.press_keys
825
826
  cdp.type = CDPM.type
826
827
  cdp.fast_type = CDPM.fast_type
@@ -185,6 +185,9 @@ def validate_proxy_string(proxy_string, keep_scheme=False):
185
185
  val_ip = re.match(
186
186
  r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:\d+$", proxy_string
187
187
  )
188
+ HOSTNAME_PATTERN = (
189
+ re.compile(r"^[a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?$")
190
+ )
188
191
  if not val_ip:
189
192
  if proxy_string.startswith("http://"):
190
193
  proxy_string = proxy_string.split("http://")[1]
@@ -200,7 +203,10 @@ def validate_proxy_string(proxy_string, keep_scheme=False):
200
203
  chunks = proxy_string.split(":")
201
204
  if len(chunks) == 2:
202
205
  if re.match(r"^\d+$", chunks[1]):
203
- if page_utils.is_valid_url("http://" + proxy_string):
206
+ if (
207
+ page_utils.is_valid_url("http://" + proxy_string)
208
+ or HOSTNAME_PATTERN.match(chunks[0])
209
+ ):
204
210
  valid = True
205
211
  elif len(chunks) == 3:
206
212
  if re.match(r"^\d+$", chunks[2]):
@@ -1280,6 +1280,26 @@ class CDPMethods():
1280
1280
  self.__slow_mode_pause_if_set()
1281
1281
  self.loop.run_until_complete(self.page.sleep(0.025))
1282
1282
 
1283
+ def fast_keys(self, selector, text, timeout=None):
1284
+ """Similar to send_keys(), but presses keys at full speed.
1285
+ This method DOES NOT clear the text field before pressing."""
1286
+ if not timeout:
1287
+ timeout = settings.SMALL_TIMEOUT
1288
+ self.__slow_mode_pause_if_set()
1289
+ element = self.select(selector, timeout=timeout)
1290
+ element.scroll_into_view()
1291
+ if text.endswith("\n") or text.endswith("\r"):
1292
+ text = text[:-1] + "\r\n"
1293
+ elif (
1294
+ element.tag_name == "textarea"
1295
+ and "\n" in text
1296
+ and "\r" not in text
1297
+ ):
1298
+ text = text.replace("\n", "\r")
1299
+ element.send_keys(text, fast=True)
1300
+ self.__slow_mode_pause_if_set()
1301
+ self.loop.run_until_complete(self.page.sleep(0.025))
1302
+
1283
1303
  def press_keys(self, selector, text, timeout=None):
1284
1304
  """Similar to send_keys(), but presses keys at human speed."""
1285
1305
  if not timeout:
@@ -1313,7 +1333,8 @@ class CDPMethods():
1313
1333
  self.loop.run_until_complete(self.page.sleep(0.025))
1314
1334
 
1315
1335
  def fast_type(self, selector, text, timeout=None):
1316
- """Similar to send_keys(), but presses keys really fast.
1336
+ """Similar to type(), but presses keys at full speed.
1337
+ This method clears the text field before typing.
1317
1338
  (Don't use if going for stealth. This is just for speed.)"""
1318
1339
  if not timeout:
1319
1340
  timeout = settings.SMALL_TIMEOUT
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: seleniumbase
3
- Version: 4.53.4
3
+ Version: 4.53.6
4
4
  Summary: SeleniumBase is a framework for web crawling, scraping, and testing. Supports pytest. CDP Mode adds stealth. Includes many tools.
5
5
  Home-page: https://github.com/seleniumbase/SeleniumBase
6
6
  Author: Michael Mintz
@@ -155,7 +155,7 @@ Requires-Dist: pyee>=13.0.1; extra == "playwright"
155
155
  Provides-Extra: pyautogui
156
156
  Requires-Dist: PyAutoGUI>=0.9.54; platform_system != "Linux" and extra == "pyautogui"
157
157
  Provides-Extra: uv
158
- Requires-Dist: uv>=0.12.8; extra == "uv"
158
+ Requires-Dist: uv>=0.12.9; extra == "uv"
159
159
  Dynamic: author
160
160
  Dynamic: author-email
161
161
  Dynamic: classifier
@@ -121,4 +121,4 @@ proxy.py==2.4.3
121
121
  PyAutoGUI>=0.9.54
122
122
 
123
123
  [uv]
124
- uv>=0.12.8
124
+ uv>=0.12.9
@@ -303,7 +303,7 @@ setup(
303
303
  # Required for local MCP server debugging with:
304
304
  # mcp dev server.py
305
305
  "uv": [
306
- "uv>=0.12.8"
306
+ "uv>=0.12.9"
307
307
  ],
308
308
  },
309
309
  packages=[
File without changes
File without changes
File without changes
File without changes