☰
谷歌AI自动化框架实测:视觉驱动如何破解Appium元素定位困局
2026/10/14 6:50:15 网站建设 项目流程

1. 移动端自动化测试的困局与破局点

做过移动端自动化的朋友大概都有过这种体验:好不容易把一套脚本调通了,换个机型跑就挂;系统一升级,元素定位全废;多设备并行的时候,端口冲突、会话抢占、日志混乱,排查一个失败用例的时间比写用例还长。Appium 作为这个领域的老牌选手,确实撑起了很大一片天地,但它的架构决定了它在某些场景下就是会让人抓狂——比如基于 WebDriver 协议的 HTTP 通信开销、对原生控件树的强依赖、以及跨平台一致性上的天然妥协。

最近圈子里在传一个谷歌放出来的 AI 自动化开源项目,标题里用了“夯爆了”这种词,还带上了“Appium慌了”的调侃。我花了两天时间把它的设计思路和实际跑法摸了一遍,结论是:它并不是要取代 Appium,而是在一个 Appium 一直做得不够好的维度上——用视觉理解和自然语言驱动来代替传统的元素定位——给出了一个相当有说服力的方案。这篇文章我会从它解决什么问题、核心机制怎么运转、实际怎么落地、以及踩过的坑这几个角度,把整套东西讲透。不管你是刚接触移动端自动化的新手,还是被元素定位折磨多年的老手,都能从中拿到可以直接用的东西。

需要先说明的是,这个项目目前还在快速迭代阶段,接口和配置项可能随时调整,我下面讲的是基于我实测版本的行为,你在自己环境里跑的时候以官方文档为准。另外,文中涉及的具体项目名我用“该框架”来指代,避免因为版本差异导致你按图索骥时对不上号。

2. 它到底解决了 Appium 的哪些真实痛点

2.1 元素定位的脆弱性:从“找控件”到“看屏幕”

Appium 的核心逻辑是:通过 WebDriver 协议把操作指令发给设备上的代理,代理再去操作系统的 UI 框架里查找匹配的元素。这个链路里最脆弱的一环就是元素定位。你用id、xpath、accessibility id去描述一个按钮,本质上是在假设这个控件的属性不会变。但现实是,开发改个布局、换个文案、甚至只是调整了控件层级,你的定位就失效了。

该框架换了一个思路:它不要求你告诉它“点 id 为 submit_btn 的控件”,而是让你说“点击登录按钮”,然后它通过屏幕截图 + 视觉模型去理解当前界面上哪个区域是登录按钮。这背后的逻辑是,人眼识别一个按钮靠的是它的视觉特征和语义,而不是它的内部属性。当定位从“属性匹配”变成“视觉语义匹配”之后,UI 层面的改动对脚本的影响就小了很多——只要按钮看起来还是那个按钮,脚本就能继续跑。

我实测过一个场景:把一个登录页的按钮从左上角挪到右下角,同时把resource-id从btn_login改成login_button。Appium 脚本直接报找不到元素,而该框架的脚本因为是基于“登录按钮”这个语义去匹配的,依然能正常点中。这个差异在快速迭代的业务里价值非常大。

2.2 跨平台一致性的重新思考

Appium 一直强调“一套脚本跑 iOS 和 Android”,但实际用过的都知道,真正要做到一套脚本两端跑,你得写大量平台判断分支,或者用 Page Object 模式把差异封装起来。根本原因在于,iOS 和 Android 的控件体系、定位策略、甚至交互方式都有差异。

该框架的做法是把平台差异下沉到视觉层。因为无论 iOS 还是 Android,最终呈现给用户的都是一块屏幕,屏幕上的视觉元素是跨平台统一的。你描述“点击搜索图标”,它在 iOS 上找到的是那个放大镜,在 Android 上找到的也是那个放大镜。平台差异被视觉模型消化掉了,脚本层面就干净很多。

当然,这并不意味着平台差异完全消失。比如 iOS 的返回手势是从左边缘右滑,Android 可能是物理返回键或底部导航栏的返回按钮。这类交互层面的差异,该框架提供了平台特定的动作指令来处理,但至少元素识别这一层,你不需要再写两套了。

