--- url: /guide/browser/aria-snapshots.md --- # ARIA 快照 4.1.4 {#aria-snapshots} ARIA 快照允许你测试页面的可访问性结构。你不需要断言原始 HTML 或视觉输出,而是断言**可访问性树**——即屏幕阅读器和其他辅助技术所使用的同一结构。 给定以下 HTML: ```html ``` 你可以断言其可访问性树: ```ts await expect.element(page.getByRole('navigation')).toMatchAriaInlineSnapshot(` - navigation "主导航": - link "首页": - /url: / - link "关于": - /url: /about `) ``` 这可以捕获可访问性回归问题:缺少标签、错误的角色、不正确的标题层级等——这些都是 DOM 快照无法检测到的。即使底层 HTML 结构发生变化,只要语义内容匹配,断言也不会失败。 对于高级场景,你还可以通过 `vitest/browser` 中的 `utils.aria` 生成并检查 ARIA 树。详情请参阅 [Context API](/api/browser/context#aria)。 ## 快照工作流 ARIA 快照使用与其它快照断言相同的 Vitest 快照流程。文件快照、内联快照、`--update` / `-u`、监视模式更新以及 CI 快照行为都一致工作。 请参阅主要的[快照指南](/guide/snapshot)了解通用快照流程、更新行为和审核规范。 ## 基本用法 给定一个包含以下 HTML 的页面: ```html
``` ### 文件快照 使用 `toMatchAriaSnapshot()` 将快照存储在测试旁边的 `.snap` 文件中: ```ts [basic.test.ts] import { expect, test } from 'vitest' test('登录表单', async () => { await expect.element(page.getByRole('form')).toMatchAriaSnapshot() }) ``` 首次运行时,Vitest 会生成一个快照文件条目: ```js [__snapshots__/basic.test.ts.snap] // Vitest 快照 ... exports[`登录表单 1`] = ` - form "登录": - textbox "邮箱" - textbox "密码" - button "提交" ` ``` ### 内联快照 使用 `toMatchAriaInlineSnapshot()` 将快照直接存储在测试文件中: ```ts import { expect, test } from 'vitest' test('登录表单', async () => { await expect.element(page.getByRole('form')).toMatchAriaInlineSnapshot(` - form "登录": - textbox "邮箱" - textbox "密码" - button "提交" `) }) ``` ## 浏览器模式下的重试行为 在[浏览器模式](/guide/browser/)中,`expect.element()` 会轮询 DOM 并等待可访问性树**稳定**后再评估结果。每次轮询时,匹配器会重新查询元素并重新捕获可访问性树。当连续两次轮询产生相同输出时,快照被认为已稳定。 ```ts await expect.element(page.getByRole('form')).toMatchAriaInlineSnapshot(` - form "登录": - textbox "邮箱" - textbox "密码" - button "提交" `) ``` 在首次运行或使用 `--update` 时,稳定的结果会被写入为新快照。 当存在现有快照时,匹配器也会检查稳定结果是否匹配。如果不匹配,轮询会重置并继续——这为 DOM 达到预期状态提供了时间。这处理了动画、异步渲染或延迟状态更新等情况,在这些情况下,树可能会在中间状态短暂稳定,然后再收束到最终形式。 ## 保留手动编辑的模式 当你手动编辑快照以使用正则表达式模式时,这些模式会在 `--update` 时保留。只有发生变化的字面部分会被覆盖。这让你可以编写灵活的断言,而不会在内容变化时断裂。 ### 示例 **步骤 1。** 你的购物车页面渲染以下 HTML: ```html
第一行
第二行
第三行
第四行
你好世界
``` ```yaml - paragraph: 你好世界 ``` ### 属性 ARIA 状态和属性以方括号显示: | HTML | 快照 | | ---------------------------------------------------------------- | ----------------------------------- | | `` | `- checkbox "同意" [checked]` | | `` | `- checkbox "全选" [checked=mixed]` | | `` | `- button "提交" [disabled]` | | `` | `- button "菜单" [expanded]` | | `