关于 behavioral-a11y
一套用于自动化行为可访问性检查的规范技能,指导如何执行和解读会改变页面状态的测试,适合编写测试或审查结果的团队。它区分风险指示、已确认失败、无法判断和测试错误,避免把自动化结果误当作合规结论。
主要功能
- 01规范行为检查的结果分类
- 02检查窄视口下的页面溢出
- 03通过 Tab 操作检查焦点可见性
- 04区分误报、测试波动与运行错误
- 05强调按根因聚类大规模问题
适用场景
- 01审查自动化可访问性测试结果
- 02检查窄屏重排与键盘焦点状态
- 03制定 CI 中的检查阻断策略
- 04归并跨页面的共享组件问题
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ mgifford/ accessibility-skills --skill behavioral-a11y安装后在 Claude Code 中输入/behavioral-a11y确认已加载。
附带文件SYNC.md
详细介绍
行为可访问性自动化技能
规范来源:
mgifford/ACCESSIBILITY.md中的examples/BEHAVIORAL_ACCESSIBILITY_AUTOMATION.md此技能源自该文件。如有疑问,以该示例为准。
在编写、运行或解读会操作渲染后页面的自动化检查时,应用以下规则;这些检查并非只检查静态标记或单一的计算后可访问性树。
严重性等级(本技能)
| 级别 | 含义 |
|---|---|
| 严重 | 未满足本技能中的前置条件,却将行为结果报告为已确认失败或作为门禁条件 |
| 较高 | 将指示信号、cantTell 和已确认失败结果合并为一个通过/失败信号 |
| 中等 | 报告或分流大规模发现的问题前,未按根本原因进行归类 |
| 轻微 | 未记录检查已知的误报/漏报限制 |
严重:行为检查的作用
静态分析和单次快照的浏览器规则扫描(axe-core 及类似工具)能回答“此属性是否有效”或“此元素是否有可访问名称”等问题。它们无法回答只有在页面被使用时才会出现的问题:窄视口下布局是否仍能正常工作,键盘用户是否能看到焦点提示,调整大小或增加间距后内容是否会被裁切,动态 UI 状态(打开的菜单、验证错误、加载指示器)是否能维持与页面初始状态相同的保障。
行为检查通过实际执行用户会做的操作来回答这些问题——调整大小、按 Tab 键、悬停、等待——并观察结果。因此,相较于静态检查,行为检查成本更高,也更容易受到环境因素影响而产生不稳定结果(动画、字体、时序);但这并不意味着它们是符合性测试。
严重:结果分类术语
每项行为检查都必须使用以下结果类别之一。保持术语一致,才能确保自动化结果如实反映其实际确认的内容。
| 类别 | 含义 |
|---|---|
| 指示信号 | 观察到与潜在障碍相关的信号,但未排除合理解释(SC 例外、有意设计、容易产生误报的边缘情况)。应转交人工审核。 |
| 已确认失败(针对所测实例) | 已确认满足排除该实例常见漏报原因所需的全部前置条件。这仍不构成完整的 SC 符合性声明。 |
cantTell | 无法得出可靠结论——页面未能稳定下来、无法确认截图覆盖范围,或焦点解析遇到不受支持的情况。它既不同于通过,也不同于失败。 |
| 测试错误 | 检查本身未能运行(导航失败、意外异常)——这不同于 cantTell;后者表示页面行为含糊不明,而不是检查执行失败。 |
| 需要人工审核 | 自动化不尝试判定的类别:SC 1.4.10 的例外是否合理适用,指示信号的对比度(SC 1.4.11)或尺寸(SC 2.4.13)是否足够,焦点顺序是否符合逻辑。 |
结果正常并不代表符合性。 no-overflow-detected 重排结果仅表示:在此次视口和页面加载期间,此检查未发现页面级水平溢出;它不能说明内容是否被截断、重叠,也不能说明其他位置是否适用 SC 1.4.10 的例外。confirmed-no-visible-change 焦点可见结果仅表示:焦点明显移至该组件后,此次页面加载中,在该组件周围带有填充的比较区域内,未检测到超过配置阈值的像素差异;这并非无条件断言不存在可见的焦点指示器。
重要:站点和整个站点群规模下的假阳性
对于单个目标而言看似微不足道的假阳性概率,在同一项检查应用于许多目标时,可能会导致频繁误报。示例:假设每个目标的假阳性概率为 0.5%,且结果相互独立,那么在 200 个 目标中至少出现一次误报的概率为 1 − (1 − 0.005)²⁰⁰ ≈ 63%。这只是说明在独立性假设下, 每个目标的概率如何累积——并非实测结果,而且这一假设在真实网站中很少成立。
通常情况是相关,而非独立。 网站检查结果经常相互关联,因为页面会共用组件、模板、 样式表和应用外壳。共享按钮组件中只要缺少一种焦点样式,就可能导致所有使用该组件的页面 都触发相同的检查结果。必须按根因聚类:将追溯到一个共享组件的缺陷报告为一个系统性 问题,并注明有 N 个受影响实例,而不是 N 个互不相关的缺陷。
假阳性与不稳定性并不相同。 假阳性是指测试正常完成并给出结果,但发现有误。 不稳定性是指对同一目标重复运行时结果不一致——通常由时序、动画或环境敏感性造成。假阳性需要 缩小检查所声称的范围;不稳定性则需要提高测试稳定性(等待布局/视觉状态稳定)。
必须测量精确率,而不是凭空假定。 不要仅根据名义上的假阳性概率推断精确率——这个数字 有助于分析规模,但在根据审核结果进行测量之前,不能据此声称实际检查具有什么精确率。
影响:
- 指标级结果应提供可供审核的证据,而不是自动阻止构建。
- 通常应仅对确定无疑的已确认故障、相对于已审核基线可复现的回归,以及此前已确认缺陷的 再次出现进行阻止。
cantTell、测试错误、风险指标和经审核的例外情况,都应与已确认故障保持区分——为了方便 而将其中任何一项都归为“故障”,就违背了上述术语的初衷。- 无论单独还是汇总来看,这些结果都不能证明符合 WCAG。
有关由此制定的 CI 门控策略,请参阅 skills/ci-cd/SKILL.md。
严重:详细了解重排风险(SC 1.4.10)
**作用:**将视口设为 320×720 CSS 像素,等待布局稳定(load、document.fonts.ready,以及一段期间内 scrollWidth/scrollHeight 均无变化的静默期),尝试水平滚动并读取滚动移动量(比较绝对值而非方向,因此适用于从右到左的文档),测量 clientWidth/scrollWidth,并尽力识别溢出视口的元素。
返回内容:verdict 的值为 no-overflow-detected、potential-reflow-barrier、cant-tell 或 test-error,此外还包括尺寸、滚动数据和可能溢出的元素。
无法检测的内容:
- 没有滚动条的裁切内容——
overflow: hidden内容被静默截断时不会产生可滚动溢出,因此scrollWidth/clientWidth不会出现差异。这是已知的漏报风险,并非已解决的情况。 - 是否适用 SC 1.4.10 的例外——该检查无法判断溢出元素是否为数据表格、地图、图表或其他需要二维布局才能表达其含义的组件。
- 短于所配置静默期的延迟布局变化。
准确来说,SC 1.4.10 的例外:豁免的是使用或含义上需要二维布局的内容部分,而非整个页面。规范中的示例包括:数据表格、地图、图表、视频播放器、游戏、演示文稿,以及需要始终可见工具栏的界面。审核者必须检查以下自动化无法判断的情况:
- 某个组件符合例外条件,并不意味着页面其他部分也符合——该组件周围的标题、介绍段落、筛选器、搜索和分页仍必须正常重排。
- 即使在符合例外条件的组件内,个别部分也可能仍需重排——表格整体网格可能需要二维布局,但单元格中的文本内容不会自动适用该例外。
- “需要”是对含义的判断,而非对便利性的判断。如果某组件只是在宽阔的固定布局中看起来更好,而重排后不会丢失信息或功能,则不符合豁免条件。
自动溢出检测可以标记出可能符合条件的对象。只有人工审核者应用此判断标准后,才能确认例外是否适用。
严重:详细说明焦点可见性风险(SC 2.4.7)
**每次 Tab 停止时的操作:**记录按下 Tab 前的活动元素;发送真实的 Tab 按键(而非以编程方式调用 .focus(),后者不会经过相同的代码路径);确认焦点已移动且仍位于文档中;通过开放的 Shadow Root 解析最深层的活动元素;确认该元素位于视口内;截取该元素边界框周围带内边距区域的屏幕截图;移除焦点并截取同一区域的未聚焦状态作为参考;恢复焦点;比较两个区域的截图;重复此过程,最多达到可配置的停止次数。
**为何比较限定在区域内,而非整页:**整页像素检查无法区分焦点指示器与页面其他位置的无关动画,也无法区分“此元素的指示器消失了”和“上一个元素的指示器消失了,而此元素本身没有指示器”。区域比较与测试开始前单独跟踪整页视觉稳定性相结合,可避免这两种失效情况。
无法检测的内容:
- 指示器是否具有足够的对比度、尺寸或可用性——
visible-change-detected判定表示像素发生了变化,而非变化幅度足够大(需要使用对比度工具或人工审核)。 - 被其他内容遮挡——粘性页眉、Cookie 横幅或其他固定定位内容可能覆盖真实指示器;仅靠像素比较无法检测重叠。在存在几何比较模块之前,任何当前的“通过”结果都不表示已检查遮挡情况(SC 2.4.11)。
- 跨源 iframe,以及未提供
cant-tell-no-coverage确认的同源 iframe。 - 渲染在带内边距比较区域之外的指示器——这是区域比较必然存在的取舍;对于已知会使用偏移指示器的组件,应增大内边距。
- 非由 Tab 触发的焦点变化(由鼠标或脚本触发、且不在顺序 Tab 导航顺序中的焦点变化)。
**confirmed-no-visible-change 结果实际表明的内容:**在该页面加载期间,该组件周围带内边距的区域中未检测到超过配置阈值的像素差异,并且满足以下所有条件:焦点明确移动到了该组件;该组件适用、已渲染且位于视口内;整个过程中页面保持视觉稳定。此结果刻意比“没有可见的焦点指示器”更有限——真实指示器仍可能未被检测到(位于带内边距的区域之外、低于像素差异阈值,或被遮挡)。此结果也不代表已检查对比度(SC 1.4.11)、最小尺寸(SC 2.4.13)或遮挡情况(SC 2.4.11)。
**焦点顺序证据:**驱动此检查的同一 Tab 遍历可以记录访问元素的顺序,但无法判断该顺序是否符合页面内容和任务的逻辑。应将记录的停止顺序视为供人工审核者参考的证据,而非判定结果。
中等:已记录的缺口(尚未自动化)
这些检查记录为 Reflow/Focus Visible 测量方法的自然扩展,但尚未实现为可复用模块。除非明确说明,否则不要声称已自动覆盖这些检查:
- 焦点遮挡(SC 2.4.11)——将聚焦元素的边界矩形与粘性/固定定位祖先元素或重叠元素进行比较。
- 文本缩放与裁切(SC 1.4.4 调整文本大小)——使用与 Reflow 相同的溢出/裁切信号,但在 200% 缩放而非 320 CSS 像素下进行。调整文本大小和 Reflow 是不同的检查;不要混为一谈(参见
skills/manual-testing/SKILL.md)。 - 文本间距(SC 1.4.12)——注入 WCAG 规定的用户样式覆盖(行高 1.5 倍、段落间距 2 倍、字母间距 0.12em、单词间距 0.16em),并复用溢出/裁切检测。
- 悬停或聚焦时显示的内容(SC 1.4.13)——验证由悬停/聚焦触发的内容是否可关闭、可悬停访问且会持续显示。
中等:在大规模 Fleet 中运行这些检查
在大规模报告或分类处理结果时,请始终使用以下术语:
- 唯一发现——一个具体缺陷,其描述不受它出现于多少个页面或组件的影响。
- 受影响实例——某个唯一发现的一次出现:一次测试运行中,某个页面上的某个组件处于某种状态。
- 受影响页面——至少包含一个唯一发现的受影响实例的页面。
- 可能的根因簇——一组受影响实例,它们共享足够多的上下文(相同组件、模板、样式表规则、生成的标记模式),因此很可能通过一次修复一并解决所有问题。在审核者确认共同原因之前,只能称为“可能”。
页面级原始数量并不代表独立缺陷。“200 个页面未通过”的可操作性远低于“1 个唯一发现(共享页眉缺少焦点指示器)、200 个受影响实例、1 个根因簇”。
建议的运行频率:
| 范围 | 运行时机 | 目的 |
|---|---|---|
| 组件测试夹具 | 每个拉取请求 | 针对已知模式,快速、确定性地覆盖回归 |
| 已更改页面和受影响的应用状态 | 每个拉取请求 | 根据实际差异匹配覆盖范围 |
| 代表性模板 | 每个拉取请求 | 在共享组件的回归问题影响所有使用该模板的页面之前发现问题 |
| 全站或 Fleet 清单 | 定期运行(每晚/每周),而非每个拉取请求 | 提供拉取请求范围的运行无法承担的覆盖范围;发现偏移和拉取请求差异之外的页面 |
| 按根因簇对代表性发现进行人工审核 | 每次扫描发现新指标后 | 对每个簇确认或否定一次,而非对每个受影响实例都重复确认 |
| 定期抽样检查无发现的结果 | 定期运行,频率较低 | 评估漏报风险 |
检查未报告任何发现,并不代表已证明漏报率为零——应定期抽样检查无发现的结果,并通过人工审核或使用不同的检查进行审查。
完成标准清单
- 检查说明了其视口、时序和稳定性假设
- 结果区分指标、已针对当前实例确认的失败、
cantTell和测试错误 - 结果包含机器可读的证据(选择器、矩形区域、HTML 摘录),足以在不重新运行检查的情况下定位发现
- 已记录的局限指出检查已知的具体误报和漏报风险
- 检查本身的输出说明,该检查不能证明符合 WCAG
- CI 集成会将指标与已确认的失败分开报告,不会悄然将每个指标都转为阻塞性失败
- 在 Fleet 规模下,发现会归入可能的根因簇,并作为唯一发现报告,同时注明受影响实例数量,而不是为每个受影响页面各列一项且不设限制
- 如有阻塞策略,仅适用于确定性失败或相对于已审核基线可复现的回归问题,而非首次出现的指标
关键 WCAG 标准
- 1.4.4 调整文本大小(AA)——此处尚未自动化;参见上文“中等”级别的差距
- 1.4.10 重排(AA)——重排风险指标
- 1.4.12 文本间距(AA)——此处尚未自动化
- 1.4.13 悬停或聚焦时的内容(AA)——此处尚未自动化
- 2.4.7 焦点可见(AA)——焦点可见性风险指标
- 2.4.11 焦点未被遮挡(最低)(AA)——此处尚未自动化
- 2.4.13 焦点外观(AAA)——仅靠行为像素比较无法覆盖
参考资料
- 完整规范指南
- 重排风险实现
- 焦点可见性风险实现
- Playwright 示例和测试
- CWAC (GOVTNZ) — 本仓库中的检查是对 CWAC 文档方法的独立重新实现;CWAC 采用 GPLv3 许可,规范仓库采用 MIT 许可,未复制或翻译任何 CWAC 代码
skills/manual-testing/SKILL.md— 重排、缩放和焦点指示器手动测试skills/ci-cd/SKILL.md— 风险指示器/构建门禁 CI 策略
标准展望: 这些规则以 WCAG 2.2 AA 为目标。 关注:https://www.w3.org/TR/wcag-3.0/