seleniumbase 4.53.4__tar.gz → 4.53.5__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.5}/PKG-INFO +2 -2
  2. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/mcp_servers/server.py +67 -50
  3. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/__version__.py +1 -1
  4. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/browser_launcher.py +1 -0
  5. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/proxy_helper.py +7 -1
  6. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/sb_cdp.py +22 -1
  7. {seleniumbase-4.53.4 → seleniumbase-4.53.5/seleniumbase.egg-info}/PKG-INFO +2 -2
  8. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase.egg-info/requires.txt +1 -1
  9. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/setup.py +1 -1
  10. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/.gitignore +0 -0
  11. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/LICENSE +0 -0
  12. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/MANIFEST.in +0 -0
  13. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/README.md +0 -0
  14. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/install.sh +0 -0
  15. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/mcp_servers/__init__.py +0 -0
  16. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/pyproject.toml +0 -0
  17. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/pytest.ini +0 -0
  18. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/requirements.txt +0 -0
  19. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/sbase/__init__.py +0 -0
  20. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/sbase/__main__.py +0 -0
  21. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/sbase/steps.py +0 -0
  22. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/__init__.py +0 -0
  23. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/__main__.py +0 -0
  24. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/behave/__init__.py +0 -0
  25. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/behave/behave_helper.py +0 -0
  26. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/behave/behave_sb.py +0 -0
  27. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/behave/steps.py +0 -0
  28. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/common/__init__.py +0 -0
  29. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/common/decorators.py +0 -0
  30. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/common/encryption.py +0 -0
  31. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/common/exceptions.py +0 -0
  32. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/common/obfuscate.py +0 -0
  33. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/common/unobfuscate.py +0 -0
  34. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/config/__init__.py +0 -0
  35. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/config/ad_block_list.py +0 -0
  36. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/config/proxy_list.py +0 -0
  37. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/config/settings.py +0 -0
  38. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/console_scripts/__init__.py +0 -0
  39. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/console_scripts/logo_helper.py +0 -0
  40. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/console_scripts/rich_helper.py +0 -0
  41. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/console_scripts/run.py +0 -0
  42. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
  43. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
  44. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/console_scripts/sb_commander.py +0 -0
  45. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/console_scripts/sb_install.py +0 -0
  46. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
  47. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
  48. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
  49. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
  50. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
  51. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/console_scripts/sb_objectify.py +0 -0
  52. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/console_scripts/sb_print.py +0 -0
  53. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/console_scripts/sb_recorder.py +0 -0
  54. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/__init__.py +0 -0
  55. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/application_manager.py +0 -0
  56. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/capabilities_parser.py +0 -0
  57. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/colored_traceback.py +0 -0
  58. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/create_db_tables.sql +0 -0
  59. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/detect_b_ver.py +0 -0
  60. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/download_helper.py +0 -0
  61. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/encoded_images.py +0 -0
  62. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/jqc_helper.py +0 -0
  63. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/log_helper.py +0 -0
  64. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/mysql.py +0 -0
  65. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/nest_asyncio.py +0 -0
  66. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/recorder_helper.py +0 -0
  67. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/report_helper.py +0 -0
  68. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/s3_manager.py +0 -0
  69. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/sb_driver.py +0 -0
  70. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/session_helper.py +0 -0
  71. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/settings_parser.py +0 -0
  72. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/style_sheet.py +0 -0
  73. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/testcase_manager.py +0 -0
  74. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/tour_helper.py +0 -0
  75. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/visual_helper.py +0 -0
  76. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/drivers/__init__.py +0 -0
  77. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/drivers/brave_drivers/__init__.py +0 -0
  78. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/drivers/cft_drivers/__init__.py +0 -0
  79. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/drivers/chromium_drivers/__init__.py +0 -0
  80. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/drivers/chs_drivers/__init__.py +0 -0
  81. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/drivers/comet_drivers/__init__.py +0 -0
  82. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/drivers/opera_drivers/__init__.py +0 -0
  83. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/extensions/__init__.py +0 -0
  84. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/extensions/ad_block.zip +0 -0
  85. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/extensions/disable_csp.zip +0 -0
  86. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/extensions/recorder.zip +0 -0
  87. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/extensions/sbase_ext.zip +0 -0
  88. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/fixtures/__init__.py +0 -0
  89. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/fixtures/base_case.py +0 -0
  90. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/fixtures/constants.py +0 -0
  91. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/fixtures/css_to_xpath.py +0 -0
  92. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/fixtures/errors.py +0 -0
  93. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/fixtures/js_utils.py +0 -0
  94. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/fixtures/page_actions.py +0 -0
  95. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/fixtures/page_utils.py +0 -0
  96. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/fixtures/shared_utils.py +0 -0
  97. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/fixtures/unittest_helper.py +0 -0
  98. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/fixtures/words.py +0 -0
  99. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/fixtures/xpath_to_css.py +0 -0
  100. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/js_code/__init__.py +0 -0
  101. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/js_code/active_css_js.py +0 -0
  102. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/js_code/live_js.py +0 -0
  103. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/js_code/recorder_js.py +0 -0
  104. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/masterqa/__init__.py +0 -0
  105. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/masterqa/master_qa.py +0 -0
  106. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/plugins/__init__.py +0 -0
  107. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/plugins/base_plugin.py +0 -0
  108. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/plugins/basic_test_info.py +0 -0
  109. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
  110. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/plugins/driver_manager.py +0 -0
  111. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/plugins/page_source.py +0 -0
  112. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/plugins/pytest_plugin.py +0 -0
  113. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
  114. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/plugins/sb_manager.py +0 -0
  115. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/plugins/screen_shots.py +0 -0
  116. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/plugins/selenium_plugin.py +0 -0
  117. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/resources/__init__.py +0 -0
  118. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/translate/__init__.py +0 -0
  119. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/translate/chinese.py +0 -0
  120. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/translate/dutch.py +0 -0
  121. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/translate/french.py +0 -0
  122. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/translate/italian.py +0 -0
  123. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/translate/japanese.py +0 -0
  124. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/translate/korean.py +0 -0
  125. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/translate/master_dict.py +0 -0
  126. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/translate/portuguese.py +0 -0
  127. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/translate/russian.py +0 -0
  128. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/translate/spanish.py +0 -0
  129. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/translate/translator.py +0 -0
  130. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/undetected/__init__.py +0 -0
  131. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/undetected/cdp.py +0 -0
  132. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/undetected/cdp_driver/__init__.py +0 -0
  133. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
  134. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/undetected/cdp_driver/browser.py +0 -0
  135. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/undetected/cdp_driver/cdp_util.py +0 -0
  136. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/undetected/cdp_driver/config.py +0 -0
  137. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/undetected/cdp_driver/connection.py +0 -0
  138. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/undetected/cdp_driver/element.py +0 -0
  139. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/undetected/cdp_driver/tab.py +0 -0
  140. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/undetected/dprocess.py +0 -0
  141. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/undetected/options.py +0 -0
  142. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/undetected/patcher.py +0 -0
  143. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/undetected/reactor.py +0 -0
  144. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/undetected/webelement.py +0 -0
  145. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/utilities/__init__.py +0 -0
  146. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
  147. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
  148. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_grid/font_color +0 -0
  149. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
  150. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
  151. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
  152. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
  153. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
  154. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
  155. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
  156. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
  157. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
  158. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
  159. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase.egg-info/SOURCES.txt +0 -0
  160. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase.egg-info/dependency_links.txt +0 -0
  161. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase.egg-info/entry_points.txt +0 -0
  162. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase.egg-info/top_level.txt +0 -0
  163. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/setup.cfg +0 -0
  164. {seleniumbase-4.53.4 → seleniumbase-4.53.5}/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.5
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
@@ -30,9 +30,9 @@ Tool-selection philosophy:
30
30
  elements as structured data.
