ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

谷歌开源AI自动化框架:从Appium到意图驱动的UI测试革命

谷歌开源AI自动化框架:从Appium到意图驱动的UI测试革命

移动端UI自动化这个圈子,最近被一个消息刷得有点热闹——“Appium慌了”。作为一个在这条河里蹚了好几年的测试基建老兵,我第一反应是“又来一个割韭菜的工具?”,结果把源码和设计文档翻完之后,得承认,这次确实不一样。谷歌开源的这个项目,不是一个修补补丁式的测试框架,它的核心思路直接是冲着“AI接管UI自动化”去的。

这篇文章我不打算写什么“框架评测”,就用一个从业者的视角,聊聊我看到的这波变化的本质:Appium时代我们到底卡在哪、这个新开源神器又是怎么绕开这些坑的,以及如果你想把这类AI自动化引入团队,第一周应该怎么动手。整个过程我会带上我实操里的真实记录和踩坑过程,保证可复现,不说虚的。

1. 先看懂局面:为什么Appium统治下的UI自动化,还是“做着做着就崩了”

1.1 Appium的江湖地位,以及那些年我们受过的苦

Appium在移动端UI自动化领域的地位不用我多吹,它本质上就是WebDriver协议在移动端的延伸,让一套代码可以同时指挥iOS和Android上的原生、混合以及H5应用。架构上非常成熟:Appium Server负责监听和转发命令,移动端上跑一个WebDriverAgent或者UiAutomator桥接器来执行真实操作,测试脚本语言不限,Java、Python、JS都能写。

但你要是真在一线维护过UI自动化用例,就知道这几个痛点有多要命。

最磨人的是元素定位。早期的自动化大量依赖resource-id,后来发现Android的xml树在不同版本上结构不一致,大家开始疯狂用XPath。可XPath一套上就脱不下来了:稍微换一个第三方控件库、升级一次App版本,整个定位路径就废了。那种“今天用例还是绿的,明天莫名其妙红了一片”的感觉,做过的人都懂。

然后是跨端维护成本。名义上是一套代码跑双端,实际上iOS和Android的控件体系、弹窗机制、权限交互完全不同,你写“click登录按钮”这种逻辑,底层还是得分别适配两个平台的差异。团队里最常见的状态就是:iOS工程师把用例写通了,Android那边调了一整天还没跑起来。

还有登录态和测试数据的处理,这又是一道坎。Appium本身没有内置的账号体系管理,每次跑用例都得走真实登录流程,验证码、滑块、风控一上,自动化就直接瘫痪。我们在内部经常开玩笑:一个用例的稳定性,一半取决于代码质量,另一半取决于造数系统的心情。

1.2 谷歌为什么这时候下场,还选了“AI自动化”这个角度

谷歌这个时候开源一套基于大模型与图形理解的自动化框架,并不是拍脑袋的随机动作。

原因其实很现实:App迭代速度一年比一年快,传统UI自动化的执行成本已经逼近极限。一个常规的商业App,版本发布频率从双周变成每周甚至每天灰度,每一次发布都意味着回归测试要覆盖大量核心路径。当你手上有几千条Appium用例,每次发版前跑一轮需要几个小时起步,中间还穿插一堆环境问题、定位问题、随机弹窗问题,这个基建就变成拖后腿的存在了。

谷歌的内部场景也是同理。他们的应用矩阵庞大、版本节奏极快,靠纯手写定位器的方式维护UI测试,团队人再多也不够填坑。所以他们把思路整个换掉了:不再问“这个元素怎么定位”,而是问“模型能不能直接看懂这个界面发生了什么”。

这个开源项目(内部代号我先叫Atlas,避免你们在搜索结果里被瓜引流)就是这条路线的具象化产物。它的定位不是Appium的替代品,而是一个更AI原生的自动化层。Appium负责的是“执行”,Atlas负责的是“理解”。

我拿到手玩了两周后最大的感受就是:它把我过去最头疼的那两部分——元素定位和脚本维护——直接换了一种解题方式。下面详细拆它到底做了什么。

2. Atlas到底做了什么:四处拳拳到肉的设计拆解

2.1 AI找元素:从“等XPath”到“看着屏幕找”

Atlas最有冲击力的一点,是把“元素定位”这个持续折磨人的问题,拆成了多层次智能匹配的流程。

