乐于分享
好东西不私藏

为什么很多 AI 视觉测试越做越不稳?根因是 DOM 解析,静态代码分析才更适合测试工程

为什么很多 AI 视觉测试越做越不稳?根因是 DOM 解析,静态代码分析才更适合测试工程

很多团队不是不会做 AI UI 测试,而是做出来以后不敢放进核心回归

做过 UI 自动化的人,基本都见过这类问题: 

  • 页面一改,定位器就漂
  • 权限一变,脚本就漏场景
  • 功能开关一开一关,流程立刻分叉
  • Case 挂了以后,半天分不清是产品 bug,还是测试资产过期

这两年很多 AI UI 测试工具出来后,第一眼看上去确实很惊艳。

它会看页面、读 DOM、识别元素、决定下一步点哪里,像一个“会自己探索页面的测试员”。

但真放进企业项目,问题很快就出来了:

能演示,不代表能稳定回归。

更准确地说,很多方案的问题不是 AI 不够聪明,而是它理解页面的方式,本身就不够稳定。 

先说清楚:这里说的“AI 视觉测试”,不是传统截图 diff

这里说的“AI 视觉测试”,不是那种做像素对比的视觉回归。

我这里说的是另一类更常见的 AI UI 测试思路: 

  • 运行时看截图、DOM、可访问性树
  • 现看现判断页面上有什么
  • 临场决定该点哪个按钮、填哪个输入框
  • 再根据当前页面继续往下走

这类方案适合做探索、演示、快速试跑。

但如果你想把它放进企业里的长期回归链路,问题就来了。

一句话判断:只靠运行时 DOM 解析和页面视觉理解的 AI UI 测试,适合“先跑起来”,不适合直接承担“长期稳定回归”。

一、为什么现在很多主流 AI UI 测试不稳

问题的核心,不在“会不会看页面”,而在“是不是只能看页面”。

根因
在测试里的真实表现
只看到页面表面
知道页面现在长什么样,但不知道这个按钮、弹窗、表单来自哪个组件
只看到当前状态切片
这次渲染能看到的,不代表功能开关、权限、条件渲染下的其他分支也被理解了
动作是概率判断
定位和操作依赖当场猜测,页面结构稍微一变就容易漂
失败难归因
Case 挂了以后,不容易判断到底是代码 bug、页面改版,还是测试资产过时

很多团队会以为这只是“模型还不够强”。

其实不是。

这是一个更底层的工程问题。

因为这类方案把测试理解放到了最后一步,也就是页面已经渲染出来以后,才开始问: 

  • 这里有什么元素?
  • 这个按钮能不能点?
  • 这个表单下一步应该怎么走?
  • 这一次看见的页面,是不是完整真相?

这件事天然就晚了。

页面渲染结果,只是源码逻辑在某个状态下的一次投影。

而测试真正想拿到的,不只是“当前页面”,而是: 

  • 这个页面由哪些组件组成
  • 哪些交互点真正重要
  • 哪些内容受权限控制
  • 哪些流程受开关影响
  • 哪些分支虽然这次没渲染出来,但其实客观存在

 图 1:很多 AI UI 测试不稳,不是因为它不会看页面,而是因为它只能看页面。 

二、为什么静态代码分析更适合测试工程

静态代码分析更强的地方,不是“更炫”,而是更确定

它把理解页面这件事,从运行时往前移到了源码阶段。

也就是说,不等页面跑起来再猜,而是先从代码里把这些东西挖出来: 

  • 组件结构
  • 交互事件
  • 状态切换
  • 权限判断
  • 功能开关
  • 条件渲染

这样做之后,测试资产就不再是漂在页面外面的,而是和源码绑在一起。

可以把两种思路理解成下面这个差别:

方案
它在看什么
更适合什么
最大问题
运行时 DOM / 视觉理解
当前渲染结果
快速探索、冒烟、演示
容易随页面变化漂移
静态代码分析
源码里的组件、状态和条件分支
稳定回归、可维护测试资产、复杂业务覆盖
前期要做结构化建设

从测试工程角度看,静态代码分析至少有 4 个直接收益。 

1. 定位更稳

先识别组件,再补稳定 testid,再生成定位器目录。

这样定位器不是临场猜出来的,而是从源码结构里长出来的。 

2. 状态覆盖更全

权限、开关、条件渲染这些东西,很多时候运行时只会露出一部分。

源码扫描后,可以提前知道还有哪些隐藏分支需要覆盖。 

3. 页面对象更可维护

POM 不再是测试同学手工硬写的一层壳,而是基于组件结构自动生成或半自动维护。

这样页面改版时,测试不会从 DOM 重新摸一遍。 

4. 失败更容易诊断

一旦测试失败,可以往回追: 

  • 是源码组件变了
  • 是 testid 失效了
  • 是业务规格变了
  • 还是真出了功能 bug

静态代码分析的真正价值,不是帮你少点几下按钮,而是让测试资产重新和源码建立契约。

三、如果测试团队真要做,整体实现应该怎么搭

这个方向不是多加一个 Agent 就结束了。

它本质上是一条“测试资产生产线”。

最实用的做法,是拆成两段: 

  • Setup:先建立结构化真相
  • Execution:再执行测试旅程

 图 2:真正稳定的路径,不是边跑边猜,而是先把源码里的结构和约束抽出来,再执行测试。 

