以前にaxe DevToolsという拡張機能を使ってみる記事を投稿しましたが、そのコアエンジンにあたるaxe-coreというライブラリを使って、テストの内容や対象ページを設定した上でテストできるようにしてみます。
作成方法
プロジェクトディレクトリなどに移動して、package.jsonを作成します。
npm init -y
使用するパッケージをインストールします。
npm install puppeteer axe-core @axe-core/puppeteer csv-writer --save
a11y-test.js というファイルを作成して、以下の内容にします。
const puppeteer = require('puppeteer'); const { AxePuppeteer } = require('@axe-core/puppeteer'); const axeLocales = require('axe-core/locales/ja.json'); const createCsvWriter = require('csv-writer').createObjectCsvWriter; // テスト対象のURLリスト const urls = [ 'https://example.com/', 'https://example.com/about/', ]; // ルールの設定 const axeRules = [ 'wcag2a', 'wcag2aa', 'wcag21a', 'wcag21aa', 'wcag22a', 'wcag22aa', 'best-practice' ]; // CSVの設定 const csvWriter = createCsvWriter({ path: 'a11y-test_results.csv', // 出力されるCSVファイルのパス header: [ // CSVのヘッダー情報 { id: 'url', title: 'URL' }, // 対象のページURL { id: 'violationId', title: 'Violation ID' }, // 違反したルールのID { id: 'impact', title: 'Impact' }, // 違反の影響度(critical, serious, moderate, minor) { id: 'html', title: 'HTML' }, // 違反箇所のHTML { id: 'target', title: 'Target' }, // 違反対象要素 { id: 'description', title: 'Description' }, // エラー内容の説明 { id: 'helpUrl', title: 'Help URL' }, // ルールに関する詳細なヘルプURL ] }); // 対象のURLに対してアクセシビリティテストを実行 async function runAccessibilityTest(url) { // ブラウザを起動して、新しい空白ページを開く const browser = await puppeteer.launch({ headless: true }); const page = await browser.newPage(); try { // 指定したURLに移動 await page.goto(url, { waitUntil: 'networkidle2' // ページが完全にロードされるまで待機 }); // axe-coreを使ってテストを実行 const results = await new AxePuppeteer(page) .withTags(axeRules) // ルールの設定 .configure({ locale: axeLocales // 日本語ローカライズファイルを指定 }) .analyze(); // 違反結果を元に、CSVに出力するためのデータ形式に整形 const violations = results.violations.map(function(violation) { // 各違反について、詳細なノード情報を取得して配列に追加 return violation.nodes.map(function(node) { return { url: url, // 対象のページURL violationId: violation.id, // 違反したルールのID impact: violation.impact, // 違反の影響度(critical, serious, moderate, minor) html: node.html, // 違反箇所のHTML target: node.target, // 違反対象要素 description: violation.description, // エラー内容の説明 helpUrl: violation.helpUrl // ルールに関する詳細なヘルプURL } }); }).flat(); // 整形した違反データをCSVファイルに書き込み await csvWriter.writeRecords(violations); } catch (error) { console.error(`Error testing ${url}:`, error); } finally { // ブラウザを閉じる await browser.close(); } } // 全ての対象URLに対してテストを実行 (async () => { for (const url of urls) { await runAccessibilityTest(url); } console.log('テスト完了しました。'); })();
コード内にあるテスト対象のURLリストやルールの設定は適宜変更してください。
ルール設定の注意点として、例えば’wcag2aa’を指定した場合、’wcag2a’の内容は含まれていないため別途指定が必要になります。
同様に’wcag21aa’を指定した場合も、’wcag2a’や’wcag2aa’の内容は含まれていません。
詳しくはドキュメントにあるタグの項目やルールの項目をご確認ください。
後はa11y-test.jsを実行してやればOKです。
node a11y-test.js
例として対象URLを「https://cly7796.net/blog/」にして試してみると、以下の内容でa11y-test_results.csvというファイルが生成されました。
URL,Violation ID,Impact,HTML,Target,Description,Help URL https://cly7796.net/blog/,region,moderate,"<div class=""l-sub__box"">",.l-sub__box:nth-child(1),ページのすべてのコンテンツがlandmarkに含まれていることを確認します,https://dequeuniversity.com/rules/axe/4.10/region?application=axe-puppeteer&lang=ja https://cly7796.net/blog/,region,moderate,"<div class=""l-sub__box"">",.l-sub__box:nth-child(2),ページのすべてのコンテンツがlandmarkに含まれていることを確認します,https://dequeuniversity.com/rules/axe/4.10/region?application=axe-puppeteer&lang=ja https://cly7796.net/blog/,region,moderate,"<div class=""l-sub__box"">",.l-sub__box:nth-child(3),ページのすべてのコンテンツがlandmarkに含まれていることを確認します,https://dequeuniversity.com/rules/axe/4.10/region?application=axe-puppeteer&lang=ja https://cly7796.net/blog/,region,moderate,"<table id=""wp-calendar"" class=""wp-calendar-table"">",#wp-calendar,ページのすべてのコンテンツがlandmarkに含まれていることを確認します,https://dequeuniversity.com/rules/axe/4.10/region?application=axe-puppeteer&lang=ja
コメントが承認されるまで時間がかかります。