视觉比较
简介
Playwright Test 包括使用 await expect(page).toHaveScreenshot()
生成和视觉比较截图的能力。第一次执行时,Playwright 测试将生成参考截图。后续运行将与参考进行比较。
import { test, expect } from '@playwright/test';
test('example test', async ({ page }) => {
await page.goto('https://playwright.net.cn');
await expect(page).toHaveScreenshot();
});
生成截图
当您第一次运行上述代码时,测试运行器会说
Error: A snapshot doesn't exist at example.spec.ts-snapshots/example-test-1-chromium-darwin.png, writing actual.
这是因为还没有金标准文件。此方法会一直截取截图,直到连续两次截图匹配,并将最后一次截图保存到文件系统。现在,它已准备好添加到存储库中。
包含金标准期望的文件夹名称以您的测试文件名称开头
drwxr-xr-x 5 user group 160 Jun 4 11:46 .
drwxr-xr-x 6 user group 192 Jun 4 11:45 ..
-rw-r--r-- 1 user group 231 Jun 4 11:16 example.spec.ts
drwxr-xr-x 3 user group 96 Jun 4 11:46 example.spec.ts-snapshots
快照名称 example-test-1-chromium-darwin.png
包含几个部分
-
example-test-1.png
- 快照的自动生成名称。或者,您可以将快照名称指定为toHaveScreenshot()
方法的第一个参数await expect(page).toHaveScreenshot('landing.png');
-
chromium-darwin
- 浏览器名称和平台。由于渲染、字体等方面的差异,不同浏览器和平台上的截图会有所不同,因此您需要为它们提供不同的快照。如果您在 配置文件 中使用多个项目,则将使用项目名称而不是chromium
。
快照名称和路径可以通过 Playwright 配置中的 snapshotPathTemplate
进行配置。
更新截图
有时您需要更新参考截图,例如当页面发生更改时。使用 --update-snapshots
标志执行此操作。
npx playwright test --update-snapshots
请注意,
snapshotName
也接受快照文件路径段的数组,例如expect().toHaveScreenshot(['relative', 'path', 'to', 'snapshot.png'])
。但是,此路径必须保持在每个测试文件的快照目录内(即a.spec.js-snapshots
),否则会抛出异常。
选项
maxDiffPixels
Playwright Test 使用 pixelmatch 库。您可以 传递各种选项 来修改其行为
import { test, expect } from '@playwright/test';
test('example test', async ({ page }) => {
await page.goto('https://playwright.net.cn');
await expect(page).toHaveScreenshot({ maxDiffPixels: 100 });
});
如果您希望在项目中的所有测试中共享默认值,可以在 Playwright 配置中将其指定为全局或按项目指定
import { defineConfig } from '@playwright/test';
export default defineConfig({
expect: {
toHaveScreenshot: { maxDiffPixels: 100 },
},
});
stylePath
您可以在截取截图时将自定义样式表应用到页面。这允许过滤掉动态或不稳定的元素,从而提高截图的确定性。
iframe {
visibility: hidden;
}
import { test, expect } from '@playwright/test';
test('example test', async ({ page }) => {
await page.goto('https://playwright.net.cn');
await expect(page).toHaveScreenshot({ stylePath: path.join(__dirname, 'screenshot.css') });
});
如果您希望在项目中的所有测试中共享默认值,可以在 Playwright 配置中将其指定为全局或按项目指定
import { defineConfig } from '@playwright/test';
export default defineConfig({
expect: {
toHaveScreenshot: {
stylePath: './screenshot.css'
},
},
});
非图像快照
除了截图之外,您还可以使用 expect(value).toMatchSnapshot(snapshotName)
来比较文本或任意二进制数据。Playwright Test 会自动检测内容类型并使用相应的比较算法。
这里我们将文本内容与参考进行比较。
import { test, expect } from '@playwright/test';
test('example test', async ({ page }) => {
await page.goto('https://playwright.net.cn');
expect(await page.textContent('.hero__title')).toMatchSnapshot('hero.txt');
});
快照存储在测试文件旁边,位于一个单独的目录中。例如,my.spec.ts
文件将在 my.spec.ts-snapshots
目录中生成和存储快照。您应该将此目录提交到您的版本控制(例如 git
)中,并审查对它的任何更改。