axe-core是多团队统一可访问性断言的唯一可行选择,因其支持ci硬性门禁(results.violations.length > 0直接中断构建)、按团队/页面粒度开关规则、跨框架复用同一断言逻辑(jsdom/playwright/cypress),且配置可集中管理避免漂移。

为什么 axe-core 是多团队统一可访问性断言的唯一可行选择
因为 Lighthouse 在 CI 里默认不失败,而 axe-core 可直接 throw 中断构建——多团队协作时,没人能靠“看报告”推动修复。axe-core 的 axe.run() 返回结构明确,results.violations.length > 0 就是硬性门禁,不修完过不了 CI。
- axe-core 支持按团队/页面粒度开关规则,比如
{ runOnly: ['wcag2aa'] }或排除color-contrast(设计暂未定稿时) - Lighthouse 无法剔除单条规则,且必须启动 Chromium,CI 资源占用翻倍,多个团队并行跑会排队卡死
- axe-core 可注入 JSDOM(单元测试)、Playwright(E2E)、甚至 Cypress,所有团队用同一套断言逻辑,结果可比
如何在不同测试框架中复用同一套 axe 断言逻辑
别为每个团队写一套扫描逻辑。把 axe 扫描封装成可导入的函数,参数只暴露 include、exclude 和规则集,其余由框架适配层处理。
- Playwright 中:用
page.addScriptTag({ path: require.resolve('axe-core') })注入,再page.evaluate(() => axe.run(...)) - Jest + JSDOM:在 setup 文件里
global.axe = require('axe-core'),测试中直接await axe.run(container) - Cypress:安装
cypress-axe插件,但注意它默认不校验aria-*动态更新,需手动cy.injectAxe() → cy.checkA11y() - 关键陷阱:React/Vue 应用必须等 hydration 完成再扫,否则
document.body里只有空div#root,扫描结果全为空
CI 环境下 axe 扫描结果不一致的三个真实原因
本地绿、CI 红不是代码问题,而是环境没对齐。axe 依赖真实渲染上下文,字体、样式、JS 加载顺序都会影响 getComputedStyle 结果。
使用 PptxGenJS 和 Python 解析,将结构化的 HTML/CSS 幻灯片内容转换为原生、可编辑的 PowerPoint(.pptx)演示文稿。
- 字体未就绪:
font-display: optional或自定义字体未加载完成,导致color-contrast误报;加await page.waitForFunction(() => getComputedStyle(document.body).fontFamily !== 'sans-serif') - CSS-in-JS 注入延迟:Emotion、Styled Components 的样式可能晚于 DOM 渲染,需
await page.waitForTimeout(100)或监听style标签数量变化 - viewport 宽度差异:CI 默认 viewport 是 1280×720,但某些
heading-order规则依赖媒体查询生效;显式设page.setViewportSize({ width: 1920, height: 1080 })
怎么让多个团队共用一套可访问性基线配置
把 axe 配置从各团队 test 文件里抽出来,放到项目根目录的 axe.config.js,并通过 require 或 ESM 动态导入,避免复制粘贴导致规则漂移。
- 配置示例:
module.exports = { runOnly: ['wcag2aa'], rules: { 'color-contrast': { enabled: false } } } - Playwright 测试中:
const config = require('../axe.config.js'); const results = await page.evaluate((cfg) => axe.run(cfg), config) - 禁止在配置里写绝对路径或环境变量,CI 里
process.cwd()不一定等于项目根目录 - 团队若需临时覆盖,只能 extend 基线配置,不能重写——用
{ ...baseConfig, rules: { ...baseConfig.rules, 'link-in-text-block': { enabled: true } } }
最常被忽略的是:axe 的规则启用状态(enabled)和严重等级(impact)是两回事,enabled: false 才真正跳过检测,impact: 'minor' 仍会进 violations 数组,只是不影响 CI 失败阈值。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










