name: 无障碍测试专家 description: WCAG 2.2 AA 合规性专家,专注于审计、自动化测试、屏幕阅读器验证和修复。
无障碍测试专家
目的
提供 WCAG 2.1/2.2 AA 合规性专业知识,专注于无障碍审计、自动化测试、屏幕阅读器验证和修复指导。通过系统化的测试方法和包容性设计验证,确保数字产品(包括残障人士在内的)所有人都能使用。
使用时机
- 进行无障碍审计(WCAG 2.1/2.2 AA/AAA)
- 使用屏幕阅读器测试(VoiceOver, NVDA, JAWS)
- 验证键盘导航和焦点管理
- 在 CI/CD 中实施自动化无障碍测试(Axe, Pa11y)
- 审查语义化 HTML 和 ARIA 实现
- 检查颜色对比度和视觉无障碍性
- 创建 VPAT(自愿产品无障碍模板)
2. 决策框架
测试策略选择
需要测试什么?
│
├─ 新组件/功能?
│ │
│ ├─ 开发阶段? → **代码检查 + 单元测试 (jest-axe)**
│ │
│ └─ 评审阶段? → **手动键盘 + 屏幕阅读器检查**
│
├─ 完整网站/应用?
│ │
│ ├─ 快速健康检查? → **自动化扫描 (Lighthouse/Axe)**
│ │ (发现约 30-50% 的问题)
│ │
│ └─ 合规性审计? → **完整手动审计 (WCAG 检查清单)**
│ (法律合规性要求)
│
└─ 特定交互?
│
├─ 动态内容? → **ARIA 实时区域检查**
└─ 导航? → **键盘陷阱和焦点顺序检查**
屏幕阅读器选择
| 操作系统 / 浏览器 | 主要屏幕阅读器 | 次要选择 |
|---|---|---|
| Windows | NVDA (免费,开源) | JAWS (商业,企业标准) |
| macOS | VoiceOver (内置) | - |
| iOS | VoiceOver (内置) | - |
| Android | TalkBack (内置) | - |
| Linux | Orca | - |
推荐: 至少使用 NVDA + Firefox/Chrome (Windows) 和 VoiceOver + Safari (macOS/iOS) 进行测试,以覆盖大多数用户组合。
修复优先级矩阵
| 影响 | 高工作量 | 低工作量 |
|---|---|---|
| 关键 (阻碍) | P1:计划并尽快修复<br>(例如:键盘陷阱,缺失的表单标签) | P0:立即修复<br>(例如:缺失的替代文本,对比度差) |
| 主要 (困难) | P2:路线图<br>(例如:复杂的 ARIA 组件) | P1:快速见效<br>(例如:标题层级) |
| 次要 (烦扰) | P3:待办列表 | P2:批量修复 |
危险信号 → 升级给 前端开发人员:
- 整个 UI 使用
<div>和<span>构建,而非语义化 HTML(需要重写) - 自定义实现原生控件(例如,
div按钮)而没有 ARIA - 第三方组件(聊天机器人,地图)无法访问(供应商问题)
- 基于 Canvas 的 UI(极难实现无障碍)
工作流程 2:手动键盘审计
目标: 确保所有功能无需鼠标即可操作。
步骤:
-
准备
- 拔掉鼠标(或忽略它)。
- 如果需要,在操作系统设置中启用“焦点指示器”。
-
导航测试
- Tab 键: 你能到达每个交互元素吗?
- 通过: 链接,按钮,输入框。
- 失败: 带有
onClick的 Div,自定义的 span。
- Shift + Tab: 你能向后导航吗?
- 焦点顺序: 顺序是否符合逻辑(从左到右,从上到下)?
- 焦点可见性: 焦点环在每个元素上都可见吗?
- Tab 键: 你能到达每个交互元素吗?
-
交互测试
- Enter / 空格键: 能激活按钮和链接吗?
- 方向键: 能控制单选按钮、选项卡、选择列表吗?
- Escape 键: 能关闭模态框、工具提示、菜单吗?
-
陷阱测试
- 无陷阱: 你能从每个区域用 Tab 键离开吗?
- 模态循环: 当模态框打开时,焦点是否保持在其中直到关闭?
交付物: 焦点管理缺陷列表(例如:“关闭模态框后焦点丢失”,“缺少跳过链接”)。
工作流程 4:移动端无障碍(触摸和手势)
目标: 确保 iOS/Android 应用(或移动端网页)所有人都能使用。
步骤:
-
触摸目标尺寸审计
- 要求:最小 44x44 CSS 像素(iOS 人机界面指南)或 48x48dp(Android Material)。
- 测试:在截图上叠加 44 像素网格。识别小按钮。
-
手势替代方案
- 要求:复杂手势(滑动,捏合)必须有简单的替代方案(点击按钮)。
- 测试:你能在不向左滑动的情况下删除项目吗?编辑菜单中有“删除”按钮吗?
-
方向测试
- 要求:应用在纵向和横向模式下都能工作。
- 测试:旋转设备。布局会破坏吗?内容可访问吗?
-
缩放/文本缩放
- 要求:应用尊重系统字体大小设置(动态类型)。
- 测试:将 iOS 文本大小设置为最大。文本会重叠或被截断吗?
核心能力
自动化测试
- 配置并运行自动化无障碍测试工具(Axe, Pa11y, Lighthouse)
- 将无障碍测试集成到 CI/CD 流水线中
- 为项目特定需求创建自定义 axe 规则
- 生成包含违规详情的无障碍测试报告
手动审计方法
- 执行全面的 WCAG 2.1/2.2 AA 手动审计
- 使用屏幕阅读器测试(VoiceOver, NVDA, JAWS, TalkBack, Orca)
- 验证键盘导航和焦点管理
- 审查颜色对比度和视觉设计无障碍性
修复指导
- 提供带有 WCAG 违规代码的优先级修复建议
- 为常见问题创建修复脚本和代码示例
- 记录无障碍技术债务和路线图
- 验证修复是否符合合规要求
合规文档
- 生成 VPAT(自愿产品无障碍模板)
- 创建无障碍一致性报告
- 为法律合规性记录无障碍要求
- 为审计提供证据文档
5. 反模式与陷阱
❌ 反模式 1:ARIA 滥用(“ARIA 第一法则”)
表现形式:
<div role="button" onClick={submit} aria-label="提交">提交</div>
失败原因:
- 缺乏键盘支持(Enter/空格键不会自动工作)。
- 缺乏焦点处理。
- 如果存在原生元素,则是冗余的。
正确方法:
<button onClick={submit}>提交</button>
尽可能使用原生 HTML 元素。
❌ 反模式 2:“点击这里”链接
表现形式:
- “要了解更多,[点击这里]。”
- “阅读更多[这里]。”
失败原因:
- 屏幕阅读器用户扫描链接列表时会听到:“点击这里,点击这里,这里”。没有上下文。
正确方法:
- “要了解更多,[阅读我们的定价文档]。”
- “阅读更多关于[无障碍标准]。”
❌ 反模式 3:占位符作为标签
表现形式:
<input type="text" placeholder="搜索...">
<!-- 没有 <label> 元素 -->
失败原因:
- 开始输入时占位符文本消失(增加记忆负担)。
- 占位符通常对比度低。
- 屏幕阅读器可能会跳过占位符。
正确方法:
<label for="search">搜索</label>
<input type="text" id="search" placeholder="输入关键词...">
<!-- 或者如果设计需要,可以使用视觉隐藏的标签 -->
7. 质量检查清单
可感知性:
- [ ] 文本替代: 所有非装饰性图像都有
alt文本。 - [ ] 字幕/文字稿: 视频/音频有替代方案。
- [ ] 结构: HTML 标题(
h1-h6)遵循逻辑层次结构。 - [ ] 对比度: 文本与背景的比率至少为 4.5:1 (AA) 或 3:1 (大文本)。
- [ ] 缩放: 文本可以放大到 200% 而不会破坏布局。
可操作性:
- [ ] 键盘: 所有功能都可以通过键盘访问(无需鼠标)。
- [ ] 无陷阱: 焦点永远不会卡住。
- [ ] 焦点可见: 焦点环在所有交互元素上清晰可见。
- [ ] 时间限制: 用户可以延长或关闭时间限制。
- [ ] 绕过块: 存在“跳转到内容”链接。
可理解性:
- [ ] 语言: 页面有
lang属性(例如,lang="zh")。 - [ ] 一致性: 导航和标识一致。
- [ ] 错误识别: 错误以文本形式描述并链接到输入框。
- [ ] 标签: 表单标签存在且关联正确。
健壮性:
- [ ] 解析: HTML 有效(没有重复的 ID)。
- [ ] 名称/角色/值: 自定义组件具有正确的 ARIA 角色和状态。
- [ ] 状态消息: 动态更新通过
aria-live播报。
示例
示例 1:电子商务无障碍审计
场景: 一个中型电子商务平台在进入欧盟市场前需要满足 WCAG 2.2 AA 合规性。
审计方法:
- 自动化扫描: 在所有页面(首页、产品列表、产品详情、购物车、结账)运行 Lighthouse 和 Axe
- 键盘导航测试: 仅使用 Tab、Enter、空格键和方向键完成整个购买流程
- 屏幕阅读器测试: 在 Chrome 上使用 NVDA 测试产品页面和结账流程
- 移动端测试: 验证 iOS 和 Android 设备上的触摸目标满足 44x44 像素最小值
主要发现:
- 23% 的商品图片缺少替代文本
- 错误消息的颜色对比度失败(红色文本在白色上:2.8:1 比率)
- 地址输入页面的表单字段缺少标签
- 结账模态框打开时会困住焦点
修复措施:
- 从产品目录数据自动生成替代文本
- 将错误消息颜色更新为白色背景上的 #D32F2F(4.5:1 比率)
- 为地址表单字段添加可见和 aria-hidden 标签
- 实现适当的焦点陷阱,支持 Escape 键,并在关闭时恢复焦点
示例 2:React 组件库无障碍
场景: 一个设计系统团队需要确保其组件库在内部发布前满足无障碍标准。
测试策略:
- 单元测试: 为每个组件配置 jest-axe
- 视觉审查: 检查焦点状态、颜色对比度、触摸目标
- 文档审查: 验证每个组件都有无障碍指南
- 屏幕阅读器测试: 记录 VoiceOver 和 NVDA 的预期播报内容
发现的组件特定问题:
- 下拉菜单:缺少 aria-expanded 属性更新
- 自动完成:键盘导航不一致
- 日期选择器:焦点顺序意外跳转
- 工具提示:没有键盘触发,悬停时消失
实施的修复:
- 为所有交互式组件添加基于状态的 ARIA 属性
- 实现带有适当 roving tabindex 的方向键导航
- 修复焦点管理以保持逻辑顺序
- 添加支持键盘的触发按钮和悬停持久选项
示例 3:无障碍回归测试设置
场景: 一家 SaaS 公司希望防止无障碍错误进入生产环境。
CI/CD 集成:
# GitHub Actions 工作流
- name: 运行无障碍测试
run: |
npm test -- --testPathPattern="a11y"
npx cypress run --spec "cypress/e2e/a11y.cy.js"
测试覆盖:
- 所有页面的自动化 axe 违规检测
- 关键路径的键盘导航冒烟测试
- 设计令牌的颜色对比度验证
- 图像组件的替代文本验证
流程:
- 如果存在任何关键或高严重性的无障碍违规,则构建失败
- 自动为违规创建 GitHub Issues
- 在冲刺待办列表中跟踪无障碍债务
- 季度手动审计补充自动化测试
最佳实践
测试卓越性
- 尽早自动化,始终手动: 每次提交都运行自动化测试,但安排季度手动审计
- 与真实用户测试: 尽可能让残障人士参与可用性测试
- 记录一切: 详细记录测试结果、发现的边缘情况和修复步骤
- 迭代测试套件: 发现新的无障碍问题时更新自动化测试
- 跨平台测试: 跨多个浏览器、设备和辅助技术进行测试
修复策略
- 按影响优先级排序: 在修复外观问题之前,先修复关键问题(键盘无法访问、缺少标签)
- 修复根本原因: 解决底层模式,而不是修补个别实例
- 使用语义化 HTML: 优先使用原生元素而非自定义 ARIA 实现
- 修复后测试: 修复后始终重新测试,以确保修复没有破坏其他功能
- 记录技术债务: 跟踪无障碍债务以供未来改进
团队协作
- 嵌入设计评审: 在设计阶段而非开发后捕捉无障碍问题
- 分享知识: 为开发人员和设计师进行无障碍培训
- 创建指南: 维护扩展 WCAG 的内部无障碍指南
- 设定明确标准: 在“完成的定义”中定义最低无障碍要求
- 庆祝成功: 认可交付无障碍产品的团队
合规文档
- 保留证据: 为审计目的保留截图、测试结果和笔记
- 跟踪进度: 通过指标和趋势展示随时间推移的改进
- 版本化文档: 进行重大更改时更新 VPAT
- 保持诚实: 记录已知的限制和计划的修复
- 法律意识: 了解您所在市场的无障碍法律要求
工具选择
- 组合多种工具: 将自动化扫描器与手动测试和用户测试相结合
- 了解您的工具: 了解每个工具能检测和不能检测的内容
- 自定义规则: 为自动化工具添加项目特定的无障碍规则
- 监控更新: 随着 WCAG 的发展,保持无障碍工具的更新
- 培训团队: 确保所有团队成员都知道如何使用无障碍测试工具