UI 自动化:UI 自动化中的元素定位策略总结

UI 自动化里,最容易被低估、但又最直接影响稳定性的一个问题,就是定位。很多脚本之所以不可信,不是业务流程太难,也不是工具太差,而是定位策略从一开始就建在了不稳定的东西上。

定位判断可以先抓一条很简单的原则:

  • 依赖样式和层级,脚本一定越来越脆
  • 依赖业务语义和稳定标识,脚本才有长期可维护性

所以定位从来不是“会不会 XPath”的技巧题,而是测试资产到底建立在什么稳定性上的设计题。

一、我在真实项目里的定位优先级

如果页面可以配合自动化治理,定位优先级通常是:

  1. data-testid / data-qa
  2. 稳定 id
  3. 明确文本和语义角色
  4. 相对结构定位
  5. 长 XPath 或复杂 CSS

这套优先级的核心,不是“现在能不能定位到”,而是“页面一个月后改版还能不能定位到”。

二、为什么我最推崇 data-testid

因为它把测试依赖从样式层剥离出来了。

如果前端愿意在关键交互元素上统一提供:

  • 搜索按钮
  • 提交按钮
  • 弹窗确认
  • 表格行
  • 详情入口

这类稳定标识,自动化稳定性会明显上一个台阶。

它的价值在于:

  • 不依赖 class
  • 不依赖 DOM 层级
  • 不会因样式调整轻易失效
  • 能直接表达业务语义

这件事本质上不是“前端给测试加字段”,而是让整个项目的 UI 自动化维护成本下降。

三、我最不喜欢的三种定位写法

1. 超长 XPath

例如一路写到:

/div[2]/div[3]/div[1]/span/button

这类定位最大的问题不是难看,而是它依赖的是页面骨架形状。一旦前端多包一层容器、拆一个组件、调整一个布局,它就断。

2. 动态 class 定位

很多现代前端框架会生成动态 class 或频繁变更 class 组合。你把脚本建立在这些 class 上,本质上是在绑样式实现细节。

3. 索引定位

例如:

  • 第一个按钮
  • 第三列操作
  • 第二个弹窗里的第一个确认按钮

这种定位一旦排序、分页或布局微调,就非常容易漂。

四、怎么处理表格和列表页定位

后台系统里最常见也最麻烦的页面之一就是表格。

一个真实列表页通常会包含:

  • 搜索区域
  • 表格行
  • 行内操作按钮
  • 分页
  • 弹窗入口

脚本不适合直接定位“第几行第几列按钮”,而更适合:

  • 先定位到目标行
  • 再在该行里找相对按钮

如果前端能配合,我最理想的方式是:

  • 行级别 data-testid=user-row-{id}
  • 操作按钮有稳定标识

这样就能直接表达“在这条业务对象所在行里操作”,而不是表达“点第三行第四列”。

五、复杂组件为什么更适合做组件化封装

真实页面里最难定位的,往往不是普通按钮,而是这些组件:

  • 日期选择器
  • 富文本编辑器
  • 虚拟滚动列表
  • 树形组件
  • 下拉搜索组件

如果这些组件的内部 DOM 结构直接暴露给业务 case,后面维护成本会极高。更常见的做法通常是:

  • 先定位组件容器
  • 在组件对象里封装内部定位
  • case 只调用业务动作

例如:

  • DatePicker.select("2025-03-01")
  • UserTree.select("华东区")
  • RichEditor.fill("测试内容")

这样组件内部 DOM 再复杂,也不会扩散到所有 case。

六、定位策略为什么更适合和前端协作

通常不会只在测试侧抱怨“页面太难定位”,而是直接推动一条前端规范:

  • 关键按钮有稳定标识
  • 弹窗主操作按钮有统一命名方式
  • 表格行支持和业务对象关联的测试标识
  • 复杂组件有可识别的根节点

这条规范的意义在于:让定位从“脚本维护问题”前移到“页面可测性设计问题”。只要团队进入这个认知层次,后面 UI 自动化维护成本会下降很多。

七、定位失败时怎么排查,而不是先加等待

元素找不到时,通常先看:

  • 页面是否真的完成跳转
  • 元素是否在 iframe 或 shadow DOM
  • 元素是不是被 loading、弹窗、遮罩挡住了
  • 文本或语义是否已被前端改掉

很多时候问题不是元素不存在,而是页面还没稳定,或者你定位依赖的语义已经变了。

八、一个真实例子

假设有个“审核通过”按钮位于列表页弹窗内。最糟糕的写法通常是:

  • 先找第三个按钮
  • 再找第二个弹窗
  • 再点第一个主按钮

更稳妥的做法是:

  1. 根据任务名找到目标行
  2. 点击该行的“审核”按钮
  3. 等审核弹窗出现
  4. 在弹窗容器里定位“通过”按钮

这就是定位策略和等待策略一起发挥作用的地方。它依赖的是业务语义,不是页面形状。

九、怎么判断定位治理是不是有效

主要看这些结果:

  • 前端改动后,脚本大面积失效的频率是否下降
  • 页面对象和组件对象是否承担了大部分定位变更
  • 业务 case 是否不再直接感知复杂 DOM 细节
  • 新增页面自动化时,定位规则是否越来越统一

如果这些都没发生,说明所谓定位治理很可能只是“换了一种写 XPath 的方式”。

十、结语

UI 自动化里的元素定位,核心不是你能不能把节点找出来,而是脚本到底依赖了页面的哪种稳定性。越依赖样式、层级和顺序,越脆;越依赖业务语义和稳定标识,越容易长期维护。定位从来不是小技巧,它首先是一种可测性设计。

本章延伸阅读