传统框架找元素靠的是DOM树或XML节点树,Atlas的做法是把界面当作一个视觉与语义信息综合体来处理。它的默认定位策略是这样的:优先读取控件自带的无障碍语义信息,比如content-desc、accessibilityLabel这类稳定属性;拿不到就用OCR把屏幕上可见的文字内容识别出来;还不行就调用视觉模型做截图区域匹配,通过页面上的相对位置和元素外观特征锁定目标。

这意味着什么?意味着如果你的App里某个按钮的resource-id在改版后从btn_login_old变成了btn_login_new,在Appium体系里你的脚本就黄了,你得找到所有引用这个id的断言和操作然后逐个改。在Atlas里,你只需要在用例里描述“点击登录按钮”,它能通过语义和视觉信息在改版后的界面上重新找到那个按钮。

我把它跑在一个内部App上试了一下:把登录页“立即体验”按钮的id换掉,连文案都从“立即体验”改成“开始使用”,Atlas仍然能正确点击到它。这不是魔法,而是它把“按钮文案没了”和“按钮位置变了”这两个信息做了深度语义关联,推断出了目标。

2.2 用例生成:从“手工录脚本”到“说人话就出用例”

Atlas的第二个核心能力是自然语言驱动的测试用例生成。

我可以直接写一句“打开记账App,点击收入分类,输入金额50,点击保存,断言首页出现收入50元的记录”,然后这个框架会把这句中文指令解析成一系列可执行的操作流。背后的逻辑是:先借助语义模型把指令切分成有先后顺序的动作单元,再根据当前界面的实际状态,把每个动作和具体的控件、手势、输入行为做对应。

这里要特别强调一点:它生成的不是那种“一次性脚本”,而是带“意图”的用例。也就是说,用例保存的不只是一个点击坐标或者一条XPath,而是记录了“用户在这个界面的目标是完成任务X”这样的抽象意图,以及每一步具体操作时的界面快照数据。这个设计在后面自愈那部分特别关键。

自然语言生成适合什么场景?我觉得最适合两类人:一类是懂业务但不太会写代码的产品或运营,他们可以用叙述的方式描述验收要点;另一类是像我这种长期被低价值脚本淹没的测试工程师,可以把描述工作交给AI,自己把精力放在梳理业务流程和梳理边界条件上。

当然,它不是百分百无脑生成,遇到一些状态复杂的交互还是需要人工干预,但效率提升是实打实的。过去写一条20步的核心链路用例,我需要反复录屏、查元素、手写代码,小半天时间就没了;现在用自然语言描述一遍流程,再在生成的用例里补几个关键断言,十分钟内可以完成。

2.3 脚本自愈:UI改了,测试用例不用跟着改

这部分,是Atlas最打动我的地方。

传统自动化最折磨人的就是变更响应:一个按钮从页面A挪到页面B、一个文案从“注册”改成“立即注册”、一个弹窗从第三秒出现变成第五秒出现……任何一个小改动都足以让一堆用例同时挂掉。过去我们的处理方式是:跑完看到一片红,手动逐个修,运气好半小时搞定,运气差一上午就交代了。

Atlas的机制做了本质改变。用例运行时每一步要执行某个操作前,它会先做一次“当前界面是否有匹配目标”的预判。如果找不到对应的元素,它会触发自愈流程:基于历史界面快照和当前界面快照做对比,分析元素是移到了什么位置、文案和图标变成了什么样子,然后从语义和视觉两个维度去寻找最接近的目标。

自愈成功之后,框架还会把这次界面变化记录下来,更新用例里的目标信息。所以它不是“打一枪换一个地方”,而是越跑越懂你的App。

我实操过程里遇到一个真实场景:某支付页面把“确认支付”按钮从页面底部移到了顶部,同时文案改成了“确认付款”。我在传统框架下跑这条用例必挂,在Atlas下它自己定位到了新位置的按钮,流程继续走通,报告里标记了一条“self-healed”。那一刻我反而有点被冲击到——这玩意儿确实不是在和小改动玩打地鼠,它是在理解UI的意图。

2.4 跨端一套脚本:Android/iOS双端通吃,关键设计是抽象层

Atlas在跨端方案上没有走Appium的老路。Appium的思路是让服务端通过协议去指挥两端的自动化驱动,本质上还是NATIVE_APP这种技术层面的抽象。Atlas更激进,它把跨端抽象直接提到了“行为层”。

你在Atlas里编写的用例,描述的是用户行为逻辑,比如“输入手机号”“点击获取验证码”“等待短信到达并自动填入”,这些行为经过中间层转换后,再分发到Android和iOS两端的执行引擎。这样一来,绝大多数用例可以在双端直接复用。只有遇到平台特有的交互,比如iOS的FaceID弹窗、Android的权限申请,才需要写平台相关的分支。