第一层:源码扫描,建立组件索引

这一层建议直接基于 AST 做。

至少要抽出这些信息: 

  • 组件名和源码路径
  • 可交互元素和事件
  • 状态字段
  • 条件渲染
  • 权限判断
  • 功能开关依赖

这份组件索引可以落成 JSON、SQLite,或者团队已有的元数据仓库。

它是后面所有测试资产的上游事实源。 

第二层:补稳定契约,生成测试基础设施

有了组件索引以后,第二步不是直接生成 case,而是先把稳定资产补齐: 

  • 为关键交互点补 data-testid
  • 生成定位器注册表
  • 生成或更新 POM
  • 建立测试代码到源码组件的映射

这一层最关键,因为它决定后面的测试是在“消费契约”,还是继续“现场猜页面”。 

第三层:展开业务场景,不只生成一条正常主流程

这一步才轮到 AI 真正发力。

基于前面的结构化真相,可以去做: 

  • 权限组合展开
  • 功能开关组合展开
  • 正常流 / 异常流拆分
  • 页面跳转和弹窗分支规划

这时候生成出来的测试,稳定性会比纯运行时探索高很多。

因为它不是凭页面当前长相临场猜测,而是在消费已经建好的结构化资产。 

第四层:执行和诊断,把失败分清楚

执行阶段建议只做两件事: 

  • 按结构化资产执行
  • 按错误类型做诊断

也就是说,case 挂了以后,不要只输出“元素没找到”。

最好能继续往下分: 

  • 是组件改名了
  • 是 testid 丢了
  • 是流程分支变了
  • 还是断言真的揭示了业务 bug

这一步会直接决定团队后续维护成本。

 图 3:别一上来就想着“全自动 Agent 编排”,对测试团队最值钱的,往往是组件索引、稳定定位、POM 和失败诊断。 

四、一个真实场景:退款页为什么最容易暴露问题

退款功能是很典型的一类页面。

它经常同时具备这些复杂度: 

  • 有权限账号才看得到入口
  • 新旧 UI 并行一段时间
  • 功能开关开启和关闭走不同流程
  • 全额退款和部分退款校验逻辑不同
  • 审核弹窗、二次确认、状态回写都可能变

如果只靠运行时 DOM / 视觉理解去做,常见问题是: 

  • 当前账号看不到退款入口,AI 就不知道还有这条路径
  • 新旧 UI 并行时,每次学到的页面结构可能不同
  • 弹窗文案或布局一变,动作就容易漂
  • 挂了以后,很难第一时间判断是页面改了,还是业务逻辑真的错了

但如果前面已经把源码结构分析过,这个场景就会好很多。

 图 4:退款这类多权限、多开关、多流程场景,最能体现静态代码分析比 DOM 盲抓更适合长期回归。

一个更稳的执行方式通常是这样的: 

  • 在源码阶段识别退款按钮、退款表单、金额输入框、确认弹窗和状态标签
  • 把权限判断、功能开关分支、全额 / 部分退款条件一起抽出来
  • 自动生成稳定 POM 和定位器目录
  • 再按业务矩阵展开场景,而不是每次运行时重新探索

这样生成出来的测试,不只是“把流程点通”。

它还能更自然地把断言做深,比如: 

  • 退款按钮在不同权限下是否可见
  • 部分退款金额校验是否正确
  • 提交后订单状态是否回写成功
  • 审核记录和操作日志是否产生
  • 新旧 UI 下核心业务结果是否一致

这才是测试团队真正关心的价值。

因为企业里的 UI 测试,从来不只是点点点,而是要验证状态、规则和副作用。 

五、测试团队怎么落地,才不会做成一套很重但没人用的系统

最容易踩的坑,就是一上来就想做“全自动 AI 测试大脑”。

更现实的做法是分三步。 

第一步:先挑一个最容易碎的模块试点

优先选下面这类页面: 

  • 权限差异多
  • 功能开关多
  • 弹窗和子流程多
  • 页面改版频繁
  • 业务价值高

比如退款、营销配置、优惠券发放、运营后台审批页,都很适合。 

第二步:先做 Setup,不要急着追求全自动生成 case

先把这几样东西跑通: 

  • 组件扫描
  • testid 规范化
  • 定位器注册表
  • POM 生成

只要这一步做稳,很多 UI 测试的脆弱问题就已经开始下降了。 

第三步:再把 AI 用到场景扩展和失败诊断上

这是更适合测试团队的 AI 用法。

让 AI 去做: 

  • 场景矩阵展开
  • 边界流补充
  • 失败归因辅助
  • 变更影响分析

而不是把最基础的页面理解,全都交给运行时即时猜测。 

六、最后一句话

现在很多 AI UI 测试不稳,不是因为 AI 不够强。

而是因为它太依赖运行时 DOM 和页面视觉结果,理解发生得太晚,测试资产也没有和源码建立稳定契约。

如果测试团队想把 AI 真正用进企业级 UI 回归,重点不该只是“让 AI 会点按钮”,而是“让测试先理解源码结构,再执行页面动作”。

这也是为什么:

DOM 解析适合探索,静态代码分析更适合长期测试工程。