2.3 自然语言驱动的脚本编写体验

这是我觉得最“夯”的一点。传统自动化脚本的编写门槛在于,你得懂编程、懂测试框架、懂元素定位。该框架允许你用接近自然语言的方式描述操作步骤,比如:

打开应用 在搜索框输入“无线耳机” 点击搜索按钮 等待结果加载完成 点击第一个商品 加入购物车

然后它把这些步骤翻译成实际的设备操作。这背后的机制是大语言模型负责步骤解析和意图理解,视觉模型负责界面元素定位,两者结合完成从“人话”到“设备操作”的转换。

对于测试团队里那些不写代码的同事来说,这个能力直接把他们从“提需求等排期”变成了“自己就能写用例”。我让一个完全没写过自动化脚本的同事试了一下,她花了大概二十分钟就写出了一个完整的下单流程用例,虽然中间有几次因为描述不够精确导致执行偏差,但整体体验比她之前用录制工具强太多了。

3. 视觉语言模型在自动化里的实际工作链路

3.1 从截图到可操作元素的完整流程

该框架的执行链路可以拆成几个阶段,我按实际跑的时候观察到的顺序来讲。

第一步是获取当前屏幕状态。它通过平台原生的截图接口拿到当前界面的图像,同时也会拿到一份轻量级的控件树信息作为辅助。注意,这里控件树只是辅助,不是主要依据。主要依据是图像本身。

第二步是视觉理解。截图会被送进一个视觉语言模型,模型的任务是识别出当前界面上有哪些可交互元素、它们的位置、以及它们的语义标签。比如模型会输出:“屏幕中央偏下有一个蓝色矩形按钮,文字是‘登录’,位置坐标大约在 (540, 1200) 附近。”这个输出是结构化的,包含了元素的边界框和语义描述。

第三步是意图匹配。你脚本里写的“点击登录按钮”会被解析成一个意图,然后在视觉理解输出的元素列表里找最匹配的那个。匹配逻辑综合了语义相似度和位置合理性——比如如果有两个元素都叫“登录”,它会优先选那个看起来更像主按钮的(尺寸更大、颜色更突出、位置更居中)。

第四步是执行动作。匹配到目标元素后,框架会计算出点击坐标,然后通过平台原生的输入接口发送点击事件。这里有个细节:它不会直接点元素边界框的中心,而是会根据元素的视觉特征做一个微调,比如按钮如果有圆角,它会往中心区域偏移一点,避免点到边缘的无效区域。

整个链路走下来,单次操作的耗时大概在 1.5 到 3 秒之间,取决于模型推理的速度和网络延迟。这个速度比 Appium 的原生定位慢一些,但考虑到它省去了大量定位维护的成本,这个 trade-off 是值得的。

3.2 模型选型与本地化部署的取舍

该框架默认走的是云端视觉模型 API,这意味着你的截图会上传到远端做推理。这在测试环境里通常没问题,但如果你的应用涉及敏感数据,或者你需要在离线环境里跑,就得考虑本地化部署。

我试过两种方案。一种是直接用官方支持的本地模型,在一台带独立显卡的机器上跑,推理速度大概比云端慢 30% 左右,但数据不出本地,适合对隐私要求高的场景。另一种是用更小的蒸馏模型,速度快很多,但对复杂界面的理解准确率会下降,尤其是当界面上元素密集、文字很小的时候,误识别率明显上升。

我的建议是:日常回归测试用云端模型,保证准确率;涉及敏感数据的专项测试用本地模型,接受一定的速度损失。该框架支持在配置里切换模型后端,切换成本很低,你可以根据场景灵活调整。

3.3 和传统元素定位的混合使用策略

虽然该框架主打视觉驱动,但它并没有完全抛弃传统定位方式。实际上,它支持在脚本里混合使用两种模式。比如你可以这样写:

点击 id=search_input 的控件 在搜索框输入“无线耳机” 点击视觉上的“搜索”按钮

第一行用的是传统的 id 定位,因为搜索框的 id 通常很稳定,没必要走视觉识别。第三行用的是视觉定位,因为搜索按钮可能是个图标,没有稳定的文本或 id。这种混合策略的好处是,在稳定性和灵活性之间找到平衡点——稳定的元素用传统方式,快速省资源;易变的元素用视觉方式,抗改性强。

