3 个命令上手 Maestro AI:发版前自动揪出 UI 缺陷,还能顺手提取屏幕文本

发布时间:2026/11/6 1:45:48

3 个命令上手 Maestro AI:发版前自动揪出 UI 缺陷,还能顺手提取屏幕文本 3 个命令上手 Maestro AI发版前自动揪出 UI 缺陷还能顺手提取屏幕文本【免费下载链接】MaestroPainless E2E Automation for Mobile and Web项目地址: https://gitcode.com/GitHub_Trending/ma/Maestro发版前最耗时的环节之一是人工逐屏看截图找文字溢出、找布局错位、找颜色反了的地方。Maestro 的 AI 能力可以把这一步半自动化——在测试脚本里加一条命令截屏直接送去做 UI 缺陷检测返回结构化的问题列表同一套入口还支持把屏幕上的文本按自然语言查询提取出来存成变量。这篇文章带你走通 Maestro AI 这三件事assertNoDefectsWithAI、assertWithAI、extractTextWithAI。最小可跑示例一条命令检测整屏 UI 缺陷先给最短主流程。导出云端 key占位符换成你自己的export MAESTRO_CLOUD_API_KEYyour-cloud-api-key export MAESTRO_CLI_AI_KEYsk-your-llm-key在 Maestro 测试脚本末尾加一条断言appId: com.example.app --- - launchApp - assertNoDefectsWithAI跑maestro test flow.yaml。assertNoDefectsWithAI会自动截取当前整屏未压缩的原图字节交给云端分析没有缺陷就静默通过有缺陷则这一步直接失败报告里打印每条缺陷的reasoning。这就是它能解决的问题截图进缺陷列表出不用人肉盯像素。怎么调用 Maestro AI 的三个命令assertNoDefectsWithAI怎么调用、返回什么解决整屏有没有视觉问题。脚本里不需要传任何路径命令自己负责截图——你只需要保证此刻屏幕上是你想检查的页面。- launchApp - tapOn: 首页 - assert: 余额显示区 - assertNoDefectsWithAI底层走 maestro-ai/ 里的AIPredictionEngine.findDefects(screen: ByteArray)输入是截图字节数组输出是ListDefect每个Defect只有两个字段category和reasoning。拿到非空列表后Orchestra 会抛AssertionFailure失败消息形如Found 2 possible defects: - ...失败截图会被存进 debug 产物目录。解读它没有坐标、没有严重度分级给的是分类加自然语言理由定位靠你自己回看产物里的截图。assertWithAI怎么把一句自然语言断言跑起来解决某个该出现的内容出现了没有比如验证码输入框、活动横幅这类精确文本匹配不好写的界面。命令接收一个assertion字符串把截图和这句话一起送云端判断。- launchApp - tapOn: 登录 - assertWithAI: 屏幕上显示了用于输入验证码的输入框对应源码里performAssertion(screen, assertion)的返回是Defect?null表示断言通过非空时defect.reasoning就是失败原因同样会抛出AssertionFailure。解读断言写得越具体越稳。页面显示验证码输入框比页面正常有用得多后者会让模型给出含糊的判定。extractTextWithAI提取文本的查询参数怎么写解决屏幕上有文字但我拿不到它的确切值——WebView 里渲染的数字、Canvas 上的余额、动态生成订单号都属于这类。命令接收query自然语言和outputVariable变量名。- extractTextWithAI: query: 页面上显示的订单总金额只要数字 outputVariable: orderTotal - assert: text: 确认支付 visible: true - assertVariable: orderTotal 不为空返回是一个纯字符串存进outputVariable后给后续步骤用比如tapOn或再套一层正则断言。失败点很直接key 没配会抛CloudApiKeyNotAvailable查询太模糊返回的字符串可能是整段无关文案。把三个命令串进发版前的回归流程三者有明确的先后依赖先找茬再确认最后取值。- launchApp - assert: 首页 - assertNoDefectsWithAI # 第一关整屏无视觉缺陷 - assertWithAI: 顶部导航栏包含我的订单入口 # 第二关关键入口存在 - extractTextWithAI: query: 当前账户余额只要数字 outputVariable: balance - assertVariable: balance 只包含数字和小数点 # 第三关取到的值格式正确先跑assertNoDefectsWithAI是为了把纯视觉问题和内容缺失分开第一关挂了说明是渲染层面的回归第一关过了、第二关挂了说明内容本身没到位。最后一步只在前两步都过的前提下才有意义——从错屏里提取文本没有价值。把这条链放在登录页、首页、订单页等核心页面的用例末尾就能在常规 E2E 之外多筛出一层视觉回归。避坑与调优清单两个环境变量一个都不能少MAESTRO_CLOUD_API_KEY驱动云端缺陷/文本接口MAESTRO_CLI_AI_KEYOpenAIsk-...或 Anthropicsk-ant-api-...在 demo 应用里选择 LLM 模型。缺前者时执行到命令直接抛CloudApiKeyNotAvailable缺后者 demo 会报OpenAI API key is not provided。截图是全屏原图不是压缩图takeScreenshot(compressed false)的字节直接上传分辨率越高传得越多。弱网环境先修网络再怀疑 AI接口内部超时是连接 10 秒、请求 60 秒60 秒后按失败处理。断言查询写可验证的描述assertWithAI和extractTextWithAI的 prompt 都写具体对象加判断条件显示用于输入验证码的输入框模糊措辞会让reasoning变得不可解释。提取结果是字符串格式校验自己加extractTextWithAI不做类型判断想确认余额是1234.56这种形态用后续的assertVariable加正则别指望查询语句保证格式。AI 判定允许出错流程上留复核口失败信息的 debug 提示会建议你核对 debug 产物里的截图。批量跑时把 AI 失败的用例单独拉出来人工过一遍比整体重跑省事。并行注意限流官方 demomaestro-ai/README.md的--parallel选项本身就标注了 May get rate limited核心页用例多时串行跑 AI 步骤更稳。边界与下一步说清前提三个命令都依赖 Maestro 云端服务默认https://api.copilot.mobile.dev可用MAESTRO_CLOUD_API_URL覆盖截图字节会上传涉及敏感数据的界面慎用。它做不了整屏之外的细粒度分析——Defect没有坐标提取文本也没有区域参数想只检查局部只能先自己截局部。想继续往下走两条路一是读 maestro-ai/README.md 了解 demo 应用的截图命名规则app_编号_good/bad.png和模型切换二是直接看源码入口 maestro-ai/src/main/java/maestro/ai/Prediction.kt 和同目录的ApiClient.kt请求体FindDefectsRequest里assertion字段可空——传了就走断言模式不传就是纯找缺陷这就是assertWithAI和assertNoDefectsWithAI的差别来源。【免费下载链接】MaestroPainless E2E Automation for Mobile and Web项目地址: https://gitcode.com/GitHub_Trending/ma/Maestro创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/11/1 1:18:23

