前两篇我们用 ui-testscript-generator 解决了脚本生成,用 ui-testscript-enhancer 解决了脚本稳定性。到这一步,你的 UI 自动化脚本已经能稳定跑了。

但这里有一个问题。

你的脚本断言写得再完整,本质上验证的也只是「元素在不在」「文本对不对」「URL 跳没跳」。页面长得对不对,脚本完全不知道。

做过 UI 自动化的同学,下面这些场景应该都遇到过:

  • 元素在,但样式炸了。 按钮存在、文本正确、点击能过,但 CSS 样式错乱导致按钮飞到了页面左下角,用户根本找不到。DOM 断言全程绿色,用户骂骂咧咧。
  • 布局错位,断言无感。 前端改了一处布局,商品卡片从一行三个变成了一行两个,整体排版错位。但每个元素的定位还在、文本还在,DOM 断言照样全过。
  • 多浏览器兼容测试成本爆炸。 Chromium 跑通了,Firefox 点击位置有偏移,WebKit 动画时序不一样。同一套脚本,三个浏览器三种行为,人工逐个适配。
  • 响应式布局几乎是盲区。 桌面端 1920 宽、平板 768 宽、手机 375 宽,不同分辨率下页面布局是否一致?传统自动化几乎不覆盖,全靠上线后用户反馈。
  • 视觉回归全靠人眼。 前端改了样式,测试团队只能人工打开页面截图对比,慢、累、还容易漏。改了一个颜色值,你得逐页翻看找差异。
  • 视觉差异判断「凭感觉」。 像素差多少算 bug?10 个像素的偏移要不要报?每个人标准不同,同一张截图 A 说通过了 B 说没通过,扯不清。

DOM 断言验证的是「功能对不对」,视觉断言验证的是「长得对不对」。两者缺一不可。

那能不能用 Agent Skill 自动补全视觉断言,顺便解决多浏览器和响应式的兼容校验?

答案是,可以。而且这一步做完,你的 UI 自动化才真正从「功能验证」升级为「全维度校验」。

核心思路是,AI 负责扫描和生成视觉断言,人负责确认基线和阈值。

这篇文章就带你完整拆解这个过程。

一、ui-visual-assert 在整条链路中的位置

先看一下这个 Skill 在完整链路里的位置:

页面 URL / DOM 结构 / 用例描述
  │
  ▼
ui-page-parser ──→ 标准化页面定义 (pages.yaml)
  │
  ▼
ui-testscript-generator ──→ POM + 测试脚本 + 测试数据
  │
  ▼
ui-testscript-enhancer ──→ 健壮性增强(等待+异常+弹窗+验证码+截图)
  │
  ▼
ui-visual-assert ──→ 视觉断言 + 响应式 + 多浏览器适配  ← 这一篇
  │
  ├──→ ui-auto-maintainer ──→ 页面变更检测 + 定位自愈 + 基线更新
  │
  └──→ 含视觉断言的跨浏览器脚本可直接接入 CI/CD

上一步 ui-testscript-enhancer 输出的增强脚本,功能逻辑已经稳定了。ui-visual-assert 做的事情,是在功能断言之上,再加一层视觉维度的校验。

它解决的核心问题是,突破 DOM 断言的天花板。

断言类型 验证什么 局限
DOM 断言 元素存在、文本内容、属性值、URL 元素在就行,不管它长什么样、在什么位置
视觉断言 整页截图比对、局部元素截图比对、布局一致性 需要基线管理、阈值配置,但能发现样式和布局 bug

打个比方,DOM 断言像是在问「零件齐不齐」,视觉断言像是在问「装好之后好不好看」。零件齐全不代表装出来是对的。

二、ui-visual-assert skill 技能介绍

为什么 DOM 断言不够用?

很多团队做 UI 自动化好几年,断言覆盖很全,但线上还是会出现「功能没坏但界面炸了」的问题。原因很简单,DOM 断言的粒度只到属性级别,不到视觉级别。

举几个真实的例子:

样式回归。

前端重构了 CSS 变量,某个按钮的背景色从蓝色变成了白色。data-testid 还在、文本还在、disabled 属性也正确。DOM 断言全过。但用户看到的是一个白色按钮混在白色背景里,根本找不到。

布局错位。

