無障礙測試
簡介
Playwright 可以用來測試應用程式的多種類型的無障礙問題。
一些此方法可以捕捉到的問題範例如下:
- 由於與背景的顏色對比差,視障用戶難以閱讀的文字
- 屏幕閱讀器無法識別的無標籤 UI 控件和表單元素
- 具有重複 ID 的互動元素,這會混淆輔助技術
以下範例依賴 @axe-core/playwright
套件,該套件增加了在 Playwright 測試中執行 axe 無障礙測試引擎 的支援。
自動化無障礙測試可以檢測一些常見的無障礙問題,例如缺失或無效的屬性。但許多無障礙問題只能通過手動測試發現。我們建議結合自動化測試、手動無障礙評估和包容性用戶測試。對於手動評估,我們推薦 Accessibility Insights for Web,這是一個免費且開放原始碼的開發工具,能引導你評估網站的 WCAG 2.1 AA 覆蓋範圍。
範例無障礙測試
無障礙測試的工作方式與其他 Playwright 測試相同。你可以為它們建立單獨的測試 案例,或者將無障礙掃描和斷言整合到你現有的測試案例中。
以下範例展示了一些基本的無障礙測試情境。
掃描整個頁面
此範例展示如何測試整個頁面以自動檢測可存取性違規。測試:
- 匯入
@axe-core/playwright
套件 - 使用一般的 Playwright Test 語法來定義測試案例
- 使用一般的 Playwright 語法來導航至測試頁面
- 等待
AxeBuilder.analyze()
執行無障礙掃描以檢查頁面 - 使用一般的 Playwright Test assertions 來驗證返回的掃描結果中沒有違規
- TypeScript
- JavaScript
import { test, expect } from '@playwright/test';
import AxeBuilder from '@axe-core/playwright'; // 1
test.describe('homepage', () => { // 2
test('should not have any automatically detectable accessibility issues', async ({ page }) => {
await page.goto('https://your-site.com/'); // 3
const accessibilityScanResults = await new AxeBuilder({ page }).analyze(); // 4
expect(accessibilityScanResults.violations).toEqual([]); // 5
});
});
const { test, expect } = require('@playwright/test');
const AxeBuilder = require('@axe-core/playwright').default; // 1
test.describe('homepage', () => { // 2
test('should not have any automatically detectable accessibility issues', async ({ page }) => {
await page.goto('https://your-site.com/'); // 3
const accessibilityScanResults = await new AxeBuilder({ page }).analyze(); // 4
expect(accessibilityScanResults.violations).toEqual([]); // 5
});
});
設定 axe 掃描頁面的特定部分
@axe-core/playwright
支援許多 axe 的配置選項。你可以使用 AxeBuilder
類別的 Builder 模式來指定這些選項。
例如,你可以使用 AxeBuilder.include()
將無障礙掃描限制為僅針對頁面的特定部分執行。
AxeBuilder.analyze()
將在您呼叫它時掃描頁面當前的狀態。要掃描基於 UI 互動顯示的頁面部分,請在呼叫 analyze()
之前使用 Locators 與頁面互動:
test('navigation menu should not have automatically detectable accessibility violations', async ({
page,
}) => {
await page.goto('https://your-site.com/');
await page.getByRole('button', { name: 'Navigation Menu' }).click();
// It is important to waitFor() the page to be in the desired
// state *before* running analyze(). Otherwise, axe might not
// find all the elements your test expects it to scan.
await page.locator('#navigation-menu-flyout').waitFor();
const accessibilityScanResults = await new AxeBuilder({ page })
.include('#navigation-menu-flyout')
.analyze();
expect(accessibilityScanResults.violations).toEqual([]);
});
掃描 WCAG 違規
預設情況下,axe 會檢查各種無障礙規則。其中一些規則對應於Web Content Accessibility Guidelines (WCAG)中的特定成功標準,其他則是未被任何 WCAG 標準特別要求的“最佳實踐”規則。
你可以使用 AxeBuilder.withTags()
將無障礙掃描限制為僅執行那些被“標記”為對應特定 WCAG 成功標準的規則。例如,Accessibility Insights for Web's Automated Checks 僅包括測試 WCAG A 和 AA 成功標準違規的 axe 規則;為了匹配這種行為,你可以使用標籤 wcag2a
、wcag2aa
、wcag21a
和 wcag21aa
。
請注意,自動化測試無法檢測所有類型的 WCAG 違規情況。
test('should not have any automatically detectable WCAG A or AA violations', async ({ page }) => {
await page.goto('https://your-site.com/');
const accessibilityScanResults = await new AxeBuilder({ page })
.withTags(['wcag2a', 'wcag2aa', 'wcag21a', 'wcag21aa'])
.analyze();
expect(accessibilityScanResults.violations).toEqual([]);
});
您可以在 axe API 文件的 "Axe-core Tags" 部分 找到 axe-core 支援的規則標籤的完整列表。