视觉测试
它能做什么?
WebdriverIO提供屏幕、元素或整个页面的图像比较功能,适用于:
- 🖥️ 桌面浏览器(Chrome / Firefox / Safari / Microsoft Edge)
- 📱 移动/平板浏览器(通过Appium在Android模拟器上的Chrome / iOS模拟器上的Safari / 模拟器 / 真实设备)
- 📱 原生应用(通过Appium在Android模拟器 / iOS模拟器 / 真实设备上)(🌟 新功能 🌟)
- 📳 通过Appium的混合应用
这些功能通过轻量级WebdriverIO服务@wdio/visual-service
提供。
这使您能够:
- 保存或比较屏幕/元素/整页截图与基准图像
- 当没有基准图像时自动创建基准
- 屏蔽自定义区域,甚至在比较期间自动排除状态栏和工具栏(仅限移动设备)
- 增加元素尺寸截图
- 在网站比较期间隐藏文本,以:
- 提高稳定性并防止字体渲染不稳定
- 只关注网站的布局
- 使用不同的比较方法和一组额外的匹配器,使测试更易读
- 验证您的网站如何支持键盘Tab键导航,参见通过网站Tab导航
- 以及更多功能,查看服务和方法选项
该服务是一个轻量级模块,用于为所有浏览器/设备检索所需的数据和截图。比较功能来自ResembleJS。如果您想在线比较图像,可以查看在线工具。
方法saveScreen
、saveElement
、checkScreen
、checkElement
以及匹配器toMatchScreenSnapshot
和toMatchElementSnapshot
可用于原生应用/上下文。
如果您想将其用于混合应用,请在服务设置中使用isHybridApp:true
属性。
安装
最简单的方法是通过以下命令将@wdio/visual-service
作为开发依赖保存在您的package.json
中:
npm install --save-dev @wdio/visual-service
使用方法
@wdio/visual-service
可以作为普通服务使用。您可以在配置文件中按以下方式设置:
import path from "node:path";
// wdio.conf.ts
export const config = {
// ...
// =====
// Setup
// =====
services: [
[
"visual",
{
// 一些选项,查看文档了解更多
baselineFolder: path.join(process.cwd(), "tests", "baseline"),
formatImageName: "{tag}-{logName}-{width}x{height}",
screenshotPath: path.join(process.cwd(), "tmp"),
savePerInstance: true,
// ... 更多选项
},
],
],
// ...
};
更多服务选项可以在这里找到。
在WebdriverIO配置中设置好后,您可以继续向您的测试添加视觉断言。
能力配置
要使用视觉测试模块,您不需要向能力配置添加任何额外选项。但是,在某些情况下,您可能希望向视觉测试添加额外的元数据,例如logName
。
logName
允许您为每个能力分配一个自定义名称,然后可以将其包含在图像文件名中。这对于区分在不同浏览器、设备或配置上拍摄的截图特别有用。
要启用此功能,您可以在capabilities
部分定义logName
,并确保视觉测试服务中的formatImageName
选项引用它。以下是设置方法:
import path from "node:path";
// wdio.conf.ts
export const config = {
// ...
// =====
// Setup
// =====
capabilities: [
{
browserName: 'chrome',
'wdio-ics:options': {
logName: 'chrome-mac-15', // Chrome的自定义日志名
},
}
{
browserName: 'firefox',
'wdio-ics:options': {
logName: 'firefox-mac-15', // Firefox的自定义日志名
},
}
],
services: [
[
"visual",
{
// 一些选项,查看文档了解更多
baselineFolder: path.join(process.cwd(), "tests", "baseline"),
screenshotPath: path.join(process.cwd(), "tmp"),
// 下面的格式将使用capabilities中的`logName`
formatImageName: "{tag}-{logName}-{width}x{height}",
// ... 更多选项
},
],
],
// ...
};
工作原理
-
设置
logName
:- 在
capabilities
部分,为每个浏览器或设备分配一个唯一的logName
。例如,chrome-mac-15
标识在macOS 15版本上运行的Chrome测试。
- 在
-
自定义图像命名:
-
formatImageName
选项将logName
集成到截图文件名中。例如,如果tag
是homepage,分辨率是1920x1080
,则生成的文件名可能如下所示:homepage-chrome-mac-15-1920x1080.png
-
-
自定义命名的好处:
- 区分来自不同浏览器或设备的截图变得更加容易,特别是在管理基准和调试差异时。
-
默认值说明:
- 如果在capabilities中未设置
logName
,则formatImageName
- 如果在capabilities中未设置