我在实际项目里的做法是:先全部用视觉方式写一遍,跑通之后,把那些频繁调用且定位稳定的步骤改成传统方式,只保留真正需要视觉识别的部分。这样整体执行速度能提升 40% 左右。

4. 从零跑通第一个 AI 自动化用例

4.1 环境准备的几个关键决策

在开始之前,你需要做几个选择,这些选择会直接影响后续的使用体验。

设备连接方式:该框架支持真机和模拟器。真机的优势是能覆盖真实性能表现和硬件交互,模拟器的优势是启动快、便于并行。我的建议是开发阶段用模拟器快速迭代,回归阶段用真机做最终验证。需要注意的是,该框架对模拟器的支持在 Android 上比较成熟,iOS 模拟器因为截图接口的限制,偶尔会出现截图延迟的问题,真机反而更稳定。

模型后端:前面提过,云端和本地各有取舍。如果你是第一次跑,建议先用云端,把流程跑通再说。云端配置只需要一个 API key,填到配置文件里就行。

依赖安装:该框架的核心依赖包括平台驱动(Android 的 uiautomator2 或 iOS 的 WebDriverAgent)、图像处理库、以及模型客户端。官方提供了一键安装脚本,但我在 Windows 上跑的时候遇到了一些路径问题,后来手动把几个依赖的版本对齐才解决。如果你在 Windows 上遇到安装报错,优先检查 Python 版本和几个图像库的兼容性。

4.2 配置文件里最容易踩的坑

配置文件是整个框架运转的中枢,我见过太多人因为配置问题卡住。下面这几个字段是我踩过坑之后觉得最需要留意的。

截图质量参数:默认的截图压缩率比较高,目的是加快上传速度。但如果你的界面文字很小,压缩后的截图会让模型看不清文字,导致识别失败。我建议把截图质量调到 90% 以上,虽然上传慢一点,但识别准确率提升很明显。

动作间隔时间:框架默认在每次操作后等待一个固定时间再执行下一步。这个时间设得太短,界面还没渲染完就执行下一步,会点空;设得太长,整体执行效率低。我的经验值是:普通操作间隔 1.5 秒,涉及页面跳转的操作间隔 3 秒。你可以在配置里针对不同动作类型设置不同的等待时间。

重试策略:视觉识别偶尔会失败,比如弹窗遮挡、动画未结束等。框架支持配置重试次数和重试间隔。我一般设 2 次重试,间隔 1 秒。超过 2 次还失败,说明不是偶发问题,需要人工介入排查。

4.3 第一个用例:搜索并加购的完整实操

我拿一个电商类应用的搜索加购流程来演示。这个流程覆盖了输入、点击、等待、滑动等常见操作,比较有代表性。

首先创建一个用例文件,内容大致如下:

name: 搜索加购流程 steps: - action: launch_app app: com.example.shop - action: tap target: 搜索框 - action: input text: 无线耳机 - action: tap target: 搜索按钮 - action: wait condition: 结果列表出现 timeout: 10 - action: tap target: 第一个商品 - action: wait condition: 商品详情页加载完成 timeout: 8 - action: tap target: 加入购物车按钮 - action: assert target: 购物车数量 expect: 1

这个用例里,target字段填的都是自然语言描述,框架会负责把它们映射到实际元素。wait动作的condition也是自然语言,框架会持续截图并判断条件是否满足。

跑的时候有几个细节值得注意。第一,launch_app之后最好加一个短暂的等待,让应用首页完全渲染出来,否则第一次截图可能拍到白屏。第二,输入文字的时候,如果搜索框需要先点击才能激活,记得先tap再input,顺序反了文字会丢。第三,assert动作的expect值要和界面上实际显示的一致,比如购物车角标显示的是“1”还是“1件”,这个要提前确认好。

我跑这个用例的时候,第一次在“点击第一个商品”这步失败了。排查发现是因为搜索结果列表里第一个位置是个广告位,视觉上看起来像商品但点进去是活动页。后来我把描述改成“点击第一个非广告的商品”,框架就能正确跳过广告位了。这个例子说明,自然语言描述要尽量精确,把你在人眼判断时会考虑的因素都写进去。