前端改了 flex 布局的 gap 属性,商品列表从一行三个挤成了一行两个。每个商品卡片的定位、文本、价格都正确。DOM 断言全过。但页面排版明显错乱了。

响应式断裂。

桌面端好好的,到了手机分辨率,导航栏折行、按钮重叠、图片溢出。如果不专门针对不同视口跑一遍,这些问题完全发现不了。

跨浏览器差异。

同一段 CSS 动画,Chromium 正常播放,WebKit 闪烁了一下,Firefox 直接跳过了中间帧。功能层面没有影响,但视觉体验完全不同。

这些问题,DOM 断言一个都抓不到。只有视觉层面的截图比对,才能发现。

我的方案

ui-visual-assert 是专门用于为 UI 自动化脚本补充视觉断言能力的 Skill,完成跨浏览器、多分辨率的界面兼容性校验。

它接收增强后的脚本,逐文件扫描分析,自动生成视觉断言代码、响应式适配 fixtures、多浏览器兼容配置,最终输出含视觉断言的跨浏览器测试脚本和完整的视觉基线图库。

核心能力(三大维度):

1. 视觉断言生成

断言类型 实现方式 适用场景
整页截图比对 expect(page).toHaveScreenshot() 验证整页布局是否与基线一致
局部元素截图比对 expect(locator).toHaveScreenshot() 验证单个组件的视觉呈现
动态区域忽略 自定义忽略时间、随机文本等区域 避免时间戳、随机数等动态内容导致误报
像素差异阈值 可配置容差阈值 允许微小渲染差异,避免抗锯齿等非功能差异误报

2. 响应式布局校验

自动适配多种视口分辨率,验证不同尺寸下的布局一致性:

视口类型 分辨率 典型设备
桌面端 1920 × 1080 PC 显示器
平板 768 × 1024 iPad
手机 375 × 812 iPhone

通过参数化 fixture 实现,可自定义任意分辨率。

3. 多浏览器兼容处理

浏览器 容差阈值 说明
Chromium 0.10 渲染最稳定,阈值最低
Firefox 0.15 字体渲染、动画帧略有差异,阈值适中
WebKit 0.12 Safari 内核,部分 CSS 行为不同

自动适配不同浏览器的渲染差异,例如 Firefox 的元素点击偏移问题,避免因浏览器特性差异导致的误报。

输入:

  1. ui-testscript-enhancer 输出的增强脚本
  2. 视觉基线图(可选,首次运行时自动生成)

实操演示

将技能安装好,在技能列表中,选择 ui-visual-assert 技能。

输入项目路径,触发视觉增强:

/ui-visual-assert /Users/xxx/ui-test-automation

接下来,Skill 会自动完成以下步骤:

第一步,扫描项目脚本,识别视觉断言目标。

Skill 会扫描现有的 POM 类和测试脚本,确定哪些页面和元素需要视觉覆盖,输出一份视觉断言计划清单。

第二步,生成视觉比对引擎。

基于 Playwright 原生截图能力 + pixelmatch(像素比对)+ Pillow(图像处理)实现视觉比对。内置 Pillow + numpy 降级方案,保证在不同环境下都能运行。

第三步,合并响应式与跨浏览器 fixtures 到 conftest.py。

将响应式视口参数化和跨浏览器配置合并到 conftest.py,实现一套 fixture 覆盖所有维度。

第四步,生成视觉测试脚本。

自动生成视觉测试模块,包含各页面的视觉测试脚本。比如登录页视觉测试、注册页视觉测试、首页视觉测试。

第五步,更新配置文件和增强 BasePage。

pages/base_page.py 中新增视觉断言方法,在配置文件中更新多浏览器项目配置。

最终生成增强报告,展示修改了哪些文件、新增了哪些文件:

基线提醒: 首次运行时会自动创建基线图,人工需要确认基线是否正确,再决定是否提交到 Git 进行版本控制。

最终输出什么?

增强完成后的项目,相比增强前,新增了以下能力:

比如在 pages/base_page.py 中新增了视觉断言方法:

在测试脚本模块下,新增了 visual 视觉测试模块,包含各页面的视觉测试脚本:

整体产出清单:

