Playwright Test 包含使用 await expect(page).toHaveScreenshot() 生成截图并进行视觉比较的能力。首次执行时,Playwright Test 将生成参考截图。后续运行将与参考截图进行比较。
import { test, expect } from '@playwright/test';
test('example test', async ({ page }) => { await page.goto('https://playwright.dev'); 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.tsdrwxr-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 配置中通过 testConfig.snapshotPathTemplate 进行配置。
有时你需要更新参考截图,例如页面发生变化时。可以使用 --update-snapshots 标志执行此操作。
npx playwright test --update-snapshotsmaxDiffPixels
Section titled “maxDiffPixels”Playwright Test 使用 pixelmatch 库。你可以传递各种选项来修改其行为:
import { test, expect } from '@playwright/test';
test('example test', async ({ page }) => { await page.goto('https://playwright.dev'); await expect(page).toHaveScreenshot({ maxDiffPixels: 100 });});如果你希望在项目中的所有测试之间共享默认值,可以在 Playwright 配置中指定它,可以是全局配置,也可以是按项目配置:
import { defineConfig } from '@playwright/test';export default defineConfig({ expect: { toHaveScreenshot: { maxDiffPixels: 100 }, },});stylePath
Section titled “stylePath”你可以在截图时将自定义样式表应用到页面。这允许过滤掉动态或易变元素,从而提高截图的确定性。
iframe { visibility: hidden;}import { test, expect } from '@playwright/test';test('example test', async ({ page }) => { await page.goto('https://playwright.dev'); 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.dev'); expect(await page.textContent('.hero__title')).toMatchSnapshot('hero.txt');});快照存储在测试文件旁边的单独目录中。例如,my.spec.ts 文件将在 my.spec.ts-snapshots 目录中生成并存储快照。你应该将此目录提交到版本控制系统(例如 git),并审查其中的任何更改。