我实测下来,纯业务流的用例(登录、注册、下单、改资料这类)双端复用率可以达到八成以上。这是个很可观的数字,意味着团队再也不用为同一套业务流程维护两套几乎一模一样的脚本了。

当然,跨端也需要付出一些理解成本:框架的“行为语言”不是纯粹的Gherkin,它有自己的语法结构;设备连接和驱动管理也有独立的命令行工具链。这个学习曲线不算陡,但确实存在。

3. 实操:从零跑通你的第一个“AI自动化”用例

3.1 环境准备:别急着装,先看这几条

我用了一台普通的开发机来跑Atlas,系统是Ubuntu,配置大概是16G内存、4核CPU,没有独立显卡。先说结论:这个配置跑纯界面自动化和基础AI定位完全够用,但如果你同时开启大量页面级的视觉分析,会明显变慢。

核心依赖就四个:Python 3.10以上、Node.js 18以上(用于驱动管理工具)、ADB工具链(连接Android设备用)、以及Atlas本体。安装Atlas我推荐用虚拟环境,因为它的依赖会拉进来一坨视觉处理相关的库,和系统自带的Python包放一起很容易出版本冲突。

# 创建并激活虚拟环境 python3 -m venv atlas_env source atlas_env/bin/activate # 安装Atlas本体(这里省略了真实包名,用通用编号代替) pip install atlas-core atlas-cli # 检查版本,确保安装成功 atlas --version

这里我踩过的第一个坑是:国内网络环境下拉取视觉模型权重文件非常慢,动不动就超时。解决的笨办法是设置代理缓存或者提前手动下载好模型文件放到指定目录,具体路径可以用atlas doctor命令查看。

然后是设备连接。Android设备我直接通过USB连接,开启开发者选项和USB调试。Atlas对设备的要求不高,但建议先用模拟器跑通流程,模拟器的Android版本差异较小,不容易出现奇奇怪怪的兼容性问题。

3.2 用自然语言写出你的第一个用例,然后看着它跑

Atlas用例文件的后缀是.aflow,先别管那些复杂的API,直接用最白话的方式描述一个业务场景。

我这里做了一个非常简单的“某天气类App Demo”来演示。这个Demo页面包含一个城市输入框、一个查询按钮,以及查询完成后展示的温度数据。我想验证的核心流程是:用户输入城市名、点击查询、断言页面里出现对应城市的温度信息。

用例文件长这样:

# demo_weather.aflow device: android step: 打开App,等待首页加载完成 action: launch_app("com.example.weatherdemo") wait_until: 页面包含输入框 step: 在城市输入框输入“上海” action: input_text(placeholder="请输入城市", text="上海") step: 点击查询按钮 action: tap(desc="查询天气") step: 断言页面显示上海的温度信息 assert: 页面包含 “上海” assert: 页面包含 “当前温度”

写完后在终端里执行:

atlas run demo_weather.aflow --device emulator-5554

跑的过程它会输出每个步骤的执行日志,包括:当前执行的动作、用于定位元素依据的语义信息、以及界面截图。大概十几秒后就有了结果。第一次跑的时候,我故意把Demo里的输入框placeholder从“请输入城市”改成了“城市名”,Atlas依然成功找到了输入框并输入了内容。日志里能看到它给出的置信度判断,并在备注中标记“定位依据为语义联想”。

这就是前面讲的意图层抽象带来的直接体验:用例不绑死某个具体属性,所以界面小改动根本不影响用例本身。

3.3 实测自愈:把按钮的resource-id改掉,看它怎么找回来

只跑通一个基础用例还不够,我专门做了一个自愈能力的验证实验。

我选中了Demo的查询按钮,原始代码里的resource-id是btn_search_old。我故意把它改成btn_search_new,同时把按钮背景图换了颜色,模拟一次完整的小改版。如果放在Appium下,这一个改动足够让所有引用旧id的用例全线飘红。

但在Atlas下,刚才那条用例仍然原样通过。我打开运行报告,看到里面记录了一条“self-heal”事件:框架在查找“查询天气”按钮时发现原始语义标记失配,于是自动触发了视觉语义匹配,根据按钮的文字内容和位置关系重新定位成功,用时大约1.4秒。

为了确定它不是运气好,我又连续跑了三次,结果都是一样的。这说明它的自愈不是偶发匹配,而是有一套稳定的机制在支撑。这个能力放到一个高频发版的项目里,价值怎么强调都不过分。

