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.
- {seleniumbase-4.53.3/seleniumbase.egg-info → seleniumbase-4.53.5}/PKG-INFO +3 -3
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/mcp_servers/server.py +152 -109
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/requirements.txt +1 -1
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/__version__.py +1 -1
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/browser_launcher.py +1 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/proxy_helper.py +7 -1
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/sb_cdp.py +22 -1
- {seleniumbase-4.53.3 → seleniumbase-4.53.5/seleniumbase.egg-info}/PKG-INFO +3 -3
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase.egg-info/requires.txt +2 -2
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/setup.py +2 -2
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/.gitignore +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/LICENSE +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/MANIFEST.in +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/README.md +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/install.sh +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/mcp_servers/__init__.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/pyproject.toml +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/pytest.ini +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/sbase/__init__.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/sbase/__main__.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/sbase/steps.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/__init__.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/__main__.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/behave/__init__.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/behave/behave_helper.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/behave/behave_sb.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/behave/steps.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/common/__init__.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/common/decorators.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/common/encryption.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/common/exceptions.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/common/obfuscate.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/common/unobfuscate.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/config/__init__.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/config/ad_block_list.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/config/proxy_list.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/config/settings.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/console_scripts/__init__.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/console_scripts/logo_helper.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/console_scripts/rich_helper.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/console_scripts/run.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/console_scripts/sb_commander.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/console_scripts/sb_install.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/console_scripts/sb_objectify.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/console_scripts/sb_print.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/console_scripts/sb_recorder.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/__init__.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/application_manager.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/capabilities_parser.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/colored_traceback.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/create_db_tables.sql +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/detect_b_ver.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/download_helper.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/encoded_images.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/jqc_helper.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/log_helper.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/mysql.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/nest_asyncio.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/recorder_helper.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/report_helper.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/s3_manager.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/sb_driver.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/session_helper.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/settings_parser.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/style_sheet.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/testcase_manager.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/tour_helper.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/core/visual_helper.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/drivers/__init__.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/drivers/brave_drivers/__init__.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/drivers/cft_drivers/__init__.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/drivers/chromium_drivers/__init__.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/drivers/chs_drivers/__init__.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/drivers/comet_drivers/__init__.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/drivers/opera_drivers/__init__.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/extensions/__init__.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/extensions/ad_block.zip +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/extensions/disable_csp.zip +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/extensions/recorder.zip +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/extensions/sbase_ext.zip +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/fixtures/__init__.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/fixtures/base_case.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/fixtures/constants.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/fixtures/css_to_xpath.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/fixtures/errors.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/fixtures/js_utils.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/fixtures/page_actions.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/fixtures/page_utils.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/fixtures/shared_utils.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/fixtures/unittest_helper.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/fixtures/words.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/fixtures/xpath_to_css.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/js_code/__init__.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/js_code/active_css_js.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/js_code/live_js.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/js_code/recorder_js.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/masterqa/__init__.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/masterqa/master_qa.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/plugins/__init__.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/plugins/base_plugin.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/plugins/basic_test_info.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/plugins/driver_manager.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/plugins/page_source.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/plugins/pytest_plugin.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/plugins/sb_manager.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/plugins/screen_shots.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/plugins/selenium_plugin.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/resources/__init__.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/translate/__init__.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/translate/chinese.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/translate/dutch.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/translate/french.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/translate/italian.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/translate/japanese.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/translate/korean.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/translate/master_dict.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/translate/portuguese.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/translate/russian.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/translate/spanish.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/translate/translator.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/undetected/__init__.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/undetected/cdp.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/undetected/cdp_driver/__init__.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/undetected/cdp_driver/browser.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/undetected/cdp_driver/cdp_util.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/undetected/cdp_driver/config.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/undetected/cdp_driver/connection.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/undetected/cdp_driver/element.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/undetected/cdp_driver/tab.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/undetected/dprocess.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/undetected/options.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/undetected/patcher.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/undetected/reactor.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/undetected/webelement.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/utilities/__init__.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_grid/font_color +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase.egg-info/SOURCES.txt +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase.egg-info/dependency_links.txt +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase.egg-info/entry_points.txt +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/seleniumbase.egg-info/top_level.txt +0 -0
- {seleniumbase-4.53.3 → seleniumbase-4.53.5}/setup.cfg +0 -0
- {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
|
+
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.
|
|
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.
|
|
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
|
|
34
|
-
treat failure as an assertion error.
|
|
35
|
-
- Use click/
|
|
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,
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
712
|
-
|
|
713
|
-
|
|
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
|
|
725
|
+
"""Hover over an element, optionally click another element, or drag-&-drop.
|
|
716
726
|
|
|
717
|
-
Use this for
|
|
718
|
-
|
|
727
|
+
Use this tool for hover interactions, hover-triggered menus, and
|
|
728
|
+
drag-and-drop operations.
|
|
719
729
|
|
|
720
730
|
Args:
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
Useful for a submenu item or dropdown option revealed by hover.
|
|
731
|
+
selector1:
|
|
732
|
+
The primary element selector.
|
|
724
733
|
|
|
725
|
-
|
|
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
|
-
|
|
731
|
-
|
|
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
|
-
|
|
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
|
-
|
|
739
|
-
|
|
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
|
-
|
|
747
|
-
|
|
747
|
+
Required for action="drag_and_drop", where it identifies the
|
|
748
|
+
destination/drop target.
|
|
748
749
|
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
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
|
-
|
|
754
|
-
|
|
755
|
-
pointerup.
|
|
769
|
+
For action="drag_and_drop", selector1 is the source and selector2
|
|
770
|
+
is the destination.
|
|
756
771
|
"""
|
|
757
|
-
_get_sb()
|
|
758
|
-
|
|
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
|
|
798
|
+
def type_text(
|
|
764
799
|
selector: str,
|
|
765
800
|
text: str = "",
|
|
766
801
|
mode: Literal[
|
|
767
|
-
"
|
|
802
|
+
"fill_input",
|
|
768
803
|
"append",
|
|
769
|
-
"set_value",
|
|
770
804
|
"fast_type",
|
|
771
|
-
"
|
|
772
|
-
|
|
805
|
+
"set_value",
|
|
806
|
+
"clear_only",
|
|
807
|
+
] = "fill_input",
|
|
773
808
|
timeout: int | float | None = 7,
|
|
774
809
|
) -> str:
|
|
775
|
-
"""
|
|
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.
|
|
817
|
+
text: Text to enter or set. Not used when mode="clear_only".
|
|
783
818
|
mode:
|
|
784
|
-
- "
|
|
785
|
-
- "append": Keep the existing value and
|
|
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
|
-
|
|
790
|
-
- "
|
|
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
|
|
795
|
-
- Add text without clearing -> mode="append".
|
|
796
|
-
-
|
|
797
|
-
-
|
|
798
|
-
- Empty a field -> mode="
|
|
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 == "
|
|
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 == "
|
|
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 '
|
|
851
|
+
"Use 'fill_input', 'append', 'fast_type', "
|
|
852
|
+
"'set_value', or 'clear_only'."
|
|
816
853
|
)
|
|
817
854
|
|
|
818
|
-
return f"
|
|
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
|
|
900
|
+
def focus_on(
|
|
864
901
|
selector: str,
|
|
865
902
|
action: Literal[
|
|
903
|
+
"scroll_to_element",
|
|
866
904
|
"focus",
|
|
867
905
|
"highlight",
|
|
868
|
-
|
|
869
|
-
] = "focus",
|
|
906
|
+
] = "scroll_to_element",
|
|
870
907
|
) -> str:
|
|
871
|
-
"""
|
|
908
|
+
"""Scroll to, focus, or highlight an element.
|
|
872
909
|
|
|
873
|
-
Use this tool when an element needs to be
|
|
874
|
-
|
|
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
|
|
891
|
-
- Hover -> use
|
|
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 == "
|
|
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 '
|
|
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
|
|
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
|
|
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
|
|
1025
|
+
def assert_condition(
|
|
987
1026
|
check: Literal[
|
|
988
1027
|
"element_present",
|
|
989
1028
|
"element_visible",
|
|
990
|
-
"
|
|
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,
|
|
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
|
-
- "
|
|
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
|
-
|
|
1017
|
-
expected: Expected text/title/URL value for
|
|
1018
|
-
url_contains.
|
|
1019
|
-
exact: For check="
|
|
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
|
|
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 (
|
|
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 == "
|
|
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
|
-
|
|
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
|
|
1225
|
-
|
|
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
|
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
# seleniumbase package
|
|
2
|
-
__version__ = "4.53.
|
|
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
|
|
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
|
|
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
|
+
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|