mcpField
S
simulator-automation

simulator-automation

github.com/even-realities测试与质量79135 次安装1 周前更新
代码仓库

关于 simulator-automation

为 Even Hub Simulator 提供 HTTP 自动化 API 的指南,供开发者检查模拟器画面与日志,并发送触控输入。适用于自动化观察和交互测试。

主要功能

  1. 01提供健康检查接口
  2. 02获取眼镜和 Webview 截图
  3. 03读取与清除控制台日志
  4. 04发送触控板输入

适用场景

  1. 01自动验证应用启动状态
  2. 02检查屏幕内容和运行日志
  3. 03脚本化手势交互测试

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/even-realities/everything-evenhub --skill simulator-automation

安装后在 Claude Code 中输入/simulator-automation确认已加载。

详细介绍

EvenHub Simulator Automation

使用 --automation-port <PORT> 启动模拟器后,它会在 localhost 上公开一个 HTTP API。

evenhub-simulator https://my-app.example.com --automation-port 9898

基础 URL:http://127.0.0.1:<PORT>

API 参考

健康检查
GET /api/ping
→ "pong"
眼镜截图

返回当前 LVGL 帧缓冲区,格式为 image/png(576×288,RGBA)。

GET /api/screenshot/glasses
→ image/png binary (RGBA)

RGBA 格式——对图像分析至关重要:

  • 背景像素:(R=0, G=255, B=0, A=0) —— 透明(alpha = 0)
  • 点亮/文本像素:(R=0, G=255, B=0, A=255) —— 不透明(alpha = 255)

始终使用 RGBA 模式。不要转换为 RGB——这会丢弃 alpha 通道,使背景像素与文本像素无法区分(两者都会显示为纯绿色)。

from PIL import Image
img = Image.open('glasses.png')  # keep as RGBA — do NOT call img.convert('RGB')
pixels = img.load()
# Lit pixel test:
is_lit = lambda px: px[3] > 0   # alpha > 0
Webview 截图

使用 html2canvas 捕获主浏览器 Webview,返回 image/png。可能需要几秒;10s 后超时。

GET /api/screenshot/webview
→ image/png binary
控制台日志

返回主 Webview 中捕获的 console.* 输出、未捕获的异常、未处理的 Promise 拒绝以及失败的 fetch 调用。

GET /api/console
→ { "entries": [...], "total": N }

每条日志:

{ "id": 0, "level": "log|warn|error|info|debug|trace", "message": "...", "ts": 1712150400000 }

非控制台来源的前缀:

  • [uncaught] ... —— 未捕获的异常
  • [unhandledrejection] ... —— 未处理的 Promise 拒绝
  • [fetch] ... —— fetch 失败(状态非 ok 或网络错误)

仅轮询新条目:

GET /api/console?since_id=42
→ entries with id > 42

**since_id 必须是非负整数。**传入负值(例如 -1)会导致服务器返回错误,而不是空列表。首次轮询时,请完全省略此参数以获取所有当前条目,然后根据响应跟踪 last_id:

# First poll — no since_id
resp = requests.get(f"{BASE_URL}/api/console")
entries = resp.json()["entries"]
last_id = max((e["id"] for e in entries), default=0)

# Subsequent polls
resp = requests.get(f"{BASE_URL}/api/console?since_id={last_id}")

清空缓冲区:

DELETE /api/console

**时序注意事项:**启动日志(例如“ready”信号)只会发出一次;如果在读取前清空缓冲区,它们就会丢失。建议先轮询 ready 信号,然后在需要时清空。

# Safe: check for ready signal BEFORE clearing
poll_until(target="APP_READY")
requests.delete(f"{BASE_URL}/api/console")  # only if you need a clean slate after
眼镜输入

向眼镜显示屏发送触控板操作。

POST /api/input
Content-Type: application/json

{ "action": "up" | "down" | "click" | "double_click" }

响应:{ "ok": true }

操作对应眼镜触控板:

  • up / down —— 滚动浏览列表项或文本
  • click —— 选择当前项
  • double_click —— 触发系统级双击事件(通常用于“返回”或“关闭”)

自动化工作流

  1. 确认服务正在运行:GET /api/ping
  2. 轮询应用就绪状态(不要先清空控制台):查找已知日志消息。
  3. **观察:**使用 /api/screenshot/glasses(RGBA)或 /api/console 检查状态。
  4. **操作:**通过 POST /api/input 发送输入。每次操作后,短暂等待(约 300ms),然后确认状态是否已改变。
  5. **迭代:**轮询控制台时使用 since_id,避免重复读取旧条目。

提示

  • 眼镜显示屏为 576×288 像素,单色绿色。截图为 RGBA PNG。
  • 只有在应用创建了活动事件容器后,输入才会生效。如果没有活动容器,输入会被静默忽略。
  • double_click 通常用于返回或关闭当前视图。
  • 启动模拟器后,等待至少 4 秒再开始轮询——SDK 初始化和 createStartUpPageContainer 都需要时间。

任务

$ARGUMENTS

评论

支持 Markdown