定位器稳定性策略
定位器稳定性从高到低大致是:专用测试属性(data-testid)、用户可见语义(role、label、文本)、稳定 id 与 name、结构化的 CSS 路径。定位器策略决定 UI 自动化的寿命:选对策略,页面改版后用例存活;选错策略,每次发版都在修定位,维护成本迅速超过收益。
基本信息
| 优先级 | 测试属性 > 语义定位 > 稳定 id 与 name > CSS 路径 > XPath |
|---|---|
| 推荐属性 | data-testid 等专用测试属性,由开发与测试约定 |
| 避免使用 | 自动生成的哈希 class(如 css-1x2y3z)、随机 id、超长 XPath |
| 管理方式 | 定位器集中管理(页面类属性或常量表),改版时批量替换 |
| 配套建议 | 缺测试标记时推动开发补一行属性,成本远低于长期维护脆弱选择器 |
示例
示例
# 推荐:专用测试属性
driver.find_element(By.CSS_SELECTOR, "[data-testid=submit]")
# 次选:可访问性语义
driver.find_element(By.CSS_SELECTOR, "button[aria-label=提交]")
# 避免:结构依赖加自动生成 class
# driver.find_element(By.CSS_SELECTOR, "div > div:nth-child(3) > span")典型使用场景
- 新页面接入自动化:与开发约定测试属性,一次写稳。
- 改版回归:定位集中管理后按页面批量替换,改动面可控。
- 组件库升级:语义定位在样式与结构重写后仍可用。
- 稳定性治理:统计定位器失败排行,优先替换最脆的写法。
- 代码评审:把定位器写法列入检查清单,阻止新的脆弱定位入库。
- 多人协作:常量表统一命名,避免各自发明选择器。
稳定性对照
| 依据 | 稳定性 | 说明 |
|---|---|---|
| 测试属性 | 高 | 与实现解耦,专供自动化使用 |
| 角色与标签 | 高 | 贴近可访问性语义 |
| id 与 name | 中 | 静态则简单,动态生成则危险 |
| 自动生成 class | 低 | 构建产物变化即失效 |
| 长 XPath | 低 | 页面结构微调整体失效 |
定位器集中管理(页面类属性或常量表)便于改版时批量替换。
缺测试属性时先推动开发补齐:一行 data-testid 的成本远低于长期维护脆弱 XPath。
定位不稳定时不要先用加等待来掩盖:先确认选择器是否命中了动态或重复元素。