测试【免费下载链接】axe-coreAccessibility engine for automated Web UI testing项目地址https://gitcode.com/gh_mirrors/ax/axe-core点击查看免费下载导读本文围绕 axe-core 仓库中的 test/aria-practices/README.md 及其测试实现 apg.spec.js完整讲解这套面向 W3C ARIA Authoring PracticesARIA 实践指南简称 APG示例页面的自动化无障碍回归测试它如何批量拉取 APG 官方示例、如何用 axe-core 逐页审计、如何通过disabledRules豁免特定规则并追溯豁免原因。读完本文你将掌握pnpm run test:apg的完整执行链路、测试用例的组织方式以及为 APG 测试新增规则豁免与页面跳过的正确姿势。一、这套测试在测什么为什么用 axe-core 审计 APG 示例ARIA Authoring PracticesAPG是 W3C 发布的权威无障碍组件交互模式指南其中包含大量可直接运行的 HTML 示例页面如 tabs、listbox、dialog、toolbar 等 ARIA 组件的完整实现。这些示例既是开发者学习 ARIA 用法的教材也是检验无障碍工具准确性的天然基准语料——因为它们覆盖了真实世界中高频使用的 ARIA 模式组合。axe-core 仓库将 APG 的示例页面直接引入自身测试体系用 axe-core 引擎逐页审计这些示例断言在给定规则集合下不应发现任何无障碍违规。这套测试的价值在于双向校准既验证 axe-core 对权威 ARIA 模式的理解与 W3C 实践一致也反向督促 APG 示例保持高水平的无障碍质量回归守护当 axe-core 新增规则或调整检查逻辑时任何对 APG 示例误报/漏报的变化都会在这里暴露跨规则联动同一个页面会同时接受 WCAG 2 A/AA 级别相关规则审计天然形成组合场景测试。在 doc/developer-guide.md 的Running Tests一节中test:apg被明确列为与test:actWCAG ACT 规则测试、test:examples官方示例测试并列的非单元测试套件属于 axe-core 质量保障体系的重要组成部分。二、一键运行pnpm run test:apg的完整执行链路2.1 命令入口按照 test/aria-practices/README.md 的说明运行全套 APG 测试只需一条命令pnpm run test:apg这条命令在 package.json 中的定义是test:apg: start-server-and-test 9876 integration:apg, integration:apg: mocha --fail-zero test/aria-practices/*.spec.js, start: http-server -a \\ -p 9876 --silent执行链路拆解如下start-server-and-test 9876 integration:apg先启动http-server静态服务器监听9876端口对应pnpm start脚本待端口就绪后再执行integration:apgintegration:apg调用 Mocha 运行test/aria-practices/目录下所有*.spec.js测试文件当前即 apg.spec.js--fail-zero标志确保即便收集到零个测试用例Mocha 也不会误报失败。2.2 静态服务器为何必要测试通过driver.get()让无头浏览器访问http://localhost:9876/node_modules/aria-practices/content/patterns/...形式的本地 URL 来加载 APG 示例页面。因此http-server必须以仓库根目录为服务根目录-a 表示监听所有网络接口--silent关闭访问日志这样才能把node_modules/aria-practices/下的示例文件直接以 URL 形式暴露给浏览器。这也是start-server-and-test必须先起服务、再跑测试的原因。三、测试实现解剖apg.spec.js3.1 示例页面收集glob 扫描而非手工枚举测试文件顶部用globSync动态发现所有 APG 示例页面const apgPath path.resolve(__dirname, ../../node_modules/aria-practices/); const filePaths globSync( ${apgPath}/content/patterns/*/**/examples/*.html, { posix: true } ); const testFiles filePaths.map( fileName fileName.split(/aria-practices/content/patterns/)[1] );几个关键设计点使用path.resolve而非require.resolve代码注释明确说明因为 APG 的package.json没有main字段无法通过require.resolve定位包路径只能手动基于测试文件位置计算node_modules/aria-practices/绝对路径匹配模式content/patterns/*/**/examples/*.html会命中patterns/下每个组件目录examples/子目录中的所有 HTML 文件例如tabs/examples/tabs.html、listbox/examples/listbox-actions.html等路径归一化split(/aria-practices/content/patterns/)[1]把绝对路径裁剪成tabs/examples/tabs.html这种仓库内相对形式既用于拼接访问 URL${addr}content/patterns/${filePath}也用于按页面精确匹配豁免规则。aria-practices依赖本身在 package.json 中被固定为 GitHub 上 W3C 仓库的特定 commitgithub:w3c/aria-practices#18c1a2...并在 pnpm-workspace.yaml 中登记确保测试基准版本可复现、可追踪。3.2 单页测试流程AxeBuilder 审计全流程对每一个发现的示例页面测试用例执行如下流程await driver.get(${addr}content/patterns/${filePath}); const builder new AxeBuilder(driver, axeSource) // Support table has no title and has duplicate ids .exclude(#at-support) .withTags([wcag2a, wcag2aa, wcag21a, wcag21aa]) .disableRules([ ...disabledRules[*], ...(disabledRules[filePath] || []) ]); const { violations } await builder.analyze();逐项解读加载页面driver.get()访问本地静态服务器上的示例页addr定义为http://localhost:9876/node_modules/aria-practices/最终拼接成完整的示例 URL注入 axe 源码before钩子中通过require.resolve(../../axe.js)定位构建产物用fs.readFileSync读出源码字符串再传给AxeBuilder来自axe-core/webdriverjs确保测试使用的是当前仓库构建出的 axe-core 本体排除干扰元素.exclude(#at-support)跳过页面中的辅助技术AT支持信息表格——代码注释解释了原因该表格没有标题且包含重复 id属于示例页自身的教学性缺陷不应计入审计结果限定规则标签.withTags([wcag2a, wcag2aa, wcag21a, wcag21aa])只运行与 WCAG 2.0/2.1 A、AA 级别相关的规则。这些标签直接对应 lib/rules/color-contrast.json 等规则定义文件中的tags数组——例如color-contrast规则带有wcag2aa、wcag143、EN-301-549等多个标签withTags就是按此筛选规则集断言零违规analyze()返回结果后把违规信息映射为{ id, issues: nodes.length }列表用assert.lengthOf(issues, 0, ...)断言没有任何违规若存在违规断言失败信息会列出全部违规规则 id 及其节点数量便于定位问题。3.3 超时与重试面向真实浏览器测试的稳健性测试套件声明了this.timeout(50000)和this.retries(3)单用例最长 50 秒失败自动重试 3 次。这是针对真实浏览器驱动场景的必要容错——无头 Chrome 启动、页面渲染、axe 注入分析在 CI 环境都可能偶发超时重试机制可显著降低偶发失败导致的误报。四、核心机制disabledRules规则豁免README 的灵魂内容test/aria-practices/README.md 的重点在于规则豁免的治理规范。测试通过 apg.spec.js 中的disabledRules对象控制哪些规则不在哪些页面上运行const disabledRules { *: [ color-contrast, target-size, heading-order, // w3c/aria-practices#2119 scrollable-region-focusable // w3c/aria-practices#2114 ], tabs/examples/tabs-actions.html: [aria-required-children], listbox/examples/listbox-actions.html: [nested-interactive] };4.1 两层豁免结构全局豁免*键作用于所有示例页面。当前豁免了color-contrast颜色对比度、target-size目标尺寸、heading-order标题顺序、scrollable-region-focusable可滚动区域可聚焦四条规则页面级豁免具体文件路径键精确到单个示例页面例如tabs-actions.html豁免aria-required-children必需子元素listbox-actions.html豁免nested-interactive嵌套可交互元素。两者在测试用例中合并使用[...disabledRules[*], ...(disabledRules[filePath] || [])]——先应用全局豁免再叠加该页面特有的豁免。4.2 豁免必须附带为什么——注释与 Issue 追踪规范README 明确了硬性要求每次豁免规则都必须添加注释说明原因。从 apg.spec.js 的注释可以看到三种典型豁免理由上游已知缺陷heading-order豁免指向w3c/aria-practices#2119scrollable-region-focusable指向w3c/aria-practices#2114——APG 示例页面本身存在这些问题axe-core 如实报告属于正确的检测结果故在示例修复前豁免axe-core 尚未支持的新兴模式tabs-actions.html的豁免注释说明axe-core 虽已识别aria-actions属性对应 dequelabs/axe-core#5199但尚未认可通过aria-actions关联操作控件这种作者模式相关结构性规则因此误报已在 dequelabs/axe-core#5215 追踪示例页的教学性结构#at-support表格的排除同理。README 进一步规定如果豁免原因适用应在 axe-core 或 aria-practices 仓库提交 Issue 并把 Issue 链接写进代码。这样做有两个目的一是让后续维护者随时可查为什么这条规则还不跑二是当上游 Issue 关闭例如 APG 修复了示例、axe-core 支持了新模式时可以据此及时移回豁免规则恢复完整审计。4.3 豁免的最终落地豁免通过builder.disableRules([...])传入AxeBuilder运行时不再执行被禁规则因此最终violations中不会出现这些规则的报告。这套白名单式豁免 注释 Issue 链接的治理模式避免了无理由、永久性的规则关闭——每一次豁免都是可审计、可回溯、可收敛的技术债务。五、页面跳过skippedPages机制除规则豁免外测试还维护了一个页面级跳过清单const skippedPages [ toolbar/examples/help.html // Embedded into another page ];skippedPages中的页面会从测试用例列表中直接过滤testFiles.filter(filePath !skippedPages.includes(filePath))完全不对其运行审计。当前唯一的例子是toolbar/examples/help.html——它被嵌入到了另一个页面中作为子页面单独审计没有意义。测试还包含一个独立的it(finds examples)用例用assert.isTrue(testFiles.length 0)确保示例页面收集非空防止 glob 匹配失效导致零用例通过的假绿。六、运行环境与浏览器驱动测试基于 Selenium WebDriver 驱动真实浏览器驱动创建逻辑位于 test/get-webdriver.jsconst chromedriverPath process.env.CHROMEDRIVER_BIN ?? require(chromedriver).path; const options new chrome.Options().addArguments( --headless, --no-sandbox, --disable-dev-shm-usage, --disable-gpu );关键点无头 Chrome默认以 headless 模式运行适合 CI环境变量覆盖CHROMEDRIVER_BIN可指定 chromedriver 二进制路径CHROME_BIN可指定 Chrome 可执行文件路径例如在容器内安装自定义 Chrome 时使用容器友好参数--no-sandbox、--disable-dev-shm-usage、--disable-gpu是针对 CI/容器环境的常规配置。另外eslint.config.js 中对test/aria-practices/**/*.js有专门的 lint 配置段与test/act-rules一并处理说明该目录的测试代码遵循项目统一的 ESLint 规范贡献新用例时需保持代码风格一致。七、如何为这套测试做贡献结合 test/aria-practices/README.md 的治理规则与 apg.spec.js 的实现常见的扩展场景与标准操作如下场景操作某示例页触发某规则的误报在disabledRules的*或页面级键中追加规则 id并必须添加注释说明原因必要时附上 axe-core 或 aria-practices 的 Issue 链接上游 Issue 已修复可恢复审计从disabledRules中移除对应条目同时更新或删除注释某个页面不应单独审计加入skippedPages数组并注释原因新增 APG 示例无需改动测试代码——globSync会自动发现examples/*.html下的新文件并生成对应用例调整审计规则范围修改withTags的标签数组如追加wcag21aa之外的标签运行验证pnpm run test:apg完整链路或直接pnpm run integration:apg需自行先保证 9876 端口服务已启动。测试输出中若出现assert.lengthOf失败错误信息会列出所有违规规则 id可据此判断是真实缺陷还是需要豁免。结语axe-core 的 APG 测试套件是一个以权威示例为基准、动态发现用例、严格治理豁免的典型回归测试范式globSync让用例集合随上游示例自动扩展withTags让规则范围随 WCAG 版本精确收敛而disabledRules 注释 Issue 链接的三件套则把暂时不能跑的规则变成显式、可追踪、可收敛的技术债务。理解这套机制不仅能读懂 axe-core 的测试体系也能为其他基于 WebDriver 与 axe 的无障碍测试项目提供可复制的设计参考。赞分享测试【免费下载链接】axe-coreAccessibility engine for automated Web UI testing项目地址https://gitcode.com/gh_mirrors/ax/axe-core点击查看免费下载相关推荐Axe-core 规则优先级如何设置测试规则的执行顺序Axe core 规则优先级如何设置测试规则的执行顺序 Axe core 作为领先的Web无障碍自动化测试引擎其强大的规则优先级系统是确保测试效率和准确性的测试pywechat定时任务终极教程schedule与schtasks双方案实现微信定时自动化pywechat定时任务终极教程schedule与schtasks双方案实现微信定时自动化 pywechat定时任务是当下最热门的微信自动化玩法它让PC微信测试Havoc Teamserver 内置 HCL 规范测试套件specsuite原理、用例约定与运行机制Havoc Teamserver 内置 HCL 规范测试套件specsuite原理、用例约定与运行机制 Havoc 团队的 Teamserver 将一套网络安全上一篇如何快速掌握 Opulence PHP 框架面向新手的完整指南下一篇Scoop 项目使用教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考