产出 内容
视觉断言方法 base_page.py 新增 assert_visual()assert_element_visual() 等方法
视觉测试脚本 tests/visual/ 目录下的各页面视觉测试用例
响应式 fixtures conftest.py 中的参数化视口 fixture(desktop/tablet/mobile)
跨浏览器配置 playwright.config.py 中的多浏览器项目配置 + 容差阈值
视觉基线图库 首次运行自动生成的基线截图,按浏览器 × 视口分组
视觉比对引擎 基于 pixelmatch + Pillow 的像素比对工具

核心价值:突破传统 DOM 断言的局限,不仅校验页面元素与接口数据是否正常,还能直观判断页面视觉展示效果是否符合预期,实现界面全维度校验。

关于基线管理

视觉断言的核心机制是「截图比对」,这离不开基线管理。这个 Skill 的基线策略设计得比较务实:

场景 行为
首次运行 自动创建基线截图,按浏览器 × 视口独立分组
后续运行 自动与基线比对,像素差异超过阈值则报失败
更新基线 设置 UPDATE_SNAPSHOTS=true 重新生成基线
版本控制 基线图提交到 Git,团队共享同一套标准

每个浏览器 × 每个视口都有独立的基线。 这样 Chromium 桌面端、Firefox 平板、WebKit 手机各自的基线互不干扰,避免渲染差异导致的误报。

三、全流程串联回顾

把上面整个过程用命令行风格串起来:

# 1. 准备输入(上一步 ui-testscript-enhancer 的产出)
ui-test-automation/(增强后)
├── pages/enhanced_base_page.py    ← 增强版基类
├── tests/test_*.py                ← 健壮性增强后的用例
├── config/playwright.config.py    ← Playwright 配置
└── ...

# 2. 一句指令启动视觉增强
/ui-visual-assert /Users/zhoujinjian/ui-test-automation

# 3. AI 自动完成五步增强
   ├─ Step 1: 扫描项目 → 输出视觉断言计划清单(哪些页面需要覆盖)
   ├─ Step 2: 生成视觉比对引擎 → pixelmatch + Pillow
   ├─ Step 3: 合并 fixtures → 响应式视口 + 跨浏览器配置
   ├─ Step 4: 生成视觉测试脚本 → 各页面视觉断言用例
   └─ Step 5: 更新配置 + 增强 BasePage → 新增视觉断言方法

# 4. 最终产出
   ui-test-automation/(视觉增强后)
   ├── pages/base_page.py              ← 新增 assert_visual() 等方法
   ├── tests/visual/                   ← 视觉测试模块(新增)
   │   ├── test_login_visual.py        ← 登录页视觉测试
   │   ├── test_register_visual.py     ← 注册页视觉测试
   │   └── test_home_visual.py         ← 首页视觉测试
   ├── conftest.py                     ← 新增响应式 + 跨浏览器 fixtures
   ├── config/playwright.config.py     ← 多浏览器项目 + 容差阈值
   ├── visual-baselines/               ← 视觉基线图库(首次运行生成)
   │   ├── chromium/desktop/           ← Chromium 桌面端基线
   │   ├── chromium/mobile/            ← Chromium 手机端基线
   │   ├── firefox/desktop/            ← Firefox 桌面端基线
   │   └── webkit/desktop/             ← WebKit 桌面端基线
   └── utils/visual_comparator.py      ← 像素比对工具

# 5. 下游直接消费
   视觉增强脚本 → 直接接入 CI/CD → 多浏览器 × 多视口 自动运行
   视觉增强脚本 → ui-auto-maintainer → 基线自动更新 + 视觉回归

四、AI 负责生成,人负责确认基线

视觉断言这个领域,人机边界跟前几个 Skill 有一个重要区别,AI 生成断言代码没问题,但「什么算通过」这件事,必须人来定义。

ui-visual-assert 能帮你完成的是「扫描 + 生成 + 配置」这个动作。但以下这些事情,仍然需要人来把关:

AI 负责的事 人负责的事
扫描项目,识别视觉覆盖目标 确认覆盖范围是否完整(有没有遗漏关键页面)
生成视觉断言代码和比对引擎 确认断言粒度是否合理(整页比对还是局部比对)
配置响应式视口参数 确认视口分辨率是否匹配真实用户设备分布
配置多浏览器容差阈值 确认阈值是否合理(太严会误报,太松会漏 bug)
首次运行自动生成基线截图 确认基线是否正确(这是最关键的一步)
后续运行自动比对报差异 审查差异报告,判断是真实 bug 还是有意改版