31
31
  - Use check_state for an immediate, non-waiting state check.
32
32
  - 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
33
+ - Use assert_condition when the agent needs to verify an expected condition
34
+ and treat failure as an assertion error.
35
+ - Use click/type_text/select_option/hover_with_action/focus_on for
36
36
  interactions and element positioning.
37
37
  """
38
38
  from __future__ import annotations
@@ -93,7 +93,7 @@ def start_browser(
93
93
  """Launch a persistent SeleniumBase Pure CDP Mode browser session.
94
94
 
95
95
  This must be called before browser interaction tools such as navigate,
96
- get_content, click, fill_input, or find_elements. The same browser
96
+ get_content, click, type_text, or find_elements. The same browser
97
97
  session remains active across subsequent MCP tool calls until
98
98
  close_browser is called or the server process exits.
99
99
 
@@ -277,7 +277,7 @@ def get_page_info() -> dict | str:
277
277
  - Need information about matching elements -> use find_elements.
278
278
  - Need an immediate state check -> use check_state.
279
279
  - Need to wait for a condition -> use wait_for.
280
- - Need to verify an expected condition -> use assert_that.
280
+ - Need to verify an expected condition -> use assert_condition.
281
281
 
282
282
  Unlike a dedicated browser-status tool, get_page_info is the single
