无障碍测试:WCAG标准与自动化检测工具_千锋教育

来源:千锋教育
发布时间:2026-05-21 06:03:04

千锋教育品牌logo

01 WCAG标准:不是道德选择,是法律底线

全球15%人口(约10亿人)存在某种形式的残疾。他们使用屏幕阅读器、语音控制或特殊键盘浏览网页。你的站点对他们开放吗?

WCAG(Web Content Accessibility Guidelines)由W3C制定,是Web无障碍测试的黄金标准。它分为三个等级:

  • ►A级(最低):解决最严重的无障碍障碍
  • ►AA级(标准):符合法律要求(如美国ADA、欧盟EN 301 549)
  • ►AAA级(最高):极致优化,但部分要求难以实现

无障碍不是慈善,是商业。忽视10亿用户,等于放弃10亿市场。

WCAG四大原则(POUR)是测试根基:

1. 可感知:信息必须通过用户感官呈现(如为图片添加alt文本)

2. 可操作:用户能交互所有功能(如键盘可操作所有控件)

3. 可理解:内容与操作必须清晰(如表单错误提示明确)

4. 健壮性:兼容当前及未来技术(如使用语义化HTML)

实际测试中,AA级是主流合规标准。例如:对比度要求文本与背景至少4.5:1(大文本3:1),键盘导航要求所有功能可通过Tab键访问。

02 自动化检测工具链:从命令行到CI/CD

手动测试耗时且易出错。自动化工具能捕获60-80%的常见问题,剩下20-40%需人工验证。核心工具链如下:

工具1:axe-core(核心引擎)

开源,支持Selenium、Cypress、Playwright集成。

javascript
// 使用 axe-core 在 Playwright 中检测
const { AxeBuilder } = require('@axe-core/playwright');
const { chromium } = require('playwright');

(async () => {
  const browser = await chromium.launch();
  const page = await browser.newPage();
  await page.goto('https://example.com');

  const results = await new AxeBuilder({ page }).analyze();
  
  console.log(`发现 ${results.violations.length} 个违规项`);
  results.violations.forEach(violation => {
    console.log(`- ${violation.id}: ${violation.description}`);
    violation.nodes.forEach(node => {
      console.log(`  元素: ${node.html}`);
      console.log(`  影响: ${node.impact}`);
    });
  });

  await browser.close();
})();

工具2:Lighthouse(Chrome内置)

无需安装,Chrome DevTools直接运行。生成报告含无障碍评分及具体建议。

工具3:Pa11y(命令行利器)

适合CI/CD管道集成,输出JSON/CSV格式。

bash
# 安装
npm install -g pa11y

# 检测单个页面
pa11y https://example.com

# 批量检测
pa11y --json https://example.com > report.json

工具4:WAVE(浏览器扩展)

可视化标注问题,适合快速上手。

自动化工具捕获80%问题,但剩下20%决定用户体验。

03 实战:3步自动化检测流程

步骤1:配置检测环境

使用Docker或Node环境统一工具版本。

yaml
# docker-compose.yml
version: '3'
services:
  accessibility-test:
    image: node:18
    volumes:
      - ./:/app
    working_dir: /app
    command: >
      sh -c "npm install pa11y -g &&
             pa11y --json https://your-site.com > results.json"

步骤2:编写检测脚本

集成多工具,输出统一报告。

javascript
// a11y-check.js
const { AxeBuilder } = require('@axe-core/playwright');
const { chromium } = require('playwright');
const fs = require('fs');

async function checkAccessibility(url) {
  const browser = await chromium.launch();
  const page = await browser.newPage();
  await page.goto(url, { waitUntil: 'networkidle' });

  // 使用 axe-core 检测
  const axeResults = await new AxeBuilder({ page }).analyze();
  
  // 额外检查:对比度
  const contrastCheck = await page.evaluate(() => {
    const elements = document.querySelectorAll('*');
    const violations = [];
    elements.forEach(el => {
      const style = window.getComputedStyle(el);
      const color = style.color;
      const bgColor = style.backgroundColor;
      // 简化对比度计算(实际需用完整算法)
      if (color && bgColor && color !== bgColor) {
        violations.push({
          element: el.tagName,
          color: color,
          bgColor: bgColor
        });
      }
    });
    return violations;
  });

  await browser.close();

  return {
    url,
    timestamp: new Date().toISOString(),
    axeViolations: axeResults.violations,
    contrastIssues: contrastCheck
  };
}

// 执行检测
checkAccessibility('https://example.com')
  .then(report => {
    fs.writeFileSync('a11y-report.json', JSON.stringify(report, null, 2));
    console.log(`报告已生成,发现${report.axeViolations.length}个违规项`);
  });

步骤3:集成CI/CD

在GitHub Actions中自动检测。

yaml
# .github/workflows/a11y.yml
name: Accessibility Check

on:
  push:
    branches: [main]

jobs:
  a11y:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: 18
      - run: npm install @axe-core/playwright playwright
      - run: node a11y-check.js
      - name: Upload Report
        uses: actions/upload-artifact@v3
        with:
          name: a11y-report
          path: a11y-report.json

自动化检测不是终点,是起点。每次构建都跑一次,问题无处遁形。

04 常见陷阱与人工验证要点

自动化工具无法覆盖所有场景。以下问题需人工介入:

陷阱1:动态内容

单页应用中,内容通过AJAX加载。工具可能只检测初始DOM。

解决方法:在检测前等待内容加载完成。

javascript
// 等待动态内容
await page.waitForSelector('.dynamic-content', { state: 'visible' });

陷阱2:焦点管理

模态框打开后,焦点应锁定在框内,关闭后返回触发按钮。自动化工具难以验证流程。

人工验证:用Tab键遍历整个页面,检查焦点顺序。

陷阱3:语义化结构

工具能检测

相关推荐