Accessibility (a11y) Testing 完整指南
「我們做給所有人用」、「但盲胞用不了」。Accessibility 不是慈善、是法律 + 設計品質。歐盟 EAA 2025-06 上路 + ADA 訴訟暴增 → QA 不會 a11y = 公司開罰風險。這篇給你完整 framework。
為什麼 QA 一定要懂 a11y
flowchart TD
Why[為什麼 QA 該學 a11y?] --> L[法律壓力]
Why --> M[市場規模]
Why --> Q[品質指標]
Why --> S[薪資溢價]
L --> L1[EAA 2025-06 強制]
L --> L2[美國 ADA 訴訟 2025 年破 4000 件]
L --> L3[GDPR / 個資法 + 平等對待]
M --> M1[全球 13% 人口有失能]
M --> M2[銀髮族急速增加]
M --> M3[暫時失能 - 抱小孩、滑雪斷手]
Q --> Q1[a11y 好 = UX 好]
Q --> Q2[語意 HTML = SEO 好]
S --> S1[a11y QA 薪資 +20-30%]
style L fill:#ef4444,color:#fff
style S fill:#10b981,color:#fff
WCAG 2.2 四原則
mindmap
root((WCAG<br>POUR))
Perceivable 可感知
文字替代
時間性媒體字幕
可調整呈現
對比度足夠
Operable 可操作
鍵盤可達
足夠時間
不引發癲癇
可導航
輸入彈性
Understandable 可理解
可讀
可預測
輸入協助
Robust 穩健
與技術相容
Assistive Tech 可解析
A / AA / AAA 等級
| 等級 | 範圍 | 適用 |
|---|---|---|
| A | 最低基本 | 沒人用 |
| AA | 業界標準 | 多數公司 / 法規要求 |
| AAA | 最高 | 政府 / 特殊產業 |
建議目標 = AA。AAA 別輕易承諾、有條款全達標難。
自動化測試(30-40% 覆蓋)
axe-core(最強免費工具)
npm install --save-dev @axe-core/playwright
import { test } from '@playwright/test';
import AxeBuilder from '@axe-core/playwright';
test('homepage has no a11y violations', async ({ page }) => {
await page.goto('https://example.com');
const results = await new AxeBuilder({ page }).analyze();
expect(results.violations).toEqual([]);
});
// 特定區塊
test('navbar passes WCAG AA', async ({ page }) => {
const results = await new AxeBuilder({ page })
.include('nav')
.withTags(['wcag2a', 'wcag2aa', 'wcag22aa'])
.analyze();
expect(results.violations).toEqual([]);
});
Lighthouse CI
# .github/workflows/lighthouse.yml
- uses: treosh/lighthouse-ci-action@v11
with:
urls: |
https://example.com
https://example.com/login
budgetPath: ./lighthouse-budget.json
lighthouse-budget.json:
[
{
"path": "/*",
"resourceSizes": [],
"timings": [],
"categories": {
"accessibility": { "min": 95 }
}
}
]
其他工具
| 工具 | 強項 |
|---|---|
| axe DevTools | Chrome 擴充、最完整免費 |
| WAVE | 視覺化 overlay、教育友善 |
| Pa11y | CLI 跑、CI 整合容易 |
| Lighthouse | 內建 Chrome、score 直觀 |
| Accessibility Insights | Microsoft 出、含 tab order 視覺化 |
| Stark | Figma 外掛、設計階段抓 |
手動測試(60% 必要)
自動化只抓「規則」、抓不到「體驗」。
鍵盤導航 checklist
flowchart LR
Start[Tab 從頂部開始] --> Q1{每個互動元素<br>都能 focus 到?}
Q1 -->|否| F1[❌ tabindex 不對]
Q1 -->|是| Q2{Focus indicator<br>可見?}
Q2 -->|否| F2[❌ outline 被砍]
Q2 -->|是| Q3{順序合邏輯?}
Q3 -->|否| F3[❌ DOM 順序錯]
Q3 -->|是| Q4{Esc 關 modal?}
Q4 -->|否| F4[❌ keyboard trap]
Q4 -->|是| OK[✓ 通過]
style OK fill:#10b981,color:#fff
測試方法:拔掉滑鼠、只用 Tab / Shift+Tab / Enter / Space / Esc / 方向鍵走完整個 flow。
Screen Reader 測試
macOS — VoiceOver:
- 開啟:Cmd + F5
- 讀下一個:Ctrl + Option + 右
- 互動:Ctrl + Option + Space
Windows — NVDA(免費):
- 下載:nvaccess.org
- 朗讀:NVDA + 上
- 瀏覽模式 / 焦點模式:NVDA + Space
測試重點: 1. 標題唸的對嗎? 2. Form label 跟著唸? 3. 按鈕 / 連結唸出來知道用途? 4. 圖片 alt 文字唸出來? 5. 動態內容變化有通知?
對比度
WCAG AA 要求: - 一般文字 ≥ 4.5:1 - 大文字(18pt+ 或 14pt+ bold) ≥ 3:1 - UI 元件 ≥ 3:1
工具:Chrome DevTools / WebAIM Contrast Checker
動畫 / 動效
- 自動播放動畫 ≤ 5 秒
- 提供「暫停」按鈕
- 尊重
prefers-reduced-motion - 不引發癲癇(每秒 ≤ 3 次閃爍)
a11y 常見 bug 模式
mindmap
root((常見 a11y bugs))
語意錯
div / span 當按鈕
h1 跳到 h4
table 拿來排版
label 沒連 input
Alt 漏
圖片無 alt
decorative 沒 alt=""
圖示按鈕無 aria-label
對比不夠
placeholder 太淡
disabled 不易讀
focus indicator 砍掉
Keyboard 卡
modal 沒 trap
下拉沒 escape
Tab 跳過某些元素
動態內容
Toast 不被 screen reader 唸
Loading 沒 announce
Form 錯誤訊息漏
Color only
只用紅色標錯誤
圖表只有顏色區分
QA 一週 a11y 工作流
Monday:
- 跑 axe-core CI on staging
- 跑 Lighthouse a11y score
Tuesday-Thursday:
- 每個新功能:
1. 自動化測 axe
2. 鍵盤跑一次
3. Screen reader 抽測
Friday:
- 跨 team triage a11y bugs
- 看 axe / Lighthouse 趨勢
CI 整合範例
name: A11y CI
on: [pull_request]
jobs:
axe:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
- run: npm ci
- run: npx playwright install --with-deps
- run: npx playwright test tests/a11y/
- if: failure()
uses: actions/upload-artifact@v4
with:
name: a11y-results
path: test-results/
給 QA 的 5 個必學
- WCAG 2.2 AA 標準(一週讀完官方)
- axe DevTools 操作熟練
- VoiceOver + NVDA 各跑過 5 次
- 鍵盤 only 跑完 happy path 的習慣
- 對比度 用 DevTools 即時驗
法規快速對照(2026)
| 地區 | 法規 | 範圍 |
|---|---|---|
| EU | EAA 2025-06 | 所有電商 / 金融 / 通訊 |
| US | ADA Title III | 公開可訪問網站 |
| Canada | AODA | 安大略省 |
| Australia | DDA | 任何商業 |
| 台灣 | 身心障礙者權益保障法 | 政府 + 補助業者 |
ADA 訴訟 2025 突破 4000 件、被告平均賠 $5,000-$50,000。
反模式
flowchart TD
Anti[a11y 反模式] --> A1["上線前一天才測"]
Anti --> A2["只跑 Lighthouse score"]
Anti --> A3["放 overlay widget 就以為 OK"]
Anti --> A4["不測 screen reader"]
Anti --> A5["設計 / 開發完才告知 a11y"]
Anti --> A6["AAA 全達標承諾"]
Anti --> A7["不收集真實使用者反饋"]
style A1 fill:#ef4444,color:#fff
style A2 fill:#ef4444,color:#fff
style A3 fill:#ef4444,color:#fff
style A4 fill:#ef4444,color:#fff
style A5 fill:#ef4444,color:#fff
style A6 fill:#ef4444,color:#fff
style A7 fill:#ef4444,color:#fff
Overlay widget 警告:accessiBe / UserWay 等「一鍵 a11y」widget — 被告律師最愛、根本沒解決問題、只蓋紗布。別買、別裝。
給 QA 的 5 句
- a11y 不是慈善、是基本品質
- 自動化 30% + 手動 60% + 真用戶 10%
- WCAG AA 是業界標準、AAA 別輕易承諾
- screen reader 一週測一次比 100% coverage 重要
- Overlay widget 是雷、別碰
最後
a11y 是 QA 領域 2026 後薪資溢價最高的技能之一(+20-30%)。歐盟 EAA 上路、訴訟暴增、業界缺人。從跑 axe-core + 學鍵盤 nav 開始、半年後你會變團隊不可缺的 a11y 專家。
延伸: - Test Pyramid + 完整測試類型全圖 - Visual Regression Testing - Cross-browser Testing 策略