这里有几条实操经验特别重要:

第一,基线确认是重中之重。 视觉断言的本质是「跟基线比对」,基线错了,后面所有的比对结果都不可信。首次生成基线后,务必逐张截图人工确认,确认无误后再提交到 Git。

第二,动态区域一定要忽略。 页面上有很多动态内容(时间戳、随机验证码、广告位、用户头像),如果不配置忽略区域,每次运行都会因为这些动态内容而报失败。Skill 支持自定义忽略区域,上线前务必配好。

第三,容差阈值要按浏览器分别设置。 不同浏览器的渲染引擎不同,字体抗锯齿、阴影渲染、动画插值都有细微差异。Chromium 渲染最稳定,阈值设最低(0.10);Firefox 和 WebKit 的渲染差异更大,阈值适当放宽(0.15、0.12)。这个 Skill 已经预置了合理的默认值,但建议根据实际项目微调。

第四,基线更新要走流程。 前端有意的 UI 改版(比如换了配色、调整了布局),需要更新基线。但更新基线不能随意操作,应该走「前端提 UI 变更 → 测试确认 → 更新基线 → 提交 Git」的流程,避免无意中把 bug 固化成基线。

AI 负责把视觉断言从 0 搭到 80,人负责确认基线和阈值,把它校准到 100。 视觉断言的可靠性,最终取决于基线质量和阈值调校。

五、Skill 源码与完整教程

大家可以自己根据本文提供的思路进行开发 skill,如果需要现成的教程和 skill,也可以加入「狂师 . AI 进化社」获取,里面有各类 AI 技术落地保姆级图文教程、视频教程,包括 AI 赋能测试全流程的实战教程(保姆级手把手喂饭教程,跟着步骤操作,零基础也能快速上手,目前含有 30 多个 AI 测试全场景的 Agent Skill)

温馨提醒,「AI 测试」只是 AI 进化社八大技能版块之一。

写在最后

回顾一下整个流程:

痛点: DOM 断言测不出样式 bug、多浏览器兼容成本高、响应式布局是盲区、视觉回归靠人眼、差异判断凭感觉、基线管理混乱。

方案:ui-visual-assert Skill,自动扫描项目生成视觉断言代码、配置响应式视口 fixtures、配置多浏览器兼容容差,输出含视觉断言的跨浏览器测试脚本和完整基线图库。

效果: 传统模式下,人工编写视觉断言 + 配置多浏览器 + 调试容差阈值,一个项目至少需要一周。而 ui-visual-assert 只需要几分钟,就能完成全量视觉增强,让脚本从「功能验证」升级为「全维度校验」。

边界: AI 负责生成断言代码和配置,人负责确认基线和阈值。基线质量决定视觉断言的可靠性,动态区域忽略和容差阈值需要根据实际项目调校。

最后聊一个设计上的考量。这个 Skill 在实现方案设计上有一个细节值得注意,它采用了 pixelmatch + Pillow 而不是直接依赖 AI 视觉大模型做比对。

为什么?因为视觉断言的核心需求是「精确的像素级比对」,不是「语义理解」。pixelmatch 轻量、快速、确定性高,同一组截图比对一万次结果都一样。而 AI 视觉大模型存在推理不确定性,同一组截图跑两次可能给出不同判断,这在测试场景中是不可接受的。

工具选型的关键不是「用最新的技术」,而是「用最合适的技术」。 像素比对用 pixelmatch,验证码识别用 ddddocr,各有各的最佳场景。

目前这套 AI 测试赋能的 Skill 技能组合,「狂师 . AI 进化社」的成员都在使用,很多同学反馈,终于不用靠人肉翻截图做视觉回归了,多浏览器兼容的效率也提升了好几个量级。

到这里,UI 自动化的核心链路「解析 → 生成 → 增强 → 视觉」已经基本完整了。下一篇我们聚焦 ui-auto-maintainer,聊聊如何实现页面变更检测、定位策略自动修复、视觉基线自动更新,让 UI 自动化脚本真正实现「自愈」,彻底解决维护成本高这个终极难题。


原文地址: https://www.cveoy.top/t/topic/qHgW 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录