Java封装性:面向对象编程的核心实践与设计原则

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/25 10:43:37

大模型上下文工程实战:窗口管理、记忆压缩与RAG调优

凌晨两点,线上客服机器人开始胡说八道。它明明拥有十万 token 的上下文窗口,对话记录也都完整塞进去了,可偏偏在用户问“刚才我说要退款的事你帮我办了没”时,回答成了“您没有申请过退款”。我翻日志发现,关键的那句退…

2026/10/24 9:03:21

Pico W+MicroPython+EMQX:构建MQTT JSON数据上报链路实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/6 1:43:46

一步到位的 Android 视频播放:GSYVideoPlayer 快速上手指南

一步到位的 Android 视频播放:GSYVideoPlayer 快速上手指南 【免费下载链接】GSYVideoPlayer Video players (IJKplayer, ExoPlayer, MediaPlayer), HTTPS, 16k page size, danmaku (bullet chat) support, external subtitles, support for filters, watermarks, a…

2026/11/6 1:43:46

Java中如何校验非法字符

校验名称或规格时,核心思路是用正则表达式匹配“非法字符”,只要匹配到就判定不通过。下面直接给你可用的写法。 ✅ 正则校验:不允许出现逗号、换行、回车、空格 // 校验字符串是否包含非法字符(逗号、换行、回车、空格&#xff0…

2026/11/5 15:39:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/6 1:03:39

MCU晶振电路设计全解析:从负载电容计算到PCB布局调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 15:39:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