seleniumbase 4.53.6__tar.gz → 4.53.7__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (164) hide show
  1. {seleniumbase-4.53.6/seleniumbase.egg-info → seleniumbase-4.53.7}/PKG-INFO +2 -2
  2. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/mcp_servers/server.py +167 -97
  3. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/requirements.txt +1 -1
  4. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/__version__.py +1 -1
  5. {seleniumbase-4.53.6 → seleniumbase-4.53.7/seleniumbase.egg-info}/PKG-INFO +2 -2
  6. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase.egg-info/requires.txt +1 -1
  7. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/setup.py +1 -1
  8. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/.gitignore +0 -0
  9. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/LICENSE +0 -0
  10. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/MANIFEST.in +0 -0
  11. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/README.md +0 -0
  12. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/install.sh +0 -0
  13. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/mcp_servers/__init__.py +0 -0
  14. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/pyproject.toml +0 -0
  15. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/pytest.ini +0 -0
  16. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/sbase/__init__.py +0 -0
  17. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/sbase/__main__.py +0 -0
  18. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/sbase/steps.py +0 -0
  19. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/__init__.py +0 -0
  20. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/__main__.py +0 -0
  21. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/behave/__init__.py +0 -0
  22. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/behave/behave_helper.py +0 -0
  23. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/behave/behave_sb.py +0 -0
  24. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/behave/steps.py +0 -0
  25. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/common/__init__.py +0 -0
  26. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/common/decorators.py +0 -0
  27. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/common/encryption.py +0 -0
  28. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/common/exceptions.py +0 -0
  29. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/common/obfuscate.py +0 -0
  30. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/common/unobfuscate.py +0 -0
  31. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/config/__init__.py +0 -0
  32. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/config/ad_block_list.py +0 -0
  33. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/config/proxy_list.py +0 -0
  34. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/config/settings.py +0 -0
  35. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/console_scripts/__init__.py +0 -0
  36. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/console_scripts/logo_helper.py +0 -0
  37. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/console_scripts/rich_helper.py +0 -0
  38. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/console_scripts/run.py +0 -0
  39. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
  40. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
  41. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/console_scripts/sb_commander.py +0 -0
  42. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/console_scripts/sb_install.py +0 -0
  43. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
  44. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
  45. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
  46. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
  47. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
  48. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/console_scripts/sb_objectify.py +0 -0
  49. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/console_scripts/sb_print.py +0 -0
  50. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/console_scripts/sb_recorder.py +0 -0
  51. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/core/__init__.py +0 -0
  52. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/core/application_manager.py +0 -0
  53. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/core/browser_launcher.py +0 -0
  54. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/core/capabilities_parser.py +0 -0
  55. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/core/colored_traceback.py +0 -0
  56. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/core/create_db_tables.sql +0 -0
  57. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/core/detect_b_ver.py +0 -0
  58. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/core/download_helper.py +0 -0
  59. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/core/encoded_images.py +0 -0
  60. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/core/jqc_helper.py +0 -0
  61. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/core/log_helper.py +0 -0
  62. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/core/mysql.py +0 -0
  63. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/core/nest_asyncio.py +0 -0
  64. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/core/proxy_helper.py +0 -0
  65. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/core/recorder_helper.py +0 -0
  66. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/core/report_helper.py +0 -0
  67. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/core/s3_manager.py +0 -0
  68. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/core/sb_cdp.py +0 -0
  69. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/core/sb_driver.py +0 -0
  70. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/core/session_helper.py +0 -0
  71. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/core/settings_parser.py +0 -0
  72. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/core/style_sheet.py +0 -0
  73. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/core/testcase_manager.py +0 -0
  74. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/core/tour_helper.py +0 -0
  75. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/core/visual_helper.py +0 -0
  76. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/drivers/__init__.py +0 -0
  77. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/drivers/brave_drivers/__init__.py +0 -0
  78. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/drivers/cft_drivers/__init__.py +0 -0
  79. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/drivers/chromium_drivers/__init__.py +0 -0
  80. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/drivers/chs_drivers/__init__.py +0 -0
  81. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/drivers/comet_drivers/__init__.py +0 -0
  82. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/drivers/opera_drivers/__init__.py +0 -0
  83. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/extensions/__init__.py +0 -0
  84. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/extensions/ad_block.zip +0 -0
  85. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/extensions/disable_csp.zip +0 -0
  86. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/extensions/recorder.zip +0 -0
  87. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/extensions/sbase_ext.zip +0 -0
  88. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/fixtures/__init__.py +0 -0
  89. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/fixtures/base_case.py +0 -0
  90. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/fixtures/constants.py +0 -0
  91. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/fixtures/css_to_xpath.py +0 -0
  92. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/fixtures/errors.py +0 -0
  93. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/fixtures/js_utils.py +0 -0
  94. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/fixtures/page_actions.py +0 -0
  95. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/fixtures/page_utils.py +0 -0
  96. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/fixtures/shared_utils.py +0 -0
  97. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/fixtures/unittest_helper.py +0 -0
  98. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/fixtures/words.py +0 -0
  99. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/fixtures/xpath_to_css.py +0 -0
  100. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/js_code/__init__.py +0 -0
  101. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/js_code/active_css_js.py +0 -0
  102. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/js_code/live_js.py +0 -0
  103. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/js_code/recorder_js.py +0 -0
  104. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/masterqa/__init__.py +0 -0
  105. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/masterqa/master_qa.py +0 -0
  106. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/plugins/__init__.py +0 -0
  107. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/plugins/base_plugin.py +0 -0
  108. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/plugins/basic_test_info.py +0 -0
  109. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
  110. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/plugins/driver_manager.py +0 -0
  111. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/plugins/page_source.py +0 -0
  112. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/plugins/pytest_plugin.py +0 -0
  113. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
  114. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/plugins/sb_manager.py +0 -0
  115. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/plugins/screen_shots.py +0 -0
  116. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/plugins/selenium_plugin.py +0 -0
  117. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/resources/__init__.py +0 -0
  118. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/translate/__init__.py +0 -0
  119. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/translate/chinese.py +0 -0
  120. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/translate/dutch.py +0 -0
  121. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/translate/french.py +0 -0
  122. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/translate/italian.py +0 -0
  123. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/translate/japanese.py +0 -0
  124. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/translate/korean.py +0 -0
  125. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/translate/master_dict.py +0 -0
  126. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/translate/portuguese.py +0 -0
  127. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/translate/russian.py +0 -0
  128. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/translate/spanish.py +0 -0
  129. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/translate/translator.py +0 -0
  130. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/undetected/__init__.py +0 -0
  131. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/undetected/cdp.py +0 -0
  132. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/undetected/cdp_driver/__init__.py +0 -0
  133. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
  134. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/undetected/cdp_driver/browser.py +0 -0
  135. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/undetected/cdp_driver/cdp_util.py +0 -0
  136. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/undetected/cdp_driver/config.py +0 -0
  137. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/undetected/cdp_driver/connection.py +0 -0
  138. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/undetected/cdp_driver/element.py +0 -0
  139. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/undetected/cdp_driver/tab.py +0 -0
  140. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/undetected/dprocess.py +0 -0
  141. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/undetected/options.py +0 -0
  142. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/undetected/patcher.py +0 -0
  143. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/undetected/reactor.py +0 -0
  144. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/undetected/webelement.py +0 -0
  145. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/utilities/__init__.py +0 -0
  146. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
  147. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
  148. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/utilities/selenium_grid/font_color +0 -0
  149. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
  150. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
  151. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
  152. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
  153. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
  154. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
  155. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
  156. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
  157. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
  158. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
  159. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase.egg-info/SOURCES.txt +0 -0
  160. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase.egg-info/dependency_links.txt +0 -0
  161. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase.egg-info/entry_points.txt +0 -0
  162. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/seleniumbase.egg-info/top_level.txt +0 -0
  163. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/setup.cfg +0 -0
  164. {seleniumbase-4.53.6 → seleniumbase-4.53.7}/virtualenv_install.sh +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: seleniumbase