283
283
  source of browser/page metadata. If no browser session is active, it
@@ -549,15 +549,26 @@ def get_attributes(
549
549
  ) -> Any:
550
550
  """Read HTML attributes from a matching element.
551
551
 
552
+ Use this tool when you need the value of one or more HTML attributes
553
+ such as href, src, value, class, id, name, type, aria-label, or data-*.
554
+
552
555
  Args:
553
556
  selector: CSS selector or SeleniumBase text-matching selector for
554
557
  the target element.
555
558
  attribute: Specific HTML attribute to retrieve. When omitted, return
556
- all available attributes as a dictionary.
559
+ all HTML attributes of the element as a dictionary.
557
560
 
558
561
  Returns:
559
562
  The requested attribute value, or a dictionary containing all
560
- attributes when attribute is omitted.
563
+ HTML attributes of the element when attribute is omitted.
564
+
565
+ Tool selection:
566
+ - Need one or more HTML attribute values from a specific element ->
567
+ use this tool.
568
+ - Need to discover multiple matching elements or inspect their text ->
569
+ use 'find_elements'.
570
+ - Need visible text or HTML content -> use 'get_content'.
571
+ - Need to check presence or visibility -> use 'check_state'.
561
572
 
562
573
  This is a read-only operation and does not modify the element.
563
574
  """
@@ -580,7 +591,7 @@ def check_state(
580
591
 
581
592
  Use this tool when you need an observation of the current state and do
582
593
  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.
594
+ For an expectation that should fail as an assertion, use assert_condition.
584
595
 
585
596
  Args:
586
597
  check:
@@ -602,7 +613,7 @@ def check_state(
602
613
  - Immediate yes/no/count observation -> use check_state.
603
614
  - Wait until a state becomes true/false -> use wait_for.
604
615
  - Verify an expected condition and fail when it is not met ->
605
- use assert_that.
616
+ use assert_condition.
606
617
 
607
618
  Note:
608
619
  Except for count's short lookup, this tool does not wait for elements
@@ -784,62 +795,64 @@ def hover_with_action(
784
795
 
785
796
  @mcp.tool()
786
797
  @handle_sb_errors
787
- def fill_input(
798
+ def type_text(
788
799
  selector: str,
789
800
  text: str = "",
790
801
  mode: Literal[
791
- "type",
802
+ "fill_input",
792
803
  "append",
793
- "set_value",
794
804
  "fast_type",
795
- "clear",
796
- ] = "type",
805
+ "set_value",
806
+ "clear_only",
807
+ ] = "fill_input",
797
808
  timeout: int | float | None = 7,
798
809
  ) -> str:
799
- """Enter, append, directly set, or clear text in a form control.
810
+ """Fill, append, fast-type, directly set, or clear a form control.
800
811
 
801
812
  Use this tool for input elements, textareas, and contenteditable elements.
802
813
 
803
814
  Args:
804
815
  selector: CSS selector or SeleniumBase selector identifying the
805
816
  input, textarea, or contenteditable element.
806
- text: Text to enter or set. Ignored when mode="clear".
817
+ text: Text to enter or set. Not used when mode="clear_only".
807
818
  mode:
808
- - "type": Clear the field and type text normally.
809
- - "append": Keep the existing value and send text as keystrokes.
819
+ - "fill_input": Clear the field and then type text normally.
820
+ - "append": Keep the existing value and add text as keystrokes.
821
+ - "fast_type": Clear the field and type text without pauses.
810
822
  - "set_value": Set the value directly and immediately. This can
811
823
  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.
824
+ key events. It can also be used to handle input sliders,
825
+ e.g. 'input[type="range"]'.
826
+ - "clear_only": Empty the text field; text is ignored.
815
827
  timeout: Maximum seconds to wait for the target element.
816
828
 
817
829
  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".
830
+ - Normal text entry to replace existing text -> mode="fill_input".
831
+ - Add text without clearing the field first -> mode="append".
832
+ - Fast typing to replace existing text -> mode="fast_type".
833
+ - Directly set a value (e.g. input slider) -> mode="set_value".
834
+ - Empty a field of all text -> mode="clear_only".
823
835
  """
824
836
  sb = _get_sb()
825
837
 
826
- if mode == "type":
838
+ if mode == "fill_input":
827
839
  sb.type(selector, text, timeout=timeout)
828
840
  elif mode == "append":
829
841
  sb.send_keys(selector, text, timeout=timeout)
830
- elif mode == "set_value":
831
- sb.set_value(selector, text, timeout=timeout)
832
842
  elif mode == "fast_type":
833
843
  sb.fast_type(selector, text, timeout=timeout)
834
- elif mode == "clear":
844
+ elif mode == "set_value":
845
+ sb.set_value(selector, text, timeout=timeout)
846
+ elif mode == "clear_only":
835
847
  sb.clear_input(selector, timeout=timeout)
836
848
  else:
837
849
  return (
838
850
  f"Error: unknown mode '{mode}'. "
839
- "Use 'type', 'append', 'set_value', 'fast_type', or 'clear'."
851
+ "Use 'fill_input', 'append', 'fast_type', "
852
+ "'set_value', or 'clear_only'."
840
853
  )
841
854
 
842
- return f"fill_input(mode={mode!r}) done for {selector}"
855
+ return f"type_text(mode={mode!r}) done for {selector}"
843
856
 
844
857
 
845
858
  @mcp.tool()
@@ -915,7 +928,7 @@ def focus_on(
915
928
  - Focus an element -> use focus_on(action="focus").
916
929
  - Highlight element for debugging -> use focus_on(action="highlight").
917
930
  - Click -> use click.
918
- - Type into a form control -> use fill_input.
931
+ - Type text into a text field -> use type_text.
919
932
  - Hover -> use hover_with_action.
920
933
  """
921
934
  sb = _get_sb()
@@ -957,7 +970,7 @@ def wait_for(
957
970
  Use this tool when the page is dynamic and an automation step must wait
958
971
  for a condition before continuing.
959
972
 
960
- Unlike check_state, this tool intentionally waits. Unlike assert_that,
973
+ Unlike check_state, this tool intentionally waits. Unlike assert_condition,
961
974
  its purpose is synchronization rather than validating a test expectation.
962
975
 
963
976
  Args:
@@ -979,7 +992,7 @@ def wait_for(
979
992
  Tool selection:
980
993
  - Check current state immediately -> use check_state.
981
994
  - Wait for a state/content transition -> use wait_for.
982
- - Verify an expected value/condition -> use assert_that.
995
+ - Verify an expected value/condition -> use assert_condition.
983
996
  """
984
997
  sb = _get_sb()
985
998
 
@@ -1009,11 +1022,11 @@ def wait_for(
1009
1022
 
1010
1023
  @mcp.tool()
1011
1024
  @handle_sb_errors
1012
- def assert_that(
1025
+ def assert_condition(
1013
1026
  check: Literal[
1014
1027
  "element_present",
1015
1028
  "element_visible",
1016
- "text",
1029
+ "text_visible",
1017
1030
  "title",
1018
1031
  "url",
1019
1032
  "url_contains",
@@ -1026,23 +1039,24 @@ def assert_that(
1026
1039
  """Verify an expected browser condition and fail when it is not met.
1027
1040
 
1028
1041
  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.
1042
+ reports the current state, assert_condition treats a failed expectation
1043
+ as an error. Unlike wait_for, URL/title checks do not wait.
1031
1044
 
1032
1045
  Args:
1033
1046
  check:
1034
1047
  - "element_present": Verify selector identifies a present element.
1035
1048
  - "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.
1049
+ - "text_visible": Verify expected text is visible within selector,
1050
+ or within the whole HTML document when selector is omitted.
1038
1051
  - "title": Verify the exact page title.
1039
1052
  - "url": Verify the exact current URL.
1040
1053
  - "url_contains": Verify that the current URL contains expected.
1041
1054
  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.
1055
+ text_visible checks.
1056
+ expected: Expected text/title/URL value for text_visible, title, url,
1057
+ and url_contains.
1058
+ exact: For check="text_visible", require exact text
1059
+ rather than a substring.
1046
1060
  timeout: Maximum seconds to wait for element/text checks.
1047
1061
 
1048
1062
  Returns:
@@ -1055,14 +1069,16 @@ def assert_that(
1055
1069
  Tool selection:
1056
1070
  - Just inspect current state -> use check_state.
1057
1071
  - Wait for a condition to become true -> use wait_for.
1058
- - Verify that an expected condition is true -> use assert_that.
1072
+ - Verify that an expected condition is true -> use assert_condition.
1059
1073
  """
1060
1074
  sb = _get_sb()
1061
1075
 
1062
1076
  if check in ("element_present", "element_visible") and selector is None:
1063
1077
  return f"Error: check='{check}' requires value for `selector`."
1064
1078
 
1065
- if check in ("text", "title", "url", "url_contains") and expected is None:
1079
+ if check in (
1080
+ "text_visible", "title", "url", "url_contains"
1081
+ ) and expected is None:
1066
1082
  return f"Error: check='{check}' requires value for `expected`."
1067
1083
 
1068
1084
  if check == "element_present":
@@ -1073,13 +1089,13 @@ def assert_that(
1073
1089
  sb.assert_element_visible(selector, timeout=timeout)
1074
1090
  return f"Confirmed {selector} is visible."
1075
1091
 
1076
- if check == "text":
1092
+ if check == "text_visible":
1077
1093
  target = selector or "html"
1078
1094
  if exact:
1079
1095
  sb.assert_exact_text(expected, target, timeout=timeout)
1080
1096
  else:
1081
1097
  sb.assert_text(expected, target, timeout=timeout)
1082
- return f"Confirmed text in {target}."
1098
+ return f"Confirmed visible text {expected} in {target}."
1083
1099
 
1084
1100
  if check == "title":
1085
1101
  sb.assert_title(expected)
@@ -1095,7 +1111,8 @@ def assert_that(
1095
1111
 
1096
1112
  return (
1097
1113
  f"Error: unknown check '{check}'. Use 'element_present', "
1098
- f"'element_visible', 'text', 'title', 'url', or 'url_contains'."
1114
+ "'element_visible', 'text_visible', 'title', 'url', "
1115
+ "or 'url_contains'."
1099
1116
  )
1100
1117
 
1101
1118
 
@@ -1,2 +1,2 @@
1
1
  # seleniumbase package
2
- __version__ = "4.53.4"
2
+ __version__ = "4.53.5"
@@ -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.5
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
File without changes
File without changes
File without changes