Jarvis-Brain 0.1.12.3__py3-none-any.whl → 0.1.13.2__py3-none-any.whl
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.
- {jarvis_brain-0.1.12.3.dist-info → jarvis_brain-0.1.13.2.dist-info}/METADATA +1 -1
- {jarvis_brain-0.1.12.3.dist-info → jarvis_brain-0.1.13.2.dist-info}/RECORD +6 -6
- mcp_tools/dp_tools.py +65 -7
- mcp_tools/main.py +1 -0
- {jarvis_brain-0.1.12.3.dist-info → jarvis_brain-0.1.13.2.dist-info}/WHEEL +0 -0
- {jarvis_brain-0.1.12.3.dist-info → jarvis_brain-0.1.13.2.dist-info}/entry_points.txt +0 -0
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
mcp_tools/__init__.py,sha256=_ZzedxbxmVkdRH00ONOjQR31pZW-B8WPn5P2qE6T-Iw,3012
|
|
2
|
-
mcp_tools/dp_tools.py,sha256=
|
|
3
|
-
mcp_tools/main.py,sha256=
|
|
2
|
+
mcp_tools/dp_tools.py,sha256=KcgH0lkPOT_OZtdb3g1wBAEW7lB8qdigtGu1__7ifak,25572
|
|
3
|
+
mcp_tools/main.py,sha256=hIiYV7QVT8XDEDihhTQTUmL7Ftlsd0DlfhKMHEqj244,1262
|
|
4
4
|
tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
5
5
|
tools/browser_manager.py,sha256=zeYcWuzxoohMdnYUoZbRH7axFC_VtV8MsncfN8y0yw0,2023
|
|
6
6
|
tools/browser_proxy.py,sha256=VAhuVrBIoXmKyXvCmJh4eRYCWpLIhbTYmFHK8l8eoTA,6590
|
|
7
7
|
tools/tools.py,sha256=KvBzefiQbgR-Qa1FsTOGMbVuwTzrK3iXXJgZuFU3UVg,10926
|
|
8
|
-
jarvis_brain-0.1.
|
|
9
|
-
jarvis_brain-0.1.
|
|
10
|
-
jarvis_brain-0.1.
|
|
11
|
-
jarvis_brain-0.1.
|
|
8
|
+
jarvis_brain-0.1.13.2.dist-info/METADATA,sha256=0VYhUIoMkg6vKzFjH1uRH3tfW0lKpml8ytTTPGeu0B4,264
|
|
9
|
+
jarvis_brain-0.1.13.2.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
10
|
+
jarvis_brain-0.1.13.2.dist-info/entry_points.txt,sha256=YFQT4xpkUqt5dM5wlKPQQOqcjMuFrT9iuRAzIpAyH7U,51
|
|
11
|
+
jarvis_brain-0.1.13.2.dist-info/RECORD,,
|
mcp_tools/dp_tools.py
CHANGED
|
@@ -248,22 +248,17 @@ def register_click_action(mcp: FastMCP, browser_manager):
|
|
|
248
248
|
if "css:" not in css_selector:
|
|
249
249
|
css_selector = "css:" + css_selector
|
|
250
250
|
target_eles = target_tab.eles(css_selector)
|
|
251
|
-
# click_success = False
|
|
252
|
-
# element_clickable = False
|
|
253
|
-
# if len(target_eles) == 1:
|
|
254
251
|
target_element = target_eles[target_element_index]
|
|
255
252
|
element_clickable = target_element.states.is_clickable
|
|
256
253
|
try:
|
|
257
|
-
target_element.click()
|
|
258
|
-
click_success = True
|
|
254
|
+
click_success = target_element.click()
|
|
255
|
+
# click_success = True
|
|
259
256
|
except Exception as e:
|
|
260
257
|
click_success = False
|
|
261
258
|
if target_element_index > 0:
|
|
262
259
|
message = f"tab页:【{tab_id}】点击【{css_selector}】【index={target_element_index}】的元素 {'成功' if click_success else '失败'} 了"
|
|
263
260
|
else:
|
|
264
261
|
message = f"tab页:【{tab_id}】点击【{css_selector}】 {'成功' if click_success else '失败'} 了"
|
|
265
|
-
# else:
|
|
266
|
-
# message = f"tab页:【{tab_id}】传入的css_selector找到了{len(target_eles)}个元素,请确保传入的css_selector可以找到唯一的一个元素"
|
|
267
262
|
return dp_mcp_message_pack(
|
|
268
263
|
message=message,
|
|
269
264
|
browser_port=browser_port,
|
|
@@ -352,6 +347,69 @@ def register_mouse_hover(mcp: FastMCP, browser_manager):
|
|
|
352
347
|
)
|
|
353
348
|
|
|
354
349
|
|
|
350
|
+
def register_get_ele_info(mcp: FastMCP, browser_manager):
|
|
351
|
+
@mcp.tool(name="get_ele_info", description="返回元素有关一系列的信息。"
|
|
352
|
+
"参数说明:"
|
|
353
|
+
"browser_port:浏览器端口号。"
|
|
354
|
+
"tab_id:tab页的id。"
|
|
355
|
+
"css_selector:目标选择器"
|
|
356
|
+
"element_index:如果选择器定位到的是一个列表【或者可以定位到多个元素】,则该值用于定位这个列表中具体元素,默认值为0【列表中的第一个元素】"
|
|
357
|
+
"返回值说明:"
|
|
358
|
+
"element_tag:此属性返回元素的标签名。"
|
|
359
|
+
"element_attrs_key:此属性以list的形式返回元素所有属性的key。"
|
|
360
|
+
"element_child_count:此属性返回元素内第一级子元素个数。"
|
|
361
|
+
"element_rect_size:此属性以元组形式返回元素的大小。"
|
|
362
|
+
"is_in_viewport:此属性以布尔值方式返回元素是否在视口中,以元素可以接受点击的点为判断。"
|
|
363
|
+
"is_whole_in_viewport:此属性以布尔值方式返回元素是否整个在视口中。"
|
|
364
|
+
"is_alive:此属性以布尔值形式返回当前元素是否仍可用。用于判断是否因页面刷新而导致元素失效。"
|
|
365
|
+
"is_checked:此属性以布尔值返回表单单选或多选元素是否选中。"
|
|
366
|
+
"is_selected:此属性以布尔值返回<select>元素中的项是否选中。"
|
|
367
|
+
"is_enabled:此属性以布尔值返回元素是否可用。"
|
|
368
|
+
"is_displayed:此属性以布尔值返回元素是否可见。"
|
|
369
|
+
"is_covered:此属性返回元素是否被其它元素覆盖/遮挡。如被覆盖/遮挡,返回覆盖元素的 id【无障碍树的id,无法用于Selector】,否则返回False。"
|
|
370
|
+
"is_clickable:此属性返回元素是否可被模拟点击,从是否有大小、是否可用、是否显示、是否响应点击判断,不判断是否被遮挡。"
|
|
371
|
+
"has_rect:此属性返回元素是否拥有大小和位置信息,有则返回四个角在页面上的坐标组成的列表,没有则返回False。")
|
|
372
|
+
async def get_ele_info(browser_port: int, tab_id: str, css_selector: str, element_index: int = 0) -> dict[
|
|
373
|
+
str, Any]:
|
|
374
|
+
_browser = browser_manager.get_browser(browser_port)
|
|
375
|
+
target_tab = _browser.get_tab(tab_id)
|
|
376
|
+
css_selector = css_selector
|
|
377
|
+
if "css:" not in css_selector:
|
|
378
|
+
css_selector = "css:" + css_selector
|
|
379
|
+
target_eles = target_tab.eles(css_selector)
|
|
380
|
+
try:
|
|
381
|
+
target_element = target_eles[element_index]
|
|
382
|
+
except IndexError:
|
|
383
|
+
return dp_mcp_message_pack(
|
|
384
|
+
message="报错:IndexError: list index out of range。请检查Selector中是否包含了如:first-child、nth-child等字段,如果有则去掉。必须使用element_index来控制元素的选择",
|
|
385
|
+
browser_port=browser_port,
|
|
386
|
+
tab_id=tab_id,
|
|
387
|
+
css_selector=css_selector,
|
|
388
|
+
element_index=element_index,
|
|
389
|
+
)
|
|
390
|
+
return dp_mcp_message_pack(
|
|
391
|
+
message="元素可以被正常的选择到,以下是元素相关的一系列信息",
|
|
392
|
+
browser_port=browser_port,
|
|
393
|
+
tab_id=tab_id,
|
|
394
|
+
css_selector=css_selector,
|
|
395
|
+
element_index=element_index,
|
|
396
|
+
element_tag=target_element.tag,
|
|
397
|
+
element_attrs_key=list(target_element.attrs.keys()),
|
|
398
|
+
element_child_count=target_element.child_count,
|
|
399
|
+
element_rect_size=target_element.rect.size,
|
|
400
|
+
is_in_viewport=target_element.states.is_in_viewport,
|
|
401
|
+
is_whole_in_viewport=target_element.states.is_whole_in_viewport,
|
|
402
|
+
is_alive=target_element.states.is_alive,
|
|
403
|
+
is_checked=target_element.states.is_checked,
|
|
404
|
+
is_selected=target_element.states.is_selected,
|
|
405
|
+
is_enabled=target_element.states.is_enabled,
|
|
406
|
+
is_displayed=target_element.states.is_displayed,
|
|
407
|
+
is_covered=target_element.states.is_covered,
|
|
408
|
+
is_clickable=target_element.states.is_clickable,
|
|
409
|
+
has_rect=target_element.states.has_rect,
|
|
410
|
+
)
|
|
411
|
+
|
|
412
|
+
|
|
355
413
|
def register_get_screenshot(mcp: FastMCP, browser_manager):
|
|
356
414
|
@mcp.tool(name="get_tab_screenshot",
|
|
357
415
|
description="尝试对传入tab页进行截图,并将截图压缩为1M大小png图片,会返回截图保存路径")
|
mcp_tools/main.py
CHANGED
|
@@ -25,6 +25,7 @@ if "TeamNode-Dp" in enabled_modules:
|
|
|
25
25
|
register_click_action(mcp, browser_manager)
|
|
26
26
|
register_scroll_action(mcp, browser_manager)
|
|
27
27
|
register_mouse_hover(mcp, browser_manager)
|
|
28
|
+
register_get_ele_info(mcp, browser_manager)
|
|
28
29
|
|
|
29
30
|
if "JarvisNode" in enabled_modules:
|
|
30
31
|
register_assert_waf(mcp, browser_manager)
|
|
File without changes
|
|
File without changes
|