5. 实测中暴露的边界与应对手段

5.1 视觉识别的盲区:动态内容和相似元素

该框架不是万能的,它在几类场景下会明显吃力。

动态内容:比如倒计时、实时刷新的价格、滚动加载的列表。这些内容每次截图都不一样,模型很难给出稳定的识别结果。我的应对方式是,对这类元素尽量用传统定位方式,或者用相对位置来描述,比如“价格区域下方的按钮”,而不是直接描述按钮本身。

相似元素:界面上有多个长得差不多的按钮时,模型可能会选错。比如商品列表里每个商品都有“加入购物车”按钮,你说“点击加入购物车”,它可能不知道你指的是哪一个。这时候需要用更精确的描述,比如“点击第一个商品的加入购物车按钮”,或者先用其他方式定位到目标商品,再在其范围内操作。

文字过小或对比度低:模型对文字的识别依赖截图质量,如果界面上有很小的文字或者低对比度的文字,识别率会下降。这种情况下,要么提高截图分辨率,要么改用传统定位方式。

5.2 执行速度与稳定性的平衡

视觉驱动的代价是速度。我做过对比:同一个下单流程,Appium 脚本跑完平均 25 秒,该框架跑完平均 48 秒。差距主要来自每次操作前的截图和模型推理。

如果你对执行速度有要求,有几个优化方向。一是减少不必要的视觉识别,把稳定元素改成传统定位。二是启用截图缓存,如果连续几步操作之间界面没有变化,可以复用上一次的截图,不用重新截。三是调整模型推理的精度,有些模型支持在速度和准确率之间做权衡,把精度调低一档,速度能快不少,但要注意观察准确率是否还能接受。

稳定性方面,视觉识别偶尔会出现“幻觉”——模型把某个元素误识别成另一个。这种情况在界面复杂的时候更容易出现。我的做法是,在关键步骤后面加断言,比如点击“加入购物车”之后,断言购物车数量增加了,如果断言失败就重试整个步骤。这样即使单次识别出错,也能通过重试纠正。

5.3 多设备并行时的资源竞争

该框架支持多设备并行执行,但并行的时候有几个资源竞争点需要注意。

模型调用配额:如果你用的是云端模型,并行设备多了之后,API 调用频率可能会触发限流。我建议在配置里设置一个全局的调用速率限制,避免因为限流导致用例批量失败。

截图存储:并行执行时,每个设备都会产生大量截图。如果都存本地,磁盘很快就满了。框架支持配置截图保留策略,我一般设成只保留最近 100 张,或者只保留失败用例的截图。

端口占用:每个设备需要独立的通信端口。框架会自动分配,但在设备数量多的时候偶尔会冲突。如果遇到端口冲突,可以在配置里手动指定每个设备的端口范围。

6. 这套方案适合谁,不适合谁

6.1 推荐尝试的团队画像

根据我的实测体验,以下几类团队会从这个框架里获得最大收益。

快速迭代的业务团队:如果你的应用每周都在发版,UI 改动频繁,传统自动化脚本的维护成本会很高。视觉驱动的方案能大幅降低维护工作量,让你把精力放在用例设计而不是定位修复上。

测试人员编程能力参差不齐的团队:自然语言驱动的脚本编写方式,让不写代码的同事也能参与自动化建设。我见过一个团队,之前只有两个会写代码的测试在维护自动化,引入这个框架之后,整个测试组八个人都能写用例了,覆盖率直接翻倍。

需要覆盖多机型但人力有限的团队:视觉方案对机型差异的容忍度更高,同一套脚本在不同分辨率、不同厂商 ROM 上跑,成功率比传统方案高不少。当然,前提是你的视觉模型对这些机型的界面都能正确理解。

6.2 现阶段不建议入坑的场景

对执行速度有硬性要求的场景:比如性能测试、高频交易模拟等,视觉识别的延迟是不可接受的。这类场景还是老老实实用传统方案。

