seleniumbase 4.53.4__tar.gz → 4.53.5__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {seleniumbase-4.53.4/seleniumbase.egg-info → seleniumbase-4.53.5}/PKG-INFO +2 -2
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/mcp_servers/server.py +67 -50
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/__version__.py +1 -1
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/browser_launcher.py +1 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/proxy_helper.py +7 -1
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/sb_cdp.py +22 -1
- {seleniumbase-4.53.4 → seleniumbase-4.53.5/seleniumbase.egg-info}/PKG-INFO +2 -2
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase.egg-info/requires.txt +1 -1
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/setup.py +1 -1
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/.gitignore +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/LICENSE +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/MANIFEST.in +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/README.md +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/install.sh +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/mcp_servers/__init__.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/pyproject.toml +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/pytest.ini +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/requirements.txt +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/sbase/__init__.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/sbase/__main__.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/sbase/steps.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/__init__.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/__main__.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/behave/__init__.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/behave/behave_helper.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/behave/behave_sb.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/behave/steps.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/common/__init__.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/common/decorators.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/common/encryption.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/common/exceptions.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/common/obfuscate.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/common/unobfuscate.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/config/__init__.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/config/ad_block_list.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/config/proxy_list.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/config/settings.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/console_scripts/__init__.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/console_scripts/logo_helper.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/console_scripts/rich_helper.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/console_scripts/run.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/console_scripts/sb_behave_gui.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/console_scripts/sb_caseplans.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/console_scripts/sb_commander.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/console_scripts/sb_install.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/console_scripts/sb_mkchart.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/console_scripts/sb_mkdir.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/console_scripts/sb_mkfile.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/console_scripts/sb_mkpres.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/console_scripts/sb_mkrec.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/console_scripts/sb_objectify.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/console_scripts/sb_print.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/console_scripts/sb_recorder.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/__init__.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/application_manager.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/capabilities_parser.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/colored_traceback.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/create_db_tables.sql +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/detect_b_ver.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/download_helper.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/encoded_images.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/jqc_helper.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/log_helper.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/mysql.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/nest_asyncio.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/recorder_helper.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/report_helper.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/s3_manager.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/sb_driver.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/session_helper.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/settings_parser.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/style_sheet.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/testcase_manager.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/tour_helper.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/core/visual_helper.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/drivers/__init__.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/drivers/brave_drivers/__init__.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/drivers/cft_drivers/__init__.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/drivers/chromium_drivers/__init__.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/drivers/chs_drivers/__init__.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/drivers/comet_drivers/__init__.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/drivers/opera_drivers/__init__.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/extensions/__init__.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/extensions/ad_block.zip +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/extensions/disable_csp.zip +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/extensions/recorder.zip +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/extensions/sbase_ext.zip +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/fixtures/__init__.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/fixtures/base_case.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/fixtures/constants.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/fixtures/css_to_xpath.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/fixtures/errors.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/fixtures/js_utils.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/fixtures/page_actions.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/fixtures/page_utils.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/fixtures/shared_utils.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/fixtures/unittest_helper.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/fixtures/words.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/fixtures/xpath_to_css.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/js_code/__init__.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/js_code/active_css_js.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/js_code/live_js.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/js_code/recorder_js.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/masterqa/__init__.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/masterqa/master_qa.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/plugins/__init__.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/plugins/base_plugin.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/plugins/basic_test_info.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/plugins/db_reporting_plugin.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/plugins/driver_manager.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/plugins/page_source.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/plugins/pytest_plugin.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/plugins/s3_logging_plugin.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/plugins/sb_manager.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/plugins/screen_shots.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/plugins/selenium_plugin.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/resources/__init__.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/translate/__init__.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/translate/chinese.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/translate/dutch.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/translate/french.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/translate/italian.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/translate/japanese.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/translate/korean.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/translate/master_dict.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/translate/portuguese.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/translate/russian.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/translate/spanish.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/translate/translator.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/undetected/__init__.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/undetected/cdp.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/undetected/cdp_driver/__init__.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/undetected/cdp_driver/_contradict.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/undetected/cdp_driver/browser.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/undetected/cdp_driver/cdp_util.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/undetected/cdp_driver/config.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/undetected/cdp_driver/connection.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/undetected/cdp_driver/element.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/undetected/cdp_driver/tab.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/undetected/dprocess.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/undetected/options.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/undetected/patcher.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/undetected/reactor.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/undetected/webelement.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/utilities/__init__.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_grid/__init__.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_grid/download_selenium_server.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_grid/font_color +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_grid/grid-hub +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_grid/grid-node +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_grid/grid_hub.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_grid/grid_node.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_grid/register-grid-node.bat +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_grid/register-grid-node.sh +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_ide/__init__.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_ide/convert_ide.py +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase.egg-info/SOURCES.txt +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase.egg-info/dependency_links.txt +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase.egg-info/entry_points.txt +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase.egg-info/top_level.txt +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/setup.cfg +0 -0
- {seleniumbase-4.53.4 → seleniumbase-4.53.5}/virtualenv_install.sh +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: seleniumbase
|
|
3
|
-
Version: 4.53.
|
|
3
|
+
Version: 4.53.5
|
|
4
4
|
Summary: SeleniumBase is a framework for web crawling, scraping, and testing. Supports pytest. CDP Mode adds stealth. Includes many tools.
|
|
5
5
|
Home-page: https://github.com/seleniumbase/SeleniumBase
|
|
6
6
|
Author: Michael Mintz
|
|
@@ -155,7 +155,7 @@ Requires-Dist: pyee>=13.0.1; extra == "playwright"
|
|
|
155
155
|
Provides-Extra: pyautogui
|
|
156
156
|
Requires-Dist: PyAutoGUI>=0.9.54; platform_system != "Linux" and extra == "pyautogui"
|
|
157
157
|
Provides-Extra: uv
|
|
158
|
-
Requires-Dist: uv>=0.12.
|
|
158
|
+
Requires-Dist: uv>=0.12.9; extra == "uv"
|
|
159
159
|
Dynamic: author
|
|
160
160
|
Dynamic: author-email
|
|
161
161
|
Dynamic: classifier
|
|
@@ -30,9 +30,9 @@ Tool-selection philosophy:
|
|
|
30
30
|
elements as structured data.
|
|
31
31
|
- Use check_state for an immediate, non-waiting state check.
|
|
32
32
|
- Use wait_for when the agent needs to wait for a condition to become true.
|
|
33
|
-
- Use
|
|
34
|
-
treat failure as an assertion error.
|
|
35
|
-
- Use 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
36
|
interactions and element positioning.
|
|
37
37
|
"""
|
|
38
38
|
from __future__ import annotations
|
|
@@ -93,7 +93,7 @@ def start_browser(
|
|
|
93
93
|
"""Launch a persistent SeleniumBase Pure CDP Mode browser session.
|
|
94
94
|
|
|
95
95
|
This must be called before browser interaction tools such as navigate,
|
|
96
|
-
get_content, click,
|
|
96
|
+
get_content, click, type_text, or find_elements. The same browser
|
|
97
97
|
session remains active across subsequent MCP tool calls until
|
|
98
98
|
close_browser is called or the server process exits.
|
|
99
99
|
|
|
@@ -277,7 +277,7 @@ def get_page_info() -> dict | str:
|
|
|
277
277
|
- Need information about matching elements -> use find_elements.
|
|
278
278
|
- Need an immediate state check -> use check_state.
|
|
279
279
|
- Need to wait for a condition -> use wait_for.
|
|
280
|
-
- Need to verify an expected condition -> use
|
|
280
|
+
- Need to verify an expected condition -> use assert_condition.
|
|
281
281
|
|
|
282
282
|
Unlike a dedicated browser-status tool, get_page_info is the single
|
|
283
283
|
source of browser/page metadata. If no browser session is active, it
|
|
@@ -549,15 +549,26 @@ def get_attributes(
|
|
|
549
549
|
) -> Any:
|
|
550
550
|
"""Read HTML attributes from a matching element.
|
|
551
551
|
|
|
552
|
+
Use this tool when you need the value of one or more HTML attributes
|
|
553
|
+
such as href, src, value, class, id, name, type, aria-label, or data-*.
|
|
554
|
+
|
|
552
555
|
Args:
|
|
553
556
|
selector: CSS selector or SeleniumBase text-matching selector for
|
|
554
557
|
the target element.
|
|
555
558
|
attribute: Specific HTML attribute to retrieve. When omitted, return
|
|
556
|
-
all
|
|
559
|
+
all HTML attributes of the element as a dictionary.
|
|
557
560
|
|
|
558
561
|
Returns:
|
|
559
562
|
The requested attribute value, or a dictionary containing all
|
|
560
|
-
attributes when attribute is omitted.
|
|
563
|
+
HTML attributes of the element when attribute is omitted.
|
|
564
|
+
|
|
565
|
+
Tool selection:
|
|
566
|
+
- Need one or more HTML attribute values from a specific element ->
|
|
567
|
+
use this tool.
|
|
568
|
+
- Need to discover multiple matching elements or inspect their text ->
|
|
569
|
+
use 'find_elements'.
|
|
570
|
+
- Need visible text or HTML content -> use 'get_content'.
|
|
571
|
+
- Need to check presence or visibility -> use 'check_state'.
|
|
561
572
|
|
|
562
573
|
This is a read-only operation and does not modify the element.
|
|
563
574
|
"""
|
|
@@ -580,7 +591,7 @@ def check_state(
|
|
|
580
591
|
|
|
581
592
|
Use this tool when you need an observation of the current state and do
|
|
582
593
|
NOT want to wait for a condition. For waiting behavior, use wait_for.
|
|
583
|
-
For an expectation that should fail as an assertion, use
|
|
594
|
+
For an expectation that should fail as an assertion, use assert_condition.
|
|
584
595
|
|
|
585
596
|
Args:
|
|
586
597
|
check:
|
|
@@ -602,7 +613,7 @@ def check_state(
|
|
|
602
613
|
- Immediate yes/no/count observation -> use check_state.
|
|
603
614
|
- Wait until a state becomes true/false -> use wait_for.
|
|
604
615
|
- Verify an expected condition and fail when it is not met ->
|
|
605
|
-
use
|
|
616
|
+
use assert_condition.
|
|
606
617
|
|
|
607
618
|
Note:
|
|
608
619
|
Except for count's short lookup, this tool does not wait for elements
|
|
@@ -784,62 +795,64 @@ def hover_with_action(
|
|
|
784
795
|
|
|
785
796
|
@mcp.tool()
|
|
786
797
|
@handle_sb_errors
|
|
787
|
-
def
|
|
798
|
+
def type_text(
|
|
788
799
|
selector: str,
|
|
789
800
|
text: str = "",
|
|
790
801
|
mode: Literal[
|
|
791
|
-
"
|
|
802
|
+
"fill_input",
|
|
792
803
|
"append",
|
|
793
|
-
"set_value",
|
|
794
804
|
"fast_type",
|
|
795
|
-
"
|
|
796
|
-
|
|
805
|
+
"set_value",
|
|
806
|
+
"clear_only",
|
|
807
|
+
] = "fill_input",
|
|
797
808
|
timeout: int | float | None = 7,
|
|
798
809
|
) -> str:
|
|
799
|
-
"""
|
|
810
|
+
"""Fill, append, fast-type, directly set, or clear a form control.
|
|
800
811
|
|
|
801
812
|
Use this tool for input elements, textareas, and contenteditable elements.
|
|
802
813
|
|
|
803
814
|
Args:
|
|
804
815
|
selector: CSS selector or SeleniumBase selector identifying the
|
|
805
816
|
input, textarea, or contenteditable element.
|
|
806
|
-
text: Text to enter or set.
|
|
817
|
+
text: Text to enter or set. Not used when mode="clear_only".
|
|
807
818
|
mode:
|
|
808
|
-
- "
|
|
809
|
-
- "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.
|
|
810
822
|
- "set_value": Set the value directly and immediately. This can
|
|
811
823
|
be useful for fast form filling but does not simulate normal
|
|
812
|
-
key events.
|
|
813
|
-
|
|
814
|
-
- "
|
|
824
|
+
key events. It can also be used to handle input sliders,
|
|
825
|
+
e.g. 'input[type="range"]'.
|
|
826
|
+
- "clear_only": Empty the text field; text is ignored.
|
|
815
827
|
timeout: Maximum seconds to wait for the target element.
|
|
816
828
|
|
|
817
829
|
Tool selection:
|
|
818
|
-
- Normal
|
|
819
|
-
- Add text without clearing -> mode="append".
|
|
820
|
-
-
|
|
821
|
-
-
|
|
822
|
-
- 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".
|
|
823
835
|
"""
|
|
824
836
|
sb = _get_sb()
|
|
825
837
|
|
|
826
|
-
if mode == "
|
|
838
|
+
if mode == "fill_input":
|
|
827
839
|
sb.type(selector, text, timeout=timeout)
|
|
828
840
|
elif mode == "append":
|
|
829
841
|
sb.send_keys(selector, text, timeout=timeout)
|
|
830
|
-
elif mode == "set_value":
|
|
831
|
-
sb.set_value(selector, text, timeout=timeout)
|
|
832
842
|
elif mode == "fast_type":
|
|
833
843
|
sb.fast_type(selector, text, timeout=timeout)
|
|
834
|
-
elif mode == "
|
|
844
|
+
elif mode == "set_value":
|
|
845
|
+
sb.set_value(selector, text, timeout=timeout)
|
|
846
|
+
elif mode == "clear_only":
|
|
835
847
|
sb.clear_input(selector, timeout=timeout)
|
|
836
848
|
else:
|
|
837
849
|
return (
|
|
838
850
|
f"Error: unknown mode '{mode}'. "
|
|
839
|
-
"Use '
|
|
851
|
+
"Use 'fill_input', 'append', 'fast_type', "
|
|
852
|
+
"'set_value', or 'clear_only'."
|
|
840
853
|
)
|
|
841
854
|
|
|
842
|
-
return f"
|
|
855
|
+
return f"type_text(mode={mode!r}) done for {selector}"
|
|
843
856
|
|
|
844
857
|
|
|
845
858
|
@mcp.tool()
|
|
@@ -915,7 +928,7 @@ def focus_on(
|
|
|
915
928
|
- Focus an element -> use focus_on(action="focus").
|
|
916
929
|
- Highlight element for debugging -> use focus_on(action="highlight").
|
|
917
930
|
- Click -> use click.
|
|
918
|
-
- Type into a
|
|
931
|
+
- Type text into a text field -> use type_text.
|
|
919
932
|
- Hover -> use hover_with_action.
|
|
920
933
|
"""
|
|
921
934
|
sb = _get_sb()
|
|
@@ -957,7 +970,7 @@ def wait_for(
|
|
|
957
970
|
Use this tool when the page is dynamic and an automation step must wait
|
|
958
971
|
for a condition before continuing.
|
|
959
972
|
|
|
960
|
-
Unlike check_state, this tool intentionally waits. Unlike
|
|
973
|
+
Unlike check_state, this tool intentionally waits. Unlike assert_condition,
|
|
961
974
|
its purpose is synchronization rather than validating a test expectation.
|
|
962
975
|
|
|
963
976
|
Args:
|
|
@@ -979,7 +992,7 @@ def wait_for(
|
|
|
979
992
|
Tool selection:
|
|
980
993
|
- Check current state immediately -> use check_state.
|
|
981
994
|
- Wait for a state/content transition -> use wait_for.
|
|
982
|
-
- Verify an expected value/condition -> use
|
|
995
|
+
- Verify an expected value/condition -> use assert_condition.
|
|
983
996
|
"""
|
|
984
997
|
sb = _get_sb()
|
|
985
998
|
|
|
@@ -1009,11 +1022,11 @@ def wait_for(
|
|
|
1009
1022
|
|
|
1010
1023
|
@mcp.tool()
|
|
1011
1024
|
@handle_sb_errors
|
|
1012
|
-
def
|
|
1025
|
+
def assert_condition(
|
|
1013
1026
|
check: Literal[
|
|
1014
1027
|
"element_present",
|
|
1015
1028
|
"element_visible",
|
|
1016
|
-
"
|
|
1029
|
+
"text_visible",
|
|
1017
1030
|
"title",
|
|
1018
1031
|
"url",
|
|
1019
1032
|
"url_contains",
|
|
@@ -1026,23 +1039,24 @@ def assert_that(
|
|
|
1026
1039
|
"""Verify an expected browser condition and fail when it is not met.
|
|
1027
1040
|
|
|
1028
1041
|
Use this tool for explicit verification. Unlike check_state, which simply
|
|
1029
|
-
reports the current state,
|
|
1030
|
-
error. Unlike wait_for, URL/title checks do not wait.
|
|
1042
|
+
reports the current state, assert_condition treats a failed expectation
|
|
1043
|
+
as an error. Unlike wait_for, URL/title checks do not wait.
|
|
1031
1044
|
|
|
1032
1045
|
Args:
|
|
1033
1046
|
check:
|
|
1034
1047
|
- "element_present": Verify selector identifies a present element.
|
|
1035
1048
|
- "element_visible": Verify selector identifies a visible element.
|
|
1036
|
-
- "
|
|
1037
|
-
whole HTML document when selector is omitted.
|
|
1049
|
+
- "text_visible": Verify expected text is visible within selector,
|
|
1050
|
+
or within the whole HTML document when selector is omitted.
|
|
1038
1051
|
- "title": Verify the exact page title.
|
|
1039
1052
|
- "url": Verify the exact current URL.
|
|
1040
1053
|
- "url_contains": Verify that the current URL contains expected.
|
|
1041
1054
|
selector: Element selector for element_present, element_visible, and
|
|
1042
|
-
|
|
1043
|
-
expected: Expected text/title/URL value for
|
|
1044
|
-
url_contains.
|
|
1045
|
-
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.
|
|
1046
1060
|
timeout: Maximum seconds to wait for element/text checks.
|
|
1047
1061
|
|
|
1048
1062
|
Returns:
|
|
@@ -1055,14 +1069,16 @@ def assert_that(
|
|
|
1055
1069
|
Tool selection:
|
|
1056
1070
|
- Just inspect current state -> use check_state.
|
|
1057
1071
|
- Wait for a condition to become true -> use wait_for.
|
|
1058
|
-
- Verify that an expected condition is true -> use
|
|
1072
|
+
- Verify that an expected condition is true -> use assert_condition.
|
|
1059
1073
|
"""
|
|
1060
1074
|
sb = _get_sb()
|
|
1061
1075
|
|
|
1062
1076
|
if check in ("element_present", "element_visible") and selector is None:
|
|
1063
1077
|
return f"Error: check='{check}' requires value for `selector`."
|
|
1064
1078
|
|
|
1065
|
-
if check in (
|
|
1079
|
+
if check in (
|
|
1080
|
+
"text_visible", "title", "url", "url_contains"
|
|
1081
|
+
) and expected is None:
|
|
1066
1082
|
return f"Error: check='{check}' requires value for `expected`."
|
|
1067
1083
|
|
|
1068
1084
|
if check == "element_present":
|
|
@@ -1073,13 +1089,13 @@ def assert_that(
|
|
|
1073
1089
|
sb.assert_element_visible(selector, timeout=timeout)
|
|
1074
1090
|
return f"Confirmed {selector} is visible."
|
|
1075
1091
|
|
|
1076
|
-
if check == "
|
|
1092
|
+
if check == "text_visible":
|
|
1077
1093
|
target = selector or "html"
|
|
1078
1094
|
if exact:
|
|
1079
1095
|
sb.assert_exact_text(expected, target, timeout=timeout)
|
|
1080
1096
|
else:
|
|
1081
1097
|
sb.assert_text(expected, target, timeout=timeout)
|
|
1082
|
-
return f"Confirmed text in {target}."
|
|
1098
|
+
return f"Confirmed visible text {expected} in {target}."
|
|
1083
1099
|
|
|
1084
1100
|
if check == "title":
|
|
1085
1101
|
sb.assert_title(expected)
|
|
@@ -1095,7 +1111,8 @@ def assert_that(
|
|
|
1095
1111
|
|
|
1096
1112
|
return (
|
|
1097
1113
|
f"Error: unknown check '{check}'. Use 'element_present', "
|
|
1098
|
-
|
|
1114
|
+
"'element_visible', 'text_visible', 'title', 'url', "
|
|
1115
|
+
"or 'url_contains'."
|
|
1099
1116
|
)
|
|
1100
1117
|
|
|
1101
1118
|
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
# seleniumbase package
|
|
2
|
-
__version__ = "4.53.
|
|
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
|
|
@@ -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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/drivers/chromium_drivers/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/undetected/cdp_driver/_contradict.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/undetected/cdp_driver/connection.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_grid/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_grid/grid_hub.py
RENAMED
|
File without changes
|
{seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_grid/grid_node.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_grid/start-grid-hub.bat
RENAMED
|
File without changes
|
{seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_grid/start-grid-hub.sh
RENAMED
|
File without changes
|
|
File without changes
|
{seleniumbase-4.53.4 → seleniumbase-4.53.5}/seleniumbase/utilities/selenium_ide/convert_ide.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|