前端可访问性测试应关注可访问性树而非DOM结构,使用getByRole验证角色与名称,同步状态属性,禁用CSS后仍保持语义,且jsdom无法替代真实浏览器进行焦点、状态等交互测试,需用真实环境确保无障碍。
在可访问性测试(无障碍测试)中,一个常见误区是只盯着 DOM 结构看——比如检查 标签是否存在,或者某个元素有没有 class="btn"。但实际用户(尤其是依赖辅助技术的用户)并不关心标签名或 class 值,他们关心的是:这个元素在可访问性树里是不是一个按钮、有没有 accessible name、能不能用键盘聚焦。而这些状态,只能通过语义属性和真实浏览器环境来验证。仅用 querySelector 检查标签或 class,等于在测字符串,而不是测用户的真实操作。

长期稳定更新的攒劲资源: >>>点此立即查看<<<
HTML 标签本身不带交互逻辑。 在 Chrome DevTools 中执行 jsdom 不解析 CSS、不触发 layout、不模拟焦点样式、不支持 真实的可访问性测试最难的不是写断言,而是让组件从第一行 HTML 就带上可测锚点:role、name、state 缺一不可,且不能靠 class 或内联样式驱动行为。 侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述 和 role 和 name。即便给 role="button",如果缺少 aria-label 或可见文本,屏幕阅读器根本读不到它。所以,只测结构就像只检查包装袋上的字,却不管里面有没有东西。
如何用 getByRole 定位并验证真实可访问性状态
getByRole 是目前最贴近用户操作的定位方式。它会自动查找可访问性树中匹配 role 和 name 的元素,同时触发隐式等待(比如组件异步渲染后才出现)。使用时需注意几个关键点:
name:例如 screen.getByRole('checkbox', { name: '接收邮件通知' })。如果 DOM 存在但 name 不匹配,测试会报错——这恰恰是组件缺少 aria-label 或可见文本的信号,不是 API 的问题。disabled 属性:有些组件用 aria-disabled="true" 或 class 模拟禁用,但浏览器并不阻止焦点和点击。因此 await expect(checkbox).toBeDisabled() 才是真正的检查。aria-expanded:expect(button).toHaveAttribute('aria-expanded', 'true') 是必要断言,否则屏幕阅读器无法感知状态变化。测试时禁用 CSS 后能否维持语义结构
Command Menu → "Disable styles",页面只剩语义骨架。此时如果 看起来像普通段落、 无法被键盘 Tab 到、 没有焦点环,说明结构依赖样式而非语义——这种组件在无障碍场景下就是不可用的。请记住三个要点:
→ → ,不能跳级或用 aria-label="" 占位。Elements → Inspect Accessibility Properties 直接查看可访问性树,比肉眼判断可靠得多。jsdom 为什么不能替代真实浏览器做可访问性测试
IntersectionObserver,更不会构建可访问性树。它返回的 offsetHeight 恒为 0,focus() 不触发 :focus-visible,aria-expanded 属性变了但屏幕阅读器根本读不到。因此它的适用场景非常有限:
generateCardHtml(data),断言输出是否包含 和 aria-label。host.shadowRoot().locator('button'),而 jsdom 完全不支持 shadowRoot API。相关攻略
更多
同类更新
更多
热游推荐
更多
下载
下载
下载
下载
下载