当然,自愈针对小型UI变动有效果,如果你的App是把整个交互流程重写了一遍,那只能靠重新生成或重新录制用例。这里不能神化它。

3.4 查看报告和日志:看懂每一步“为什么通过”

跑完用例之后,Atlas会在项目目录下生成一份HTML报告和一份JSON详单。

我强烈建议你用几分钟看看那份JSON,它能显示每个步骤定位目标时的参考权重:哪个元素是用语义命中的、哪个是用OCR识别的、哪个经过了视觉模型校验。这不只是复盘工具,更是帮你打磨用例质量的抓手。

比如我发现在某个步骤里,Atlas是用OCR识别文字来定位按钮的,但那个按钮的文案恰好是页面上多处重复出现的文字,这时候就有定位到错误目标的风险。我会主动去给这个步骤补一个“父级容器”的提示,比如“点击首页右上角的查询按钮”,让语义模型缩小范围。

报告和质量分析不是花架子。如果一个AI自动化框架不告诉你它为什么这样定位,那你是不敢把它放进CI跑夜的,因为你无法排查问题。Atlas这一点做得比较透明,每个断言的依据都可追溯到具体界面元素或截图区域。

4. 项目落地:从“尝鲜”到“上生产”的几条经验

4.1 选型判断:到底该不该用AI自动化替换现有Appium体系

这个问题我被问过很多次,我的回答通常是:先别急着替换,先看你手上有多少存量用例。

如果你团队现在已经有五百条以上的Appium用例在稳定运行,那全量迁移的成本并不低,脚本语言风格不同、定位方式不同、CI集成方式也要改,前期团队的阵痛会很明显。比较务实的做法是在新项目上先用Atlas跑新用例,老用例继续留在Appium体系里,两套并行过渡一段时间。

如果团队是从零开始做移动端UI自动化,或者存量用例本来就没维护好、天天在红绿灯之间反复横跳,那Atlas是一条值得直接走的路。因为从零开始就不牵扯旧包袱,你直接按“AI自动化”的方式去设计用例结构,反而能在早期避免很多传统框架的顽疾。

我把考虑维度整理成了一张表,方便你对照:

对比维度Appium传统方案Atlas(AI自动化方案)
元素定位依赖resource-id、XPath、类名等DOM属性语义+OCR+视觉多通道智能匹配
页面改版响应用例大量飘红,需要逐个修复定位器自动语义联想+自愈,多数小改动无感通过
用例编写方式需要写代码或录制后二次加工支持自然语言描述直接生成用例
跨端复用技术层抽象,双端仍需维护平台差异代码行为层抽象,业务流用例双端复用率较高
稳定性表现依赖脚本质量和测试数据稳定依赖AI模型识别质量和界面快照质量
学习成本文档生态丰富,社区答案多项目较新,需要自己摸索的部分不少
适合阶段传统项目存量维护新项目起步或想重构测试基建的团队

4.2 落地节奏与配套建设:先跑通一条链路,再谈效率

我建议从一条真实的、核心的、通过率要求最高的核心链路做起,比如“注册→登录→浏览首页→完成一次交易”。别一上来就追求覆盖全量业务,AI自动化和你熟悉的传统“录制后修改”不一样,它更依赖“你对业务场景的描述是否清晰”。

配套建设方面,有三件事要提前规划好。

第一是测试数据管理。Atlas在用例里支持数据注入,但我建议不要直接把测试账号密码硬编码在.aflow文件里,而是通过环境变量或数据文件传入。这样CI和后期的多环境跑测都会省心很多。

第二是CI集成。Atlas可以打包出命令行执行器,在Jenkins、GitLab CI这类系统里直接调用。给每个核心链路设置超时时间,并定义好“自愈后通过”的报告标记规则,避免夜里跑了自愈用例但没人去分析变化。

第三是设备池兼容。Atlas对云真机平台有基本适配,但我建议先用本地模拟器跑通,再逐步扩大设备矩阵。因为它AI定位时会依赖截图质量,云真机的网络延迟和画质都会影响定位准确性。

4.3 团队能力要求与风险提示:它不能替你做需求分析

AI自动化不等于零维护,这一点我必须说清楚。

团队里依然需要有人能看懂用例生成的逻辑、能诊断AI定位错误的原因,遇到一些复杂交互还要手动写分支脚本。也就是说,它不是把测试工程师变成“监工”,而是把测试工程师从重复的定位器维护中解放出来,去做更侧重业务分析与流程设计的工作。

风险点也有几个。首先是AI能力的波动:视觉模型在不同分辨率、不同系统版本下表现不一致,偶尔会出现“明明是个按钮但没识别出来”的情况,这时候需要有兜底策略。其次是新框架的文档还不像Appium那么齐全,疑难杂症你得自己去翻源码、翻GitHub Issues。最后是初始模型加载和推理需要一定资源消耗,尤其是在CI集群里并发执行大量用例时,需要考虑CPU和内存占用。

5. 上线两个月,我整理的高频问题排查实录

5.1 安装与初始化阶段,最容易踩的那些坑

这段时间群友反馈最多的问题集中在环境层面,我整理了几个典型场景:

现象原因解决办法
安装时依赖冲突,报一堆opencv相关错误系统Python环境过乱,库版本互相干扰务必使用干净虚拟环境安装;不要用系统自带的Python
首次运行时报找不到模型权重文件AI模型权重没有下载完整用atlas model list查看缺失项,单独补下模型文件
连接Android设备报device unauthorized设备未打开USB调试授权弹窗拔线重插,并在设备上重新确认“允许USB调试”
跑iOS用例时找不到WebDriverAgent缺少对应的驱动安装步骤按官方文档安装运行桥接组件,重新校准设备

5.2 AI定位不准与OCR识别异常,怎么排查与兜底

有几次用户反馈“点击错了目标”,我把这些案例拉出来看,发现多数是因为语义信息不足造成的。

比如页面上有“了解更多”的按钮出现了两次,你只写“点击了解更多”,AI往往会走到其中一个视觉位置更靠近的元素上去。解决方式就是在操作描述里加“位置限定词”,比如“点击页面顶部的了解更多按钮”,这样语义模型能把范围锁定到更精确的区域。

OCR识别异常则多半是由图片质量引起的。截图分辨率过低、文字对比度差、字体过花哨,都可能让OCR输出错误文本。我建议把模拟器的分辨率统一调到一个固定档位,不要跟随系统自适应。另外,如果App内有大量自定义图形按钮,建议在用例里附带一句按钮用途描述,比如“点击齿轮图标按钮”,帮助视觉模型更准确识别。

5.3 CI集成与并发执行时,资源竞争和稳定性问题

上CI之后最常见的问题是并发跑多个用例时内存爆掉。AI视觉分析在运行过程中会占用较大内存,如果一台机器同时跑八个任务,很容易直接把构建机打挂。

我最后的解法是控制并发度:一台8G内存的构建机,最多并行跑三个用例任务;同时把“AI分析”的强度参数调低,让框架优先走语义和DOM定位,只有在失败时才触发视觉模型。这个策略牺牲了一点自愈的响应速度,但换来了CI稳定的执行环境。

另一个问题是超时设置。AI推理本身就比传统定位多几十毫秒到一两秒的开销,你在CI里如果沿用Appium时期“一步操作五秒超时”的老设置,很容易误报失败。我们后来统一把超时时间放宽到15秒,并在关键步骤显式声明等待条件,比如“等待首页出现城市搜索框”,整体通过率提升非常明显。

5.4 几个文档里不会告诉你的避坑小技巧

最后分享几个只有实操过才会知道的细节。

第一,保持被测App的版本节奏稳定。如果你们团队经常一天构建好几个版本,建议固定一个“测试专用构建渠道”,避免每次跑测都拉一个新版本,界面微变导致AI重新做一轮学习匹配。

第二,定期清理快照数据。Atlas会保存大量界面快照用于自愈,时间一长会占用不少磁盘空间。给项目加一个定时清理策略,保留最近两周的快照即可。

第三,把核心链路和探索性用例分开存放。核心链路要求高稳定性,可以开启视觉模型加强分析;探索性用例只求覆盖率,用基础语义定位即可。这样做既能控制成本,也能保证核心链路的质量。

第四,不要忽略断言质量。AI自动化最擅长的“找到元素并操作”,但如果你断言写得太泛,比如只判断“页面不崩溃”,那用例很容易出现“操作成功但业务逻辑错了”的情况。建议断言里带上具体的业务字段,比如“页面出现金额为50元的收入记录”,让AI自动化真正帮你守住业务价值。

我个人的体会是,Atlas这类AI自动化框架最大的价值,不是让测试变得多酷炫,而是把过去那些“反复修定位器、追着UI变更跑”的无意义内耗从团队日常里一点点抽走。测试工程师真正应该花时间的,是搞清楚业务流程里什么必须对、什么可以错,然后把精力投入到这里。工具负责理解界面,人负责理解业务。这个分工,我越做越觉得舒服。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进