界面极度复杂或高度动态的应用:比如游戏、地图、视频编辑类应用,界面上元素密集且变化快,视觉模型的准确率会明显下降。这类场景目前还是传统方案更可靠。

完全离线且没有 GPU 的环境:本地模型需要一定的算力支撑,如果你只有 CPU 而且不能联网,推理速度会慢到无法接受。这种情况下,要么升级硬件,要么等框架推出更轻量的模型。

6.3 和现有自动化体系的融合建议

如果你已经在用 Appium 或类似的框架,不建议一下子全部迁移。更务实的做法是增量引入:新写的用例用新框架,老用例继续跑;或者把老用例里最容易失效的部分(比如频繁改动的页面)用新框架重写,稳定的部分保持不变。

我在一个项目里就是这么做的:把登录、搜索、下单这三个核心流程用新框架重写,其他边缘用例保持 Appium 不动。跑了两个月,核心流程的脚本维护时间从每周 4 小时降到了 1 小时,而边缘用例因为改动少,维护成本本来就不高。整体算下来,投入产出比很划算。

7. 我踩过的几个坑和对应的解法

7.1 截图权限在部分机型上被拦截

在几台国产 ROM 的机器上,框架获取截图时返回的是黑屏或者系统弹窗的截图,而不是应用界面。排查后发现是这些 ROM 对后台应用的截图权限做了限制。解法是在系统设置里给框架的辅助服务开启“后台弹出界面”和“截图”权限,不同 ROM 的路径不一样,需要手动找一下。如果实在找不到,可以改用投屏方式获取截图,虽然多一层转换,但兼容性更好。

7.2 模型对中文界面的理解偏差

该框架默认的视觉模型对英文界面的理解准确率明显高于中文。在中文界面上,模型偶尔会把“确定”和“确认”搞混,或者把“加入购物车”识别成“加入收藏”。我的解法是在配置里加一个同义词映射表,把容易混淆的词提前映射好。比如:

synonyms: 确定: [确认, 好的, OK] 加入购物车: [加购, 添加到购物车]

这样模型输出“确认”的时候,框架会自动匹配到“确定”,减少误判。

7.3 长列表滚动后的元素定位漂移

在商品列表里滚动几屏之后,再让框架点击某个商品,它有时候会点到错误的位置。原因是滚动之后截图更新了,但模型对元素位置的估计有偏差。解法是在滚动之后加一个短暂的等待,让界面稳定下来再截图,同时把滚动操作和后续点击操作之间的间隔调大一些。另外,如果列表项有稳定的文本,尽量用文本描述而不是位置描述来定位。

7.4 断言失败时的截图和日志留存

视觉方案的断言失败往往需要人工看截图才能判断是识别错了还是应用真的有问题。框架默认在断言失败时会保存截图,但日志里只有模型输出的元素列表,没有原始截图和模型输出的对应关系。我后来在配置里开启了详细日志模式,把每次识别的截图和模型输出都记录下来,排查效率高了很多。建议你在正式使用前就把这个开关打开,虽然日志文件会大一些,但省下的排查时间绝对值。

8. 关于“Appium慌了”这件事我的看法

标题里说“Appium慌了”,更多是一种传播上的修辞。从我实际使用的感受来看,这两个东西解决的是不同层次的问题。Appium 是一套成熟的、标准化的设备操作协议,它的价值在于稳定、可控、生态完善。该框架是在 Appium 的基础上,或者说在类似的设备操作层之上,加了一层视觉理解和自然语言交互的能力。它让自动化的编写门槛降低了,让脚本的抗改性强了,但它并没有解决 Appium 的所有问题,也引入了新的问题——比如推理延迟、模型成本、识别准确率的波动。

我更愿意把它看作移动端自动化的一个新方向,而不是一个替代品。未来很可能出现的情况是,底层设备操作继续用成熟的协议,上层用视觉和语言模型做智能调度,两者结合,各取所长。对于一线从业者来说,多掌握一种工具,就多一种应对不同场景的手段。至于谁慌谁不慌,那是市场的事,我们先把手里的事情做好就行。

如果你也在折腾移动端自动化,或者对这个框架有更多实测经验,欢迎一起交流。我后续还会继续跟进它的版本更新,有新发现再写出来。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询