seleniumbase 4.53.3__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.3/seleniumbase.egg-info → seleniumbase-4.53.5}/PKG-INFO +3 -3
  2. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/mcp_servers/server.py +152 -109
  3. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/requirements.txt +1 -1
  4. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/__version__.py +1 -1
  5. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/browser_launcher.py +1 -0
  6. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/proxy_helper.py +7 -1
  7. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/sb_cdp.py +22 -1
  8. {seleniumbase-4.53.3 → seleniumbase-4.53.5/seleniumbase.egg-info}/PKG-INFO +3 -3
  9. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase.egg-info/requires.txt +2 -2
  10. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/setup.py +2 -2
  11. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/.gitignore +0 -0
  12. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/LICENSE +0 -0
  13. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/MANIFEST.in +0 -0
  14. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/README.md +0 -0
  15. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/install.sh +0 -0
  16. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/mcp_servers/__init__.py +0 -0
  17. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/pyproject.toml +0 -0
  18. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/pytest.ini +0 -0
  19. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/sbase/__init__.py +0 -0
  20. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/sbase/__main__.py +0 -0
  21. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/sbase/steps.py +0 -0
  22. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/__init__.py +0 -0
  23. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/__main__.py +0 -0
  24. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/behave/__init__.py +0 -0
  25. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/behave/behave_helper.py +0 -0
  26. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/behave/behave_sb.py +0 -0
  27. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/behave/steps.py +0 -0
  28. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/common/__init__.py +0 -0
  29. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/common/decorators.py +0 -0
  30. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/common/encryption.py +0 -0
  31. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/common/exceptions.py +0 -0
  32. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/common/obfuscate.py +0 -0
  33. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/common/unobfuscate.py +0 -0
  34. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/config/__init__.py +0 -0
  35. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/config/ad_block_list.py +0 -0
  36. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/config/proxy_list.py +0 -0
  37. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/config/settings.py +0 -0
  38. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/console_scripts/__init__.py +0 -0
  39. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/console_scripts/logo_helper.py +0 -0
  40. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/console_scripts/rich_helper.py +0 -0
  41. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/console_scripts/run.py +0 -0
  42. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
  43. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
  44. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/console_scripts/sb_commander.py +0 -0
  45. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/console_scripts/sb_install.py +0 -0
  46. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
  47. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
  48. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
  49. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
  50. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
  51. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/console_scripts/sb_objectify.py +0 -0
  52. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/console_scripts/sb_print.py +0 -0
  53. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/console_scripts/sb_recorder.py +0 -0
  54. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/__init__.py +0 -0
  55. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/application_manager.py +0 -0
  56. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/capabilities_parser.py +0 -0
  57. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/colored_traceback.py +0 -0
  58. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/create_db_tables.sql +0 -0
  59. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/detect_b_ver.py +0 -0
  60. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/download_helper.py +0 -0
  61. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/encoded_images.py +0 -0
  62. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/jqc_helper.py +0 -0
  63. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/log_helper.py +0 -0
  64. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/mysql.py +0 -0
  65. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/nest_asyncio.py +0 -0
  66. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/recorder_helper.py +0 -0
  67. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/report_helper.py +0 -0
  68. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/s3_manager.py +0 -0
  69. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/sb_driver.py +0 -0
  70. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/session_helper.py +0 -0
  71. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/settings_parser.py +0 -0
  72. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/style_sheet.py +0 -0
  73. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/testcase_manager.py +0 -0
  74. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/tour_helper.py +0 -0
  75. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/visual_helper.py +0 -0
  76. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/drivers/__init__.py +0 -0
  77. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/drivers/brave_drivers/__init__.py +0 -0
  78. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/drivers/cft_drivers/__init__.py +0 -0
  79. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/drivers/chromium_drivers/__init__.py +0 -0
  80. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/drivers/chs_drivers/__init__.py +0 -0
  81. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/drivers/comet_drivers/__init__.py +0 -0
  82. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/drivers/opera_drivers/__init__.py +0 -0
  83. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/extensions/__init__.py +0 -0
  84. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/extensions/ad_block.zip +0 -0
  85. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/extensions/disable_csp.zip +0 -0
  86. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/extensions/recorder.zip +0 -0
  87. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/extensions/sbase_ext.zip +0 -0
  88. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/fixtures/__init__.py +0 -0
  89. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/fixtures/base_case.py +0 -0
  90. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/fixtures/constants.py +0 -0
  91. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/fixtures/css_to_xpath.py +0 -0
  92. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/fixtures/errors.py +0 -0
  93. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/fixtures/js_utils.py +0 -0
  94. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/fixtures/page_actions.py +0 -0
  95. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/fixtures/page_utils.py +0 -0
  96. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/fixtures/shared_utils.py +0 -0
  97. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/fixtures/unittest_helper.py +0 -0
  98. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/fixtures/words.py +0 -0
  99. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/fixtures/xpath_to_css.py +0 -0
  100. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/js_code/__init__.py +0 -0
  101. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/js_code/active_css_js.py +0 -0
  102. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/js_code/live_js.py +0 -0
  103. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/js_code/recorder_js.py +0 -0
  104. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/masterqa/__init__.py +0 -0
  105. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/masterqa/master_qa.py +0 -0
  106. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/plugins/__init__.py +0 -0
  107. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/plugins/base_plugin.py +0 -0
  108. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/plugins/basic_test_info.py +0 -0
  109. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
  110. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/plugins/driver_manager.py +0 -0
  111. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/plugins/page_source.py +0 -0
  112. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/plugins/pytest_plugin.py +0 -0
  113. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
  114. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/plugins/sb_manager.py +0 -0
  115. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/plugins/screen_shots.py +0 -0
  116. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/plugins/selenium_plugin.py +0 -0
  117. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/resources/__init__.py +0 -0
  118. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/translate/__init__.py +0 -0
  119. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/translate/chinese.py +0 -0
  120. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/translate/dutch.py +0 -0
  121. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/translate/french.py +0 -0
  122. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/translate/italian.py +0 -0
  123. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/translate/japanese.py +0 -0
  124. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/translate/korean.py +0 -0
  125. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/translate/master_dict.py +0 -0
  126. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/translate/portuguese.py +0 -0
  127. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/translate/russian.py +0 -0
  128. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/translate/spanish.py +0 -0
  129. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/translate/translator.py +0 -0
  130. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/undetected/__init__.py +0 -0
  131. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/undetected/cdp.py +0 -0
  132. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/undetected/cdp_driver/__init__.py +0 -0
  133. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
  134. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/undetected/cdp_driver/browser.py +0 -0
  135. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/undetected/cdp_driver/cdp_util.py +0 -0
  136. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/undetected/cdp_driver/config.py +0 -0
  137. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/undetected/cdp_driver/connection.py +0 -0
  138. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/undetected/cdp_driver/element.py +0 -0
  139. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/undetected/cdp_driver/tab.py +0 -0
  140. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/undetected/dprocess.py +0 -0
  141. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/undetected/options.py +0 -0
  142. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/undetected/patcher.py +0 -0
  143. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/undetected/reactor.py +0 -0
  144. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/undetected/webelement.py +0 -0
  145. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/utilities/__init__.py +0 -0
  146. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
  147. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
  148. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_grid/font_color +0 -0
  149. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
  150. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
  151. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
  152. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
  153. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
  154. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
  155. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
  156. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
  157. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
  158. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
  159. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase.egg-info/SOURCES.txt +0 -0
  160. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase.egg-info/dependency_links.txt +0 -0
  161. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase.egg-info/entry_points.txt +0 -0
  162. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase.egg-info/top_level.txt +0 -0
  163. {seleniumbase-4.53.3 → seleniumbase-4.53.5}/setup.cfg +0 -0
  164. {seleniumbase-4.53.3 → 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.3
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
@@ -71,7 +71,7 @@ Requires-Dist: filelock>=3.32.5
71
71
  Requires-Dist: fasteners>=0.20
72
72
  Requires-Dist: mycdp>=1.4.0
73
73
  Requires-Dist: pynose>=1.5.5
74
- Requires-Dist: platformdirs>=4.11.5
74
+ Requires-Dist: platformdirs>=4.11.7
75
75
  Requires-Dist: typing-extensions>=4.16.0
76
76
  Requires-Dist: sbvirtualdisplay>=1.4.0
77
77
  Requires-Dist: MarkupSafe>=3.0.3
@@ -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,16 +30,10 @@ 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/act_on_element for interactions.
36
-
37
- Note on elements: CDP-mode element objects (from find_element/find_all) are
38
- live handles with their own methods (.click(), .get_html(), ...) that can't
39
- cross the MCP boundary as stateful objects. Tools here resolve elements
40
- immediately to plain dicts (tag, text, html) rather than returning handles.
41
- To act on one of several matches, use click(selector, nth=...) rather than
42
- find + click.
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
+ interactions and element positioning.
43
37
  """
44
38
  from __future__ import annotations
45
39
  import atexit
@@ -99,7 +93,7 @@ def start_browser(
99
93
  """Launch a persistent SeleniumBase Pure CDP Mode browser session.
100
94
 
101
95
  This must be called before browser interaction tools such as navigate,
102
- get_content, click, fill_input, or find_elements. The same browser
96
+ get_content, click, type_text, or find_elements. The same browser
103
97
  session remains active across subsequent MCP tool calls until
104
98
  close_browser is called or the server process exits.
105
99
 
@@ -283,7 +277,7 @@ def get_page_info() -> dict | str:
283
277
  - Need information about matching elements -> use find_elements.
284
278
  - Need an immediate state check -> use check_state.
285
279
  - Need to wait for a condition -> use wait_for.
286
- - Need to verify an expected condition -> use assert_that.
280
+ - Need to verify an expected condition -> use assert_condition.
287
281
 
288
282
  Unlike a dedicated browser-status tool, get_page_info is the single
289
283
  source of browser/page metadata. If no browser session is active, it
@@ -555,15 +549,26 @@ def get_attributes(
555
549
  ) -> Any:
556
550
  """Read HTML attributes from a matching element.
557
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
+
558
555
  Args:
559
556
  selector: CSS selector or SeleniumBase text-matching selector for
560
557
  the target element.
561
558
  attribute: Specific HTML attribute to retrieve. When omitted, return
562
- all available attributes as a dictionary.
559
+ all HTML attributes of the element as a dictionary.
563
560
 
564
561
  Returns:
565
562
  The requested attribute value, or a dictionary containing all
566
- 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'.
567
572
 
568
573
  This is a read-only operation and does not modify the element.
569
574
  """
@@ -586,7 +591,7 @@ def check_state(
586
591
 
587
592
  Use this tool when you need an observation of the current state and do
588
593
  NOT want to wait for a condition. For waiting behavior, use wait_for.
589
- 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.
590
595
 
591
596
  Args:
592
597
  check:
@@ -608,7 +613,7 @@ def check_state(
608
613
  - Immediate yes/no/count observation -> use check_state.
609
614
  - Wait until a state becomes true/false -> use wait_for.
610
615
  - Verify an expected condition and fail when it is not met ->
611
- use assert_that.
616
+ use assert_condition.
612
617
 
613
618
  Note:
614
619
  Except for count's short lookup, this tool does not wait for elements
@@ -708,114 +713,146 @@ def click(
708
713
 
709
714
  @mcp.tool()
710
715
  @handle_sb_errors
711
- def hover(
712
- selector: str,
713
- then_click_selector: str | None = None,
716
+ def hover_with_action(
717
+ selector1: str,
718
+ selector2: str | None = None,
719
+ action: Literal[
720
+ "none",
721
+ "click",
722
+ "drag_and_drop",
723
+ ] = "none",
714
724
  ) -> str:
715
- """Hover over an element, optionally clicking an element revealed by hover.
725
+ """Hover over an element, optionally click another element, or drag-&-drop.
716
726
 
717
- Use this for menus, dropdowns, tooltips, or other interfaces where an
718
- element must first be hovered before its target becomes available.
727
+ Use this tool for hover interactions, hover-triggered menus, and
728
+ drag-and-drop operations.
719
729
 
720
730
  Args:
721
- selector: Element to hover over.
722
- then_click_selector: Optional element to click after the hover.
723
- Useful for a submenu item or dropdown option revealed by hover.
731
+ selector1:
732
+ The primary element selector.
724
733
 
725
- Returns:
726
- A confirmation describing the hover/click operation.
727
- """
728
- sb = _get_sb()
734
+ For action="none", this is the element to hover over.
729
735
 
730
- if then_click_selector:
731
- sb.hover_and_click(selector, then_click_selector)
732
- return f"Hovered {selector} and clicked {then_click_selector}"
736
+ For action="click", this is the element to hover over before
737
+ clicking selector2.
733
738
 
734
- sb.hover_element(selector)
735
- return f"Hovered {selector}"
739
+ For action="drag_and_drop", this is the draggable source element.
736
740
 
741
+ selector2:
742
+ The secondary element selector.
737
743
 
738
- @mcp.tool()
739
- @handle_sb_errors
740
- def drag_and_drop(
741
- source_selector: str,
742
- target_selector: str,
743
- ) -> str:
744
- """Drag a draggable element and drop it onto another element.
744
+ Required for action="click", where it identifies the element
745
+ revealed or targeted after hovering selector1.
745
746
 
746
- Drag-and-drop is performed through SeleniumBase's CDP browser controls,
747
- simulating the pointer and mouse events expected by web applications.
747
+ Required for action="drag_and_drop", where it identifies the
748
+ destination/drop target.
748
749
 
749
- Args:
750
- source_selector: CSS selector identifying the draggable source.
751
- target_selector: CSS selector identifying the drop target.
750
+ Not used for action="none".
751
+
752
+ action:
753
+ - "none": Hover over selector1 only.
754
+ - "click": Hover over selector1, then click selector2.
755
+ - "drag_and_drop": Drag selector1 and drop it onto selector2.
756
+
757
+ Returns:
758
+ A confirmation describing the performed operation.
759
+
760
+ Tool selection:
761
+ - Simple hover -> action="none".
762
+ - Hover over one element and then click another -> action="click".
763
+ - Drag one element onto another -> action="drag_and_drop".
764
+
765
+ Notes:
766
+ For action="click", selector1 is the hover target and selector2 is
767
+ the click target.
752
768
 
753
- The simulated interaction includes events such as pointerdown,
754
- mousedown, dragstart, dragenter, dragover, drop, dragend, mouseup, and
755
- pointerup.
769
+ For action="drag_and_drop", selector1 is the source and selector2
770
+ is the destination.
756
771
  """
757
- _get_sb().drag_and_drop(source_selector, target_selector)
758
- return f"Dragged {source_selector} onto {target_selector}"
772
+ sb = _get_sb()
773
+
774
+ if action == "none":
775
+ sb.hover_element(selector1)
776
+ return f"Hovered {selector1}"
777
+
778
+ if action == "click":
779
+ if selector2 is None:
780
+ return "Error: action='click' requires selector2."
781
+ sb.hover_and_click(selector1, selector2)
782
+ return f"Hovered {selector1} and clicked {selector2}"
783
+
784
+ if action == "drag_and_drop":
785
+ if selector2 is None:
786
+ return "Error: action='drag_and_drop' requires selector2."
787
+ sb.drag_and_drop(selector1, selector2)
788
+ return f"Dragged {selector1} onto {selector2}"
789
+
790
+ return (
791
+ f"Error: unknown action '{action}'. "
792
+ "Use 'none', 'click', or 'drag_and_drop'."
793
+ )
759
794
 
760
795
 
761
796
  @mcp.tool()
762
797
  @handle_sb_errors
763
- def fill_input(
798
+ def type_text(
764
799
  selector: str,
765
800
  text: str = "",
766
801
  mode: Literal[
767
- "type",
802
+ "fill_input",
768
803
  "append",
769
- "set_value",
770
804
  "fast_type",
771
- "clear",
772
- ] = "type",
805
+ "set_value",
806
+ "clear_only",
807
+ ] = "fill_input",
773
808
  timeout: int | float | None = 7,
774
809
  ) -> str:
775
- """Enter, append, directly set, or clear text in a form control.
810
+ """Fill, append, fast-type, directly set, or clear a form control.
776
811
 
777
812
  Use this tool for input elements, textareas, and contenteditable elements.
778
813
 
779
814
  Args:
780
815
  selector: CSS selector or SeleniumBase selector identifying the
781
816
  input, textarea, or contenteditable element.
782
- text: Text to enter or set. Ignored when mode="clear".
817
+ text: Text to enter or set. Not used when mode="clear_only".
783
818
  mode:
784
- - "type": Clear the field and type text normally.
785
- - "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.
786
822
  - "set_value": Set the value directly and immediately. This can
787
823
  be useful for fast form filling but does not simulate normal
788
- key events.
789
- - "fast_type": Clear the field and type text quickly.
790
- - "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.
791
827
  timeout: Maximum seconds to wait for the target element.
792
828
 
793
829
  Tool selection:
794
- - Normal human-like text entry -> mode="type".
795
- - Add text without clearing -> mode="append".
796
- - Directly set a value -> mode="set_value".
797
- - Fast typing -> mode="fast_type".
798
- - 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".
799
835
  """
800
836
  sb = _get_sb()
801
837
 
802
- if mode == "type":
838
+ if mode == "fill_input":
803
839
  sb.type(selector, text, timeout=timeout)
804
840
  elif mode == "append":
805
841
  sb.send_keys(selector, text, timeout=timeout)
806
- elif mode == "set_value":
807
- sb.set_value(selector, text, timeout=timeout)
808
842
  elif mode == "fast_type":
809
843
  sb.fast_type(selector, text, timeout=timeout)
810
- elif mode == "clear":
844
+ elif mode == "set_value":
845
+ sb.set_value(selector, text, timeout=timeout)
846
+ elif mode == "clear_only":
811
847
  sb.clear_input(selector, timeout=timeout)
812
848
  else:
813
849
  return (
814
850
  f"Error: unknown mode '{mode}'. "
815
- "Use 'type', 'append', 'set_value', 'fast_type', or 'clear'."
851
+ "Use 'fill_input', 'append', 'fast_type', "
852
+ "'set_value', or 'clear_only'."
816
853
  )
817
854
 
818
- return f"fill_input(mode={mode!r}) done for {selector}"
855
+ return f"type_text(mode={mode!r}) done for {selector}"
819
856
 
820
857
 
821
858
  @mcp.tool()
@@ -860,50 +897,52 @@ def select_option(
860
897
 
861
898
  @mcp.tool()
862
899
  @handle_sb_errors
863
- def act_on_element(
900
+ def focus_on(
864
901
  selector: str,
865
902
  action: Literal[
903
+ "scroll_to_element",
866
904
  "focus",
867
905
  "highlight",
868
- "scroll_into_view",
869
- ] = "focus",
906
+ ] = "scroll_to_element",
870
907
  ) -> str:
871
- """Perform a non-click positioning or debugging action on an element.
908
+ """Scroll to, focus, or highlight an element.
872
909
 
873
- Use this tool when an element needs to be focused, highlighted for human
874
- observation/debugging, or scrolled into the viewport.
910
+ Use this tool when an element needs to be brought into view, focused for
911
+ keyboard interaction, or highlighted for debugging/demonstration.
875
912
 
876
913
  This tool does NOT click, type into, select from, hover over, or otherwise
877
914
  activate the element.
878
915
 
879
916
  Args:
880
917
  selector: CSS selector or SeleniumBase selector identifying the target.
918
+
881
919
  action:
920
+ - "scroll_to_element": Scroll the page until the element is in
921
+ the current viewport. This is the default action.
882
922
  - "focus": Move keyboard focus to the element.
883
923
  - "highlight": Temporarily highlight the element for debugging or
884
924
  demonstration. This can affect timing and may reduce stealth.
885
- - "scroll_into_view": Scroll the page until the element is in the
886
- current viewport.
887
925
 
888
926
  Tool selection:
927
+ - Bring an element into view -> use focus_on with the default action.
928
+ - Focus an element -> use focus_on(action="focus").
929
+ - Highlight element for debugging -> use focus_on(action="highlight").
889
930
  - Click -> use click.
890
- - Type into a form control -> use fill_input.
891
- - Hover -> use hover.
892
- - Focus, highlight, or scroll without activating -> use
893
- act_on_element.
931
+ - Type text into a text field -> use type_text.
932
+ - Hover -> use hover_with_action.
894
933
  """
895
934
  sb = _get_sb()
896
935
 
897
- if action == "focus":
936
+ if action == "scroll_to_element":
937
+ sb.scroll_into_view(selector)
938
+ elif action == "focus":
898
939
  sb.find_element(selector).focus()
899
940
  elif action == "highlight":
900
941
  sb.highlight(selector)
901
- elif action == "scroll_into_view":
902
- sb.scroll_into_view(selector)
903
942
  else:
904
943
  return (
905
944
  f"Error: unknown action '{action}'. "
906
- "Use 'focus', 'highlight', or 'scroll_into_view'."
945
+ "Use 'scroll_to_element', 'focus', or 'highlight'."
907
946
  )
908
947
 
909
948
  return f"{action} done for {selector}"
@@ -931,7 +970,7 @@ def wait_for(
931
970
  Use this tool when the page is dynamic and an automation step must wait
932
971
  for a condition before continuing.
933
972
 
934
- Unlike check_state, this tool intentionally waits. Unlike assert_that,
973
+ Unlike check_state, this tool intentionally waits. Unlike assert_condition,
935
974
  its purpose is synchronization rather than validating a test expectation.
936
975
 
937
976
  Args:
@@ -953,7 +992,7 @@ def wait_for(
953
992
  Tool selection:
954
993
  - Check current state immediately -> use check_state.
955
994
  - Wait for a state/content transition -> use wait_for.
956
- - Verify an expected value/condition -> use assert_that.
995
+ - Verify an expected value/condition -> use assert_condition.
957
996
  """
958
997
  sb = _get_sb()
959
998
 
@@ -983,11 +1022,11 @@ def wait_for(
983
1022
 
984
1023
  @mcp.tool()
985
1024
  @handle_sb_errors
986
- def assert_that(
1025
+ def assert_condition(
987
1026
  check: Literal[
988
1027
  "element_present",
989
1028
  "element_visible",
990
- "text",
1029
+ "text_visible",
991
1030
  "title",
992
1031
  "url",
993
1032
  "url_contains",
@@ -1000,23 +1039,24 @@ def assert_that(
1000
1039
  """Verify an expected browser condition and fail when it is not met.
1001
1040
 
1002
1041
  Use this tool for explicit verification. Unlike check_state, which simply
1003
- reports the current state, assert_that treats a failed expectation as an
1004
- 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.
1005
1044
 
1006
1045
  Args:
1007
1046
  check:
1008
1047
  - "element_present": Verify selector identifies a present element.
1009
1048
  - "element_visible": Verify selector identifies a visible element.
1010
- - "text": Verify expected text within selector, or within the
1011
- 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.
1012
1051
  - "title": Verify the exact page title.
1013
1052
  - "url": Verify the exact current URL.
1014
1053
  - "url_contains": Verify that the current URL contains expected.
1015
1054
  selector: Element selector for element_present, element_visible, and
1016
- text checks.
1017
- expected: Expected text/title/URL value for text, title, url, and
1018
- url_contains.
1019
- 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.
1020
1060
  timeout: Maximum seconds to wait for element/text checks.
1021
1061
 
1022
1062
  Returns:
@@ -1029,14 +1069,16 @@ def assert_that(
1029
1069
  Tool selection:
1030
1070
  - Just inspect current state -> use check_state.
1031
1071
  - Wait for a condition to become true -> use wait_for.
1032
- - Verify that an expected condition is true -> use assert_that.
1072
+ - Verify that an expected condition is true -> use assert_condition.
1033
1073
  """
1034
1074
  sb = _get_sb()
1035
1075
 
1036
1076
  if check in ("element_present", "element_visible") and selector is None:
1037
1077
  return f"Error: check='{check}' requires value for `selector`."
1038
1078
 
1039
- 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:
1040
1082
  return f"Error: check='{check}' requires value for `expected`."
1041
1083
 
1042
1084
  if check == "element_present":
@@ -1047,13 +1089,13 @@ def assert_that(
1047
1089
  sb.assert_element_visible(selector, timeout=timeout)
1048
1090
  return f"Confirmed {selector} is visible."
1049
1091
 
1050
- if check == "text":
1092
+ if check == "text_visible":
1051
1093
  target = selector or "html"
1052
1094
  if exact:
1053
1095
  sb.assert_exact_text(expected, target, timeout=timeout)
1054
1096
  else:
1055
1097
  sb.assert_text(expected, target, timeout=timeout)
1056
- return f"Confirmed text in {target}."
1098
+ return f"Confirmed visible text {expected} in {target}."
1057
1099
 
1058
1100
  if check == "title":
1059
1101
  sb.assert_title(expected)
@@ -1069,7 +1111,8 @@ def assert_that(
1069
1111
 
1070
1112
  return (
1071
1113
  f"Error: unknown check '{check}'. Use 'element_present', "
1072
- f"'element_visible', 'text', 'title', 'url', or 'url_contains'."
1114
+ "'element_visible', 'text_visible', 'title', 'url', "
1115
+ "or 'url_contains'."
1073
1116
  )
1074
1117
 
1075
1118
 
@@ -1221,8 +1264,8 @@ def scroll(
1221
1264
  up/down scrolling. For example, amount=25 scrolls approximately
1222
1265
  one quarter of the viewport height.
1223
1266
 
1224
- Use act_on_element(action="scroll_into_view") when the goal is to reveal
1225
- a specific element rather than scroll the page by a relative amount.
1267
+ Use focus_on(action="scroll_to_element") when the goal is to reveal a
1268
+ specific element rather than scroll the page by a relative amount.
1226
1269
  """
1227
1270
  sb = _get_sb()
1228
1271
 
@@ -11,7 +11,7 @@ filelock>=3.32.5
11
11
  fasteners>=0.20
12
12
  mycdp>=1.4.0
13
13
  pynose>=1.5.5
14
- platformdirs>=4.11.5
14
+ platformdirs>=4.11.7
15
15
  typing-extensions>=4.16.0
16
16
  sbvirtualdisplay>=1.4.0
17
17
  MarkupSafe>=3.0.3
@@ -1,2 +1,2 @@
1
1
  # seleniumbase package
2
- __version__ = "4.53.3"
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.3
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
@@ -71,7 +71,7 @@ Requires-Dist: filelock>=3.32.5
71
71
  Requires-Dist: fasteners>=0.20
72
72
  Requires-Dist: mycdp>=1.4.0
73
73
  Requires-Dist: pynose>=1.5.5
74
- Requires-Dist: platformdirs>=4.11.5
74
+ Requires-Dist: platformdirs>=4.11.7
75
75
  Requires-Dist: typing-extensions>=4.16.0
76
76
  Requires-Dist: sbvirtualdisplay>=1.4.0
77
77
  Requires-Dist: MarkupSafe>=3.0.3
@@ -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
@@ -9,7 +9,7 @@ filelock>=3.32.5
9
9
  fasteners>=0.20
10
10
  mycdp>=1.4.0
11
11
  pynose>=1.5.5
12
- platformdirs>=4.11.5
12
+ platformdirs>=4.11.7
13
13
  typing-extensions>=4.16.0
14
14
  sbvirtualdisplay>=1.4.0
15
15
  MarkupSafe>=3.0.3
@@ -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
@@ -177,7 +177,7 @@ setup(
177
177
  'fasteners>=0.20',
178
178
  'mycdp>=1.4.0',
179
179
  'pynose>=1.5.5',
180
- 'platformdirs>=4.11.5',
180
+ 'platformdirs>=4.11.7',
181
181
  'typing-extensions>=4.16.0',
182
182
  'sbvirtualdisplay>=1.4.0',
183
183
  'MarkupSafe>=3.0.3',
@@ -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