3
- Version: 4.53.6
3
+ Version: 4.53.7
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
@@ -109,7 +109,7 @@ Requires-Dist: pytest-html==4.0.2
109
109
  Requires-Dist: pytest-metadata==3.1.1
110
110
  Requires-Dist: pytest-ordering==0.6
111
111
  Requires-Dist: pytest-rerunfailures==16.3; python_version == "3.10"
112
- Requires-Dist: pytest-rerunfailures==16.6; python_version >= "3.11"
112
+ Requires-Dist: pytest-rerunfailures==16.6.1; python_version >= "3.11"
113
113
  Requires-Dist: pytest-xdist==3.8.0
114
114
  Requires-Dist: parameterized==0.9.0
115
115
  Requires-Dist: behave==1.2.6
@@ -27,7 +27,7 @@ Tool-selection philosophy:
27
27
  - Use get_content for reading visible text or HTML.
28
28
  - Use find_elements for discovering and inspecting multiple matching
29
29
  elements as structured data.
30
- - Use check_for_condition for an immediate, non-waiting state check.
30
+ - Use check_condition for an immediate, non-waiting state check.
31
31
  - Use wait_for when the agent needs to wait for a condition to become true.
32
32
  - Use assert_condition when the agent needs to verify an expected condition
33
33
  and treat failure as an assertion error.
@@ -287,7 +287,7 @@ def get_page_info() -> dict | str:
287
287
  - Need URL, title, origin, or User-Agent -> use get_page_info.
288
288
  - Need visible page text or HTML -> use get_content.
289
289
  - Need information about matching elements -> use find_elements.
290
- - Need an immediate state check -> use check_for_condition.
290
+ - Need an immediate state check -> use check_condition.
291
291
  - Need to wait for a condition -> use wait_for.
292
292
  - Need to verify an expected condition -> use assert_condition.
293
293
 
@@ -345,9 +345,9 @@ def navigate(url: str) -> str:
345
345
 
346
346
  Tool selection:
347
347
  - Go to a new URL -> use navigate.
348
- - Return to the previous page -> use navigate_history(action="back").
349
- - Go forward in history -> use navigate_history(action="forward").
350
- - Refresh the current page -> use navigate_history(action="reload").
348
+ - Return to the previous page -> use manage_history(action="back").
349
+ - Go forward in history -> use manage_history(action="forward").
350
+ - Refresh the current page -> use manage_history(action="reload").
351
351
  """
352
352
  _get_sb().get(url)
353
353
  return f"Navigated to {url}"
@@ -355,35 +355,42 @@ def navigate(url: str) -> str:
355
355
 
356
356
  @mcp.tool()
357
357
  @handle_sb_errors
358
- def navigate_history(
359
- action: Literal["back", "forward", "reload"] = "back",
360
- ) -> str:
361
- """Navigate through the current browser history or reload the page.
358
+ def manage_history(
359
+ action: Literal["back", "forward", "reload", "list"] = "list",
360
+ ) -> str | dict[str, Any]:
361
+ """Navigate through the current browser history, reload the current page,
362
+ or list the current browser history.
362
363
 
363
- Use this tool only for navigation relative to the current browser
364
- history. Use navigate when going to an arbitrary URL.
364
+ Use this tool for navigation relative to the current browser
365
+ history or for displaying the current browser history.
366
+ Use the 'navigate' tool when going to an arbitrary URL.
365
367
 
366
368
  Args:
367
369
  action:
368
- - "back": Navigate to the previous history entry. Has no useful
369
- effect when there is no previous history entry.
370
- - "forward": Navigate to the next history entry. Has no useful
371
- effect when there is no forward history entry.
370
+ - "back": Navigate to the previous history entry.
371
+ Has no useful effect when there is no previous history entry.
372
+ - "forward": Navigate to the next history entry.
373
+ Has no useful effect when there is no forward history entry.
372
374
  - "reload": Reload the current page while ignoring the browser
373
375
  cache so page resources are fetched again.
376
+ - "list": Return a tuple containing the current location in
377
+ history (0-indexed) and the full navigation-history list.
374
378
 
375
379
  Returns:
376
- A confirmation message describing the operation performed.
380
+ A confirmation message describing the operation performed for
381
+ navigation actions, or, for "list", a tuple containing the current
382
+ history location (0-indexed) and the full navigation-history list.
377
383
 
378
384
  Notes:
379
385
  These operations can trigger page loads, redirects, and other
380
- navigation events. Use get_page_info afterward when you need to
381
- verify the resulting URL or title.
386
+ navigation events. Use the 'get_page_info' tool afterward
387
+ when you need to verify the resulting URL or title.
382
388
 
383
389
  Tool selection:
384
390
  - Arbitrary destination URL -> use navigate.
385
391
  - Previous/next browser history entry -> use this tool.
386
392
  - Refresh current page -> use this tool with action="reload".
393
+ - List current history -> use this tool with action="list".
387
394
  """
388
395
  sb = _get_sb()
389
396
 
@@ -399,9 +406,25 @@ def navigate_history(
399
406
  sb.reload(ignore_cache=True)
400
407
  return "Page reloaded."
401
408
 
409
+ if action == "list":
410
+ position, entries = sb.get_navigation_history()
411
+ return {
412
+ "position": position,
413
+ "entries": [
414
+ {
415
+ "id": entry.id_,
416
+ "url": entry.url,
417
+ "user_typed_url": entry.user_typed_url,
418
+ "title": entry.title,
419
+ "transition_type": entry.transition_type.value,
420
+ }
421
+ for entry in entries
422
+ ],
423
+ }
424
+
402
425
  return (
403
426
  f"Error: unknown action '{action}'. "
404
- "Use 'back', 'forward', or 'reload'."
427
+ "Use 'back', 'forward', 'reload', or 'list'."
405
428
  )
406
429
 
407
430
 
@@ -413,7 +436,7 @@ def navigate_history(
413
436
  @handle_sb_errors
414
437
  def find_elements(
415
438
  selector: str,
416
- timeout: int | float | None = 7,
439
+ timeout: float = 0.5,
417
440
  include_html: bool = False,
418
441
  ) -> dict | str:
419
442
  """Find matching elements and return structured element information.
@@ -429,16 +452,17 @@ def find_elements(
429
452
  selector: CSS selector, or a SeleniumBase selector that can match
430
453
  visible text. Examples include "button", ".login-link", or
431
454
  'a:contains("Sign in")'.
432
- timeout: Maximum number of seconds to wait for matching elements.
433
- Defaults to 7 seconds.
455
+ timeout: Maximum number of seconds to wait for matching elements
456
+ to be found. (Defaults to 0.5 seconds.)
434
457
  include_html: If True, include each matching element's outer HTML.
435
- If False, return only tag name and text.
458
+ If False, return only tag name and text. (Defaults to False.)
436
459
 
437
460
  Returns:
438
461
  A dictionary containing:
439
462
  - count: Number of matching elements found.
440
463
  - matches: A list of element dictionaries containing tag_name and
441
464
  text, plus html when include_html=True.
465
+ If there are no matching elements, returns an empty dictionary.
442
466
 
443
467
  Tool selection:
444
468
  - Need structured information about matching elements ->
@@ -447,7 +471,7 @@ def find_elements(
447
471
  use get_content.
448
472
  - Need to click one of several matches -> use click with nth.
449
473
  - Need to know whether an element is present/visible ->
450
- use check_for_condition.
474
+ use check_condition.
451
475
 
452
476
  Note:
453
477
  Element handles cannot be persisted across MCP calls. If you find
@@ -455,29 +479,32 @@ def find_elements(
455
479
  appropriate interaction tool.
456
480
  """
457
481
  sb = _get_sb()
458
- els = sb.find_all(selector, timeout=timeout)
482
+ try:
483
+ elements = sb.find_all(selector, timeout=timeout)
484
+ except Exception:
485
+ return {}
459
486
 
460
487
  if include_html:
461
488
  return {
462
- "count": len(els),
489
+ "count": len(elements),
463
490
  "matches": [
464
491
  {
465
- "tag_name": e.tag_name,
466
- "text": e.text,
467
- "html": e.get_html(),
492
+ "tag_name": element.tag_name,
493
+ "text": element.text,
494
+ "html": element.get_html(),
468
495
  }
469
- for e in els
496
+ for element in elements
470
497
  ],
471
498
  }
472
499
 
473
500
  return {
474
- "count": len(els),
501
+ "count": len(elements),
475
502
  "matches": [
476
503
  {
477
- "tag_name": e.tag_name,
478
- "text": e.text,
504
+ "tag_name": element.tag_name,
505
+ "text": element.text,
479
506
  }
480
- for e in els
507
+ for element in elements
481
508
  ],
482
509
  }
483
510
 
@@ -529,8 +556,7 @@ def get_content(
529
556
  - Need URLs from the page or an element -> use output_format="urls".
530
557
  - Need structured information about matching elements ->
531
558
  use find_elements.
532
- - Need to check whether an element is present or visible ->
533
- use check_for_condition.
559
+ - Need to check element presence/visibility -> use check_condition.
534
560
  - Need to wait for content to appear -> use wait_for.
535
561
  """
536
562
  sb = _get_sb()
@@ -578,79 +604,86 @@ def get_attributes(
578
604
  - Need to discover multiple matching elements or inspect their text ->
579
605
  use 'find_elements'.
580
606
  - Need visible text or HTML content -> use 'get_content'.
581
- - Need to check presence or visibility -> use 'check_for_condition'.
607
+ - Need to check element presence/visibility -> use 'check_condition'.
582
608
 
583
609
  This is a read-only operation and does not modify the element.
584
610
  """
585
611
  sb = _get_sb()
586
612
 
587
613
  if attribute:
588
- return sb.get_element_attribute(selector, attribute)
614
+ return sb.get_attribute(selector, attribute)
589
615
 
590
616
  return sb.get_element_attributes(selector)
591
617
 
592
618
 
593
619
  @mcp.tool()
594
620
  @handle_sb_errors
595
- def check_for_condition(
596
- check: Literal["present", "visible", "count", "text_visible"] = "visible",
621
+ def check_condition(
622
+ check: Literal["present", "visible"] = "visible",
597
623
  selector: str = "body",
598
624
  text: str | None = None,
599
625
  ) -> Any:
600
- """Immediately inspect the current state of an element or page.
626
+ """Check the current state of an element or text without waiting
627
+ for the condition to become true.
601
628
 
602
- Use this tool when you need an observation of the current state and do
603
- NOT want to wait for a condition. For waiting behavior, use wait_for.
604
- For an expectation that should fail as an assertion, use assert_condition.
629
+ Use this tool when you need an immediate boolean observation of the current
630
+ page state. Use wait_for when the condition may become true later and the
631
+ workflow should wait for it. Use assert_condition when the condition is an
632
+ expected requirement and failure should be treated as an assertion error.
605
633
 
606
634
  Args:
607
635
  check:
608
- - "present": Return whether at least one matching element exists.
609
- - "visible": Return whether the matching element is visible.
610
- - "count": Return the number of matching elements. This check may
611
- wait up to 1 second for a match.
612
- - "text_visible": Return whether the specified text is visible
613
- within the selected element. Requires text.
614
- selector: CSS selector or SeleniumBase selector for the element.
615
- Defaults to "body".
616
- text: Text to check when check="text_visible".
636
+ The element state to inspect when text is not provided:
637
+ - "present": Return True when at least one matching element exists.
638
+ - "visible": Return True when the matching element is visible.
639
+ Defaults to "visible".
640
+ `check` is ignored when `text` is provided.
641
+
642
+ selector:
643
+ CSS selector or SeleniumBase selector identifying the element to
644
+ inspect. Defaults to "body". When `text` is provided, this also
645
+ identifies the element whose visible text is checked.
646
+
647
+ text:
648
+ Optional text to check for visibility within `selector`. When
649
+ provided, this takes precedence over `check`; the tool checks text
650
+ visibility instead of element presence or visibility. Use this when
651
+ the question is "Is this text currently visible?" rather than
652
+ whether the element itself is present or visible.
617
653
 
618
654
  Returns:
619
- A boolean for present/visible/text_visible, or an integer count for
620
- count. Missing elements do not cause an exception for these checks.
655
+ True or False indicating whether the requested condition is currently
656
+ satisfied. Missing elements return False rather than raising an
657
+ exception.
621
658
 
622
659
  Tool selection:
623
- - Immediate yes/no/count observation -> use check_for_condition.
624
- - Wait until a state becomes true/false -> use wait_for.
660
+ - Immediate boolean observation -> use check_condition.
661
+ - Wait for an element or text condition to become true/false ->
662
+ use wait_for.
625
663
  - Verify an expected condition and fail when it is not met ->
626
664
  use assert_condition.
665
+ - Need the number or details of matching elements -> use find_elements.
666
+ - Need to read the actual page or element content -> use get_content.
627
667
 
628
- Note:
629
- Except for count's short lookup, this tool does not wait for elements
630
- to appear. Use wait_for when page timing matters.
668
+ Notes:
669
+ This tool does not intentionally wait for elements or text to appear.
670
+ It is intended for checking the current state only. If page timing or
671
+ asynchronous loading matters, use wait_for instead.
672
+
673
+ When `text` is provided, `check` is ignored.
631
674
  """
632
675
  sb = _get_sb()
633
676
 
677
+ if text:
678
+ return sb.is_text_visible(text, selector)
679
+
634
680
  if check == "present":
635
681
  return sb.is_element_present(selector)
636
682
 
637
683
  if check == "visible":
638
684
  return sb.is_element_visible(selector)
639
685
 
640
- if check == "count":
641
- return len(sb.find_elements(selector, timeout=1))
642
-
643
- if check == "text_visible":
644
- if text is None:
645
- return (
646
- "Error: The 'text_visible' check requires value for 'text'."
647
- )
648
- return sb.is_text_visible(text, selector)
649
-
650
- return (
651
- f"Error: unknown check '{check}'. "
652
- "Use 'present', 'visible', 'count', or 'text_visible'."
653
- )
686
+ return f"Error: unknown check '{check}'. Use 'present' or 'visible'."
654
687
 
655
688
 
656
689
  # ---------------------------------------------------------------------------
@@ -665,7 +698,7 @@ def click(
665
698
  all_matches: bool = False,
666
699
  only_if_visible: bool = False,
667
700
  parent_selector: str | None = None,
668
- timeout: int | float | None = 7,
701
+ timeout: float = 7,
669
702
  scroll: bool = True,
670
703
  ) -> str:
671
704
  """Click one or more elements matching a selector.
@@ -815,7 +848,7 @@ def type_text(
815
848
  "set_value",
816
849
  "clear_only",
817
850
  ] = "fill_input",
818
- timeout: int | float | None = 7,
851
+ timeout: float = 7,
819
852
  ) -> str:
820
853
  """Fill, append, fast-type, directly set, or clear a form control.
821
854
 
@@ -973,14 +1006,18 @@ def wait_for(
973
1006
  ] = "visible",
974
1007
  selector: str | None = None,
975
1008
  text: str | None = None,
976
- timeout: int | float | None = 7,
1009
+ timeout: float = 7,
977
1010
  ) -> str:
978
1011
  """Wait until an element or text reaches a requested state.
979
1012
 
1013
+ When `text` is provided, a `state` of 'present' or 'visible' both wait
1014
+ for the text to appear within the selector, and a `state` of 'not_visible'
1015
+ or 'absent' both wait for the text to be absent from the selector.
1016
+
980
1017
  Use this tool when the page is dynamic and an automation step must wait
981
1018
  for a condition before continuing.
982
1019
 
983
- Unlike check_for_condition, this tool intentionally waits.
1020
+ Unlike check_condition, this tool intentionally waits.
984
1021
  Unlike assert_condition, its purpose is synchronization
985
1022
  rather than validating a test expectation.
986
1023
 
@@ -990,29 +1027,38 @@ def wait_for(
990
1027
  - "visible": Wait until the matching element is visible.
991
1028
  - "not_visible": Wait until the matching element is not visible.
992
1029
  - "absent": Wait until the matching element no longer exists.
993
- Ignored when text is provided.
1030
+ (This is handled differently when text is provided.)
994
1031
  selector: CSS selector or SeleniumBase selector for the element.
995
1032
  Required unless text is supplied.
996
- text: If supplied, wait for this text to appear within selector
997
- (or within "body" when selector is omitted).
998
- timeout: Maximum seconds to wait. Defaults to 7 seconds.
1033
+ text: If supplied and is not None, a `state` of 'present' or 'visible'
1034
+ both wait for the text to appear within the selector, and a `state`
1035
+ of 'not_visible' or 'absent' both wait for the text to be absent
1036
+ from the selector (or within "body" when selector is omitted).
1037
+ timeout: Maximum seconds to wait for the requested state to be true.
1038
+ (Defaults to 7 seconds.)
999
1039
 
1000
1040
  Returns:
1001
1041
  A confirmation when the requested condition is reached.
1002
1042
 
1003
1043
  Tool selection:
1004
- - Check current state immediately -> use check_for_condition.
1044
+ - Check current state immediately -> use check_condition.
1005
1045
  - Wait for a state/content transition -> use wait_for.
1006
1046
  - Verify an expected value/condition -> use assert_condition.
1007
1047
  """
1008
1048
  sb = _get_sb()
1009
1049
 
1010
- if selector is None and text is None:
1011
- return "Error: `selector` and `text` cannot both be None."
1050
+ if not selector and not text:
1051
+ return "Error: `selector` and `text` cannot both be empty."
1012
1052
 
1013
- if text is not None:
1014
- sb.wait_for_text(text, selector or "body", timeout=timeout)
1015
- return f"Text '{text}' appeared in {selector or 'body'}."
1053
+ if text:
1054
+ if state == "present" or state == "visible":
1055
+ sb.wait_for_text(text, selector or "body", timeout=timeout)
1056
+ return f"Text '{text}' found in element {selector or 'body'}."
1057
+ if state == "absent" or state == "not_visible":
1058
+ sb.wait_for_text_not_visible(
1059
+ text, selector or "body", timeout=timeout
1060
+ )
1061
+ return f"Text '{text}' not found in element {selector or 'body'}."
1016
1062
 
1017
1063
  if state == "present":
1018
1064
  sb.wait_for_element_present(selector, timeout=timeout)
@@ -1045,14 +1091,14 @@ def assert_condition(
1045
1091
  selector: str | None = None,
1046
1092
  expected: str | None = None,
1047
1093
  exact: bool = False,
1048
- timeout: int | float | None = 7,
1094
+ timeout: float = 7,
1049
1095
  ) -> str:
1050
1096
  """Verify an expected browser condition and fail when it is not met.
1051
1097
 
1052
- Use this tool for explicit verification. Unlike check_for_condition,
1098
+ Use this tool for explicit verification. Unlike check_condition,
1053
1099
  which simply reports True or False on the current state,
1054
1100
  assert_condition treats a failed expectation as an error.
1055
- Unlike wait_for, URL/title checks do not wait.
1101
+ (Note that URL/title checks do not wait for the 'timeout'.)
1056
1102
 
1057
1103
  Args:
1058
1104
  check:
@@ -1070,6 +1116,7 @@ def assert_condition(
1070
1116
  exact: For check="text_visible", require exact text
1071
1117
  rather than a substring.
1072
1118
  timeout: Maximum seconds to wait for element/text checks.
1119
+ (Ignored for title and URL checks.)
1073
1120
 
1074
1121
  Returns:
1075
1122
  A confirmation when the expectation passes.
@@ -1079,7 +1126,7 @@ def assert_condition(
1079
1126
  fails; the MCP error wrapper converts it to a descriptive result.
1080
1127
 
1081
1128
  Tool selection:
1082
- - Just inspect current state -> use check_for_condition.
1129
+ - Just inspect current state -> use check_condition.
1083
1130
  - Wait for a condition to become true -> use wait_for.
1084
1131
  - Verify that an expected condition is true -> use assert_condition.
1085
1132
  """
@@ -1249,6 +1296,27 @@ def manage_storage(
1249
1296
  Storage belongs to the current page origin. Values from one website
1250
1297
  are not generally available to another origin.
1251
1298
  """
1299
+ sb = _get_sb()
1300
+
1301
+ if action not in ("get", "set"):
1302
+ return "Error: action must be 'get' or 'set'."
1303
+
1304
+ if action == "set" and value is None:
1305
+ return "Error: value is required when action='set'."
1306
+
1307
+ if storage == "local":
1308
+ if action == "get":
1309
+ return sb.get_local_storage_item(key)
1310
+ sb.set_local_storage_item(key, value)
1311
+ return f"Set localStorage[{key!r}]"
1312
+
1313
+ if storage == "session":
1314
+ if action == "get":
1315
+ return sb.get_session_storage_item(key)
1316
+ sb.set_session_storage_item(key, value)
1317
+ return f"Set sessionStorage[{key!r}]"
1318
+
1319
+ return f"Error: unknown storage '{storage}'. Use 'local' or 'session'."
1252
1320
 
1253
1321
 
1254
1322
  # ---------------------------------------------------------------------------
@@ -1280,20 +1348,22 @@ def scroll(
1280
1348
 
1281
1349
  if direction == "up":
1282
1350
  sb.scroll_up(amount=amount)
1351
+ return f"Scrolled up by {amount}%."
1283
1352
  elif direction == "down":
1284
1353
  sb.scroll_down(amount=amount)
1354
+ return f"Scrolled down by {amount}%."
1285
1355
  elif direction == "top":
1286
1356
  sb.scroll_to_top()
1357
+ return "Scrolled to the top."
1287
1358
  elif direction == "bottom":
1288
1359
  sb.scroll_to_bottom()
1360
+ return "Scrolled to the bottom."
1289
1361
  else:
1290
1362
  return (
1291
1363
  f"Error: unknown direction '{direction}'. "
1292
1364
  "Use 'up', 'down', 'top', or 'bottom'."
1293
1365
  )
1294
1366
 
1295
- return f"Scrolled {direction}."
1296
-
1297
1367
 
1298
1368
  # ---------------------------------------------------------------------------
1299
1369
  # Windows & tabs
@@ -1371,7 +1441,7 @@ def manage_tabs(
1371
1441
  """List, open, switch between, or close browser tabs.
1372
1442
 
1373
1443
  Use this tool for tab management. Browser navigation within the current
1374
- tab belongs to navigate and navigate_history.
1444
+ tab belongs to navigate and manage_history.
1375
1445
 
1376
1446
  Args:
1377
1447
  action:
@@ -1462,7 +1532,7 @@ def solve_captcha() -> str:
1462
1532
  1. Inspect the page with get_content when you need to determine
1463
1533
  whether CAPTCHA-related controls are present.
1464
1534
  2. Call solve_captcha to attempt the interaction.
1465
- 3. Use get_page_info, get_content, check_for_condition,
1535
+ 3. Use get_page_info, get_content, check_condition,
1466
1536
  or manage_cookies to inspect resulting page/session state.
1467
1537
 
1468
1538
  Returns:
@@ -1587,7 +1657,7 @@ def run_javascript(expression: str) -> Any:
1587
1657
 
1588
1658
  @mcp.tool()
1589
1659
  @handle_sb_errors
1590
- def wait_seconds(seconds: int | float) -> str:
1660
+ def wait_seconds(seconds: float) -> str:
1591
1661
  """Block the MCP server for a fixed number of seconds.
1592
1662
 
1593
1663
  This is a low-level timing tool. It performs no browser action while
@@ -49,7 +49,7 @@ pytest-html==4.0.2
49
49
  pytest-metadata==3.1.1
50
50
  pytest-ordering==0.6
51
51
  pytest-rerunfailures==16.3;python_version=="3.10"
52
- pytest-rerunfailures==16.6;python_version>="3.11"
52
+ pytest-rerunfailures==16.6.1;python_version>="3.11"
53
53
  pytest-xdist==3.8.0
54
54
  parameterized==0.9.0
55
55
  behave==1.2.6
@@ -1,2 +1,2 @@
1
1
  # seleniumbase package
2
- __version__ = "4.53.6"
2
+ __version__ = "4.53.7"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: seleniumbase
3
- Version: 4.53.6
3
+ Version: 4.53.7
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
@@ -109,7 +109,7 @@ Requires-Dist: pytest-html==4.0.2
109
109
  Requires-Dist: pytest-metadata==3.1.1
110
110
  Requires-Dist: pytest-ordering==0.6
111
111
  Requires-Dist: pytest-rerunfailures==16.3; python_version == "3.10"
112
- Requires-Dist: pytest-rerunfailures==16.6; python_version >= "3.11"
112
+ Requires-Dist: pytest-rerunfailures==16.6.1; python_version >= "3.11"
113
113
  Requires-Dist: pytest-xdist==3.8.0
114
114
  Requires-Dist: parameterized==0.9.0
115
115
  Requires-Dist: behave==1.2.6
@@ -70,7 +70,7 @@ pytest-rerunfailures==16.3
70
70
  [:python_version >= "3.11"]
71
71
  websockets>=16.1.1
72
72
  pytest==9.1.1
73
- pytest-rerunfailures==16.6
73
+ pytest-rerunfailures==16.6.1
74
74
 
75
75
  [allure]
76
76
  allure-pytest>=2.16.0
@@ -215,7 +215,7 @@ setup(
215
215
  'pytest-metadata==3.1.1',
216
216
  'pytest-ordering==0.6',
217
217
  'pytest-rerunfailures==16.3;python_version=="3.10"',
218
- 'pytest-rerunfailures==16.6;python_version>="3.11"',
218
+ 'pytest-rerunfailures==16.6.1;python_version>="3.11"',
219
219
  'pytest-xdist==3.8.0',
220
220
  'parameterized==0.9.0',
221
221
  'behave==1.2.6', # Newer ones had issues
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes