원클릭으로
pipeline
我需要测试某个节点的效果的时候,测试 MaaFramework Pipeline JSON 中的 node,验证识别和操作是否正常工作
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
我需要测试某个节点的效果的时候,测试 MaaFramework Pipeline JSON 中的 node,验证识别和操作是否正常工作
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Operate MaaFramework devices and Pipeline resources through the maafw-cli command line with strict JSON output. Use for low-context, repeatable or scripted device discovery, ADB/Win32/PlayCover/wlroots connections, OCR and recognition, screenshots and guarded actions, named sessions, Pipeline validation or execution, resource checks, and CI-friendly Maa automation; route persistent exploratory debugging to MaaMCP instead.
自动生成 Pipeline OCR 文本节点。直接调 ocr() 拿目标文字 box,扩大 ROI 后合并到目标 pipeline 文件。提供单节点生成 (generate_node.py) + ROI 扫描找最佳 expand (generate_sweep.py) 两个脚本。
Universal Pipeline JSON 编写指南。基于 MaaFramework Pipeline 协议,提供节点命名、识别算法、动作类型、流程控制、可复用节点等编码规范与模式参考。在编写、修改或审查 Pipeline JSON、设计节点流程、使用 TemplateMatch/OCR/Custom 识别或 Click/Swipe 动作时使用。
Add runtime UI options (select/checkbox/switch/input) to interface.json. Two implementation styles: (1) wire to Python via context.get_node_data() for in-code decisions, or (2) pure pipeline_override on existing node fields (e.g. `next` array) for behavior-only changes that don't touch Python. Critical 3-place pattern: option definition + task option array + pre-defined pipeline node. Use when adding a new user-facing toggle, multi-choice selector, or custom input that must persist through MaaFramework's v2.3.0+ protocol.
| name | pipeline测试指南 |
| description | 我需要测试某个节点的效果的时候,测试 MaaFramework Pipeline JSON 中的 node,验证识别和操作是否正常工作 |
测试 MaaFramework Pipeline JSON 中的 node,验证识别和操作是否正常工作。
# 1. 连接设备
find_adb_device_list()
controller_id = connect_adb_device(device_name="xxx")
# 或
controller_id = connect_window(window_name="xxx")
# 2. 加载 pipeline
load_pipeline(pipeline_path="<pipeline_json>")
RESOURCE_PATH = "<resource_base_path>"
# 3. 逐个测试
for node_name in pipeline_nodes:
result = run_pipeline(
controller_id=controller_id,
pipeline_path=pipeline_path,
entry=node_name,
resource_path=RESOURCE_PATH
)
# succeeded + all_results 有内容 = 识别成功
# 详见下方"结果判断"小节
| status | all_results | 含义 |
|---|---|---|
succeeded | 有内容 | ✅ 识别成功 |
succeeded | 空 | ❌ 识别失败 |
failed | — | ❌ 节点未触发 / 识别超时 |
返回结构:
{
"status": "succeeded",
"nodes": [{
"name": "node_name",
"recognition": {
"all_results": [{"box": [x, y, w, h], "score": 0.99, "text": "..."}]
}
}]
}
Click 节点会让页面跳转,破坏后续测试初始状态。必须用 BackButton_500ms 返回:
# 测试节点
run_pipeline(..., entry="NodeA", ...)
# 必须返回!不要 click_key(4) 模拟 ESC(可能进错页面)
run_pipeline(..., entry="BackButton_500ms", ...)
# 测下一个
run_pipeline(..., entry="NodeB", ...)
BackButton_500ms 在 main_ui.json 里,DirectHit 识别返回箭头,定位精确可靠。
OCR 失败时不要换 TemplateMatch!先用 sweep 找 sweet spot。
操作流程:
expected 必须是中文(["角色"]),不是英文 key(["Role"])run_pipeline 逐个跑,记录 scoregenerate_node.py --expand X --overwrite 正式写入实战矩阵(5 节点实测):
| 节点 | e0 | e20 | e50 | 最佳 |
|---|---|---|---|---|
| 角色 | ✅ | ✅ 0.9997 | ✅ | e20 |
| 编队 | ✅ | ✅ 0.998 | ✅ | e20 |
| 城堡 | ✅ | ❌ | — | e3(仅 0-15) |
| 佣兵团 | ❌ | ✅ | ✅ | e20 |
| 前往群岛 | ✅ | ✅ | ✅ | e20 |
观察:
timeout: 2000 期间 OCR 会重试多次,所以单次失败不一定是真失败测试时绝对不要点击这些按钮(消耗资源):
误入后处理:尝试 BackButton_500ms 或 ESC → 切换 tab 刷新。
| 现象 | 排查 |
|---|---|
| 节点超时失败 | 截屏看实际界面 → 调整 expected 文本或 roi |
| OCR 拆分多字(如"角色"→"电"+"色") | 缩小 ROI 避开干扰 |
| 误识别相邻文字 | 缩小 ROI 限制范围 |
| 点击位置不准 | 实际点击取 box 中心点:x + w/2, y + h/2 |
| 可滚动 UI 单视图测不全 | 一个截图里只能看到 5-6 个元素,需要 swipe 多次分别测;详见下方 |
| Click + BackButton 跳错页面 | Click 子页后按 BackButton 可能回到大地图/外层 UI,不是预期父页面;需主动 navigate 回来 |
| 部分可见元素识别 | 边界处只露 25px 也能 OCR 找到(score 偏低 0.8x),用大 ROI 覆盖即可 |
单次截图只能测当前可见的 5-6 个元素。要测全列表(如城堡 10 个建筑)必须多次 swipe:
1. 进入目标页(如城堡顶部)
2. run_pipeline 测当前可见的 N 个节点
3. 每个 click 后 BackButton 返回
4. swipe 滚动一屏
5. 再 run_pipeline 测新可见的节点
6. 重复直到列表测完
典型案例:城堡建筑(10 节点)
关键:所有节点共用同一大 ROI [x, top_y, w, full_h],不要给每个节点算不同 ROI(滚动后位置变了,原 ROI 失效)。
症状:节点超时、OCR 找不到、行为异常、识别 score 突然下降
解决:调 screencap(controller_id) 看实际屏幕状态:
配合 ocr() 看识别结果交叉验证。不要盲调 ROI/expected,先看实际屏幕。
Click 节点会让页面跳转,破坏后续测试初始状态。必须用 BackButton_500ms 返回:
# 测试节点
run_pipeline(..., entry="NodeA", ...)
# 必须返回!不要 click_key(4) 模拟 ESC(可能进错页面)
run_pipeline(..., entry="BackButton_500ms", ...)
注意:BackButton 不一定回到你期望的父页面!
测试前先确认 BackButton 路径,或者用 ocr() 检查当前页面状态再继续。
## <文件名> 测试记录
日期: 2026-06-05
设备: xxx
controller_id: xxx
### Node 列表
- [ ] node_name_1
- [ ] node_name_2
### 测试进度
| Node | 结果 | 备注 |
|------|------|------|
| xxx | ✅ | score=0.999 |
| xxx | ❌ | 原因xxx |