feat(抓取): 元素检查器改成本地版"大图 + 一次取齐"——复刻云检查器的体验
用户要的是 uiauto.dev 那个检查器的体验(左边大图点元素、右边层级树、选完回填),
并希望本地复刻(云页面跨域,拿不到它的选中结果,没法自动回传)。
- core/uiauto_helper.py: 新增 `snapshot(serial)`
* **一个 u2 连接背靠背** dump_hierarchy() + screenshot():截图与元素树同源同刻,
不再像原来那样分两个接口取(中间隔着 dump 本身的 1.3~1.8 秒)
* `_xml_to_node()`:把 u2 的 XML 节点转成 uiautodev 那套结构,直接复用既有的
选择器建议逻辑(不写第二遍)
* **双截图校验**:dump 前后各截一张,差异明显就标 `unstable`,让前端明确提示
"界面在变化中,请停在静止界面再抓",而不是悄悄给一个可能错位的框
- web/tasks_api.py: 新增 `GET /api/uiauto/snapshot`(登录 + 设备权限)
- static/admin/editor.js + templates/admin/monitor.html:
* 抓取弹窗从 900px 加宽到 1280px,预览列从"固定 320px"改为铺满左侧 →
**图片按原始分辨率 1:1 显示**(实测 720x1650 缩放 1.000),元素框严丝合缝;
原来缩到 294px 时框全挤在一起,看着就像错位
* 工具栏显示 `720x1650 · 247 个元素 · 2370ms`;界面在变时顶部弹黄色提示条
* 鼠标在图上移动时高亮"最深命中"的元素框,便于确认真要点哪个
实测:抓取弹窗 1:1 显示、222 个框逐一贴合元素、无 JS 报错;
`unstable` 在静止界面为 false。
This commit is contained in:
@@ -358,6 +358,30 @@ def api_uiauto_devices():
|
||||
_log.info(f"抓取元素设备列表补全 {added} 台在线设备: {list(seen)}")
|
||||
return jsonify({"ok": True, "devices": data})
|
||||
|
||||
@bp.route("/api/uiauto/snapshot")
|
||||
@perm_required(PERM_DEVICES)
|
||||
def api_uiauto_snapshot():
|
||||
"""一次取齐:设备截图 + 元素树(**原生 u2,同一个连接背靠背取**)。
|
||||
|
||||
抓取元素时用它代替「/api/uiauto/screenshot + /api/uiauto/elements」两连击:
|
||||
那两条是两次独立取数,中间隔着 dump 本身的 1.3~1.8 秒 —— 界面只要在动
|
||||
(信息流/视频/加载动画),框就会落在旧位置上("抓取错位")。
|
||||
同一个连接背靠背取把这个窗口压到最小,并额外用**双截图校验**标出
|
||||
"抓取期间界面在变化"(`unstable`),前端据此明确提示而不是悄悄给错位的框。
|
||||
|
||||
?serial=xxx
|
||||
→ {ok, image(data-url), width, height, elements:[...], unstable, cost_ms}
|
||||
"""
|
||||
serial = request.args.get("serial", "")
|
||||
if not serial:
|
||||
return jsonify({"ok": False, "error": "缺少 serial"}), 400
|
||||
ok, data = uiauto_helper.snapshot(serial)
|
||||
if not ok:
|
||||
# 设备没连上/抓取失败:502(依赖不可用),与 /api/uiauto/elements 一致
|
||||
return jsonify({"ok": False, "error": data}), 502
|
||||
return jsonify({"ok": True, **data})
|
||||
|
||||
|
||||
@bp.route("/api/uiauto/screenshot")
|
||||
@perm_required(PERM_DEVICES)
|
||||
def api_uiauto_screenshot():
|
||||
|
||||
Reference in New Issue
Block a user