From b7b5aa5a08a028ed806a73adfe316b71e58a2866 Mon Sep 17 00:00:00 2001 From: ttsukagoshi <taro.tsukagoshi@gmail.com> Date: Tue, 1 Feb 2022 14:06:04 +0900 Subject: [PATCH 1/4] =?UTF-8?q?=E3=83=A6=E3=83=BC=E3=82=B6=E3=81=AE?= =?UTF-8?q?=E5=80=8B=E5=88=A5=E8=A8=AD=E5=AE=9A=E3=83=95=E3=82=A1=E3=82=A4?= =?UTF-8?q?=E3=83=ABsettings.json=E3=82=92gitignore=E3=81=AB=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 1221ea1..664c85a 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,5 @@ node_modules/ # axe-test urls.txt axe-results.csv +settings.json debug/ From ad524d0562e368fea746705c137e1dfa0e401b04 Mon Sep 17 00:00:00 2001 From: ttsukagoshi <taro.tsukagoshi@gmail.com> Date: Wed, 2 Feb 2022 23:25:50 +0900 Subject: [PATCH 2/4] =?UTF-8?q?user-settings.json=E3=81=AB=E3=82=88?= =?UTF-8?q?=E3=81=A3=E3=81=A6=E3=83=A6=E3=83=BC=E3=82=B6=E8=A8=AD=E5=AE=9A?= =?UTF-8?q?=E3=82=92=E8=AA=BF=E6=95=B4=E5=8F=AF=E8=83=BD=E3=81=A8=E3=81=99?= =?UTF-8?q?=E3=82=8B=20(#19)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 - src/axe-test.js | 78 ++++++++++++++++++++++++---------------------- user-settings.json | 8 +++++ 3 files changed, 48 insertions(+), 39 deletions(-) create mode 100644 user-settings.json diff --git a/.gitignore b/.gitignore index 664c85a..1221ea1 100644 --- a/.gitignore +++ b/.gitignore @@ -4,5 +4,4 @@ node_modules/ # axe-test urls.txt axe-results.csv -settings.json debug/ diff --git a/src/axe-test.js b/src/axe-test.js index 10f17d4..e76e0ff 100644 --- a/src/axe-test.js +++ b/src/axe-test.js @@ -1,29 +1,17 @@ -/* --------------------------------------------------- */ -// ユーザ設定 - -// @axe-core/puppeteerのwithTagsで、テスト基準を選択的に設定できる。 -// withTagsの設定オプションの詳細は公式ドキュメントを参照: -// https://www.deque.com/axe/core-documentation/api-documentation/#user-content-axe-core-tags -const AXE_CORE_TAGS = ['wcag2a', 'wcag2aa', 'wcag21a', 'wcag21aa']; - -// 出力する結果の種類を指定。詳細は公式ドキュメントを参照: -// https://www.deque.com/axe/core-documentation/api-documentation/#options-parameter -// inapplicable: 判定対象外の基準 -// incomplete: 適合しているか判断できなかった基準 -// passes: 適合している判断とされた基準 -// violations: 適合していないと判断された基準 -const RESULT_TYPES = ['incomplete', 'violations']; - -// 入力するURL一覧のフォルダ・ファイル名と文字コード -const INPUT_PATH = './urls.txt'; -const INPUT_ENCODE = 'utf8'; - -// 出力するフォルダ・ファイル名 -const OUTPUT_PATH = './axe-results.csv'; -const OUTPUT_ENCODE = 'utf8'; - -/* --------------------------------------------------- */ +// 初期設定。詳細はREADMEを参照: +// https://github.com/ttsukagoshi/axe-test/blob/main-ops/README.md +const DEFAULT_SETTINGS = { + axeCoreTags: ['wcag2a', 'wcag2aa', 'wcag21a', 'wcag21aa'], + resultTypes: ['incomplete', 'violations'], + inputPath: './urls.txt', + inputEncode: 'utf8', + outputPath: './axe-results.csv', + outputEncode: 'utf8', +}; +// ユーザ設定ファイルのファイルパス +const USER_SETTINGS_FILE_PATH = './user-settings.json'; +const fs = require('fs'); const { AxePuppeteer } = require('@axe-core/puppeteer'); const puppeteer = require('puppeteer'); const AXE_LOCALE_JA = require('axe-core/locales/ja.json'); @@ -45,20 +33,14 @@ const reportHeader = [ 'Help URL', ]; -// テスト対象の URL を、外部テキストファイルから読み込んで、配列に整形する。 -const fs = require('fs'); -let urls_list = fs.readFileSync(INPUT_PATH, { encoding: INPUT_ENCODE }); -urls_list = urls_list.replace(/\r?\n/g, ','); -urls_list = urls_list.split(','); - (async () => { try { let cliMode = false; // デフォルトではファイル出力する let outputText = ''; // ファイル出力用のテキスト if (process.argv[2]) { + // 引数を受け取った場合の処理 if (process.argv[2] === '--cli') { - // CLI出力 - cliMode = true; + cliMode = true; // CLI出力 } else { throw new Error( `${process.argv[2]} は無効な引数です。「--cli」とすることで、結果をファイル出力する代わりにコマンドラインで返します。` @@ -66,7 +48,25 @@ urls_list = urls_list.split(','); } } - const urls = urls_list; + // ユーザ設定を取得 + let userSettings = JSON.parse( + await fs.promises.readFile(USER_SETTINGS_FILE_PATH) + ); + // ユーザ設定で指定されていない項目には初期値を適用 + Object.keys(DEFAULT_SETTINGS).forEach((key) => { + if (!userSettings[key]) { + userSettings[key] = DEFAULT_SETTINGS[key]; + } + }); + + // テスト対象の URL を、外部テキストファイルから読み込んで、配列に整形する。 + const urls = fs + .readFileSync(userSettings.inputPath, { + encoding: userSettings.inputEncode, + }) + .replace(/\r?\n/g, ',') + .split(','); + const browser = await puppeteer.launch(); for (let i = 0; i < urls.length; i++) { @@ -95,11 +95,11 @@ urls_list = urls_list.split(','); // テストを実行 const results = await new AxePuppeteer(page) .configure(config) - .withTags(AXE_CORE_TAGS) + .withTags(userSettings.axeCoreTags) .analyze(); // テスト結果をCSVとして出力できるように整形 - RESULT_TYPES.forEach((resultType) => { + userSettings.resultTypes.forEach((resultType) => { results[resultType].forEach((resultItem) => { resultItem.nodes.forEach((node) => { node.any.forEach((a) => { @@ -108,7 +108,7 @@ urls_list = urls_list.split(','); resultItem.id, resultType, resultItem.tags - .filter((tag) => AXE_CORE_TAGS.includes(tag)) + .filter((tag) => userSettings.axeCoreTags.includes(tag)) .join(), resultItem.impact, a.message, @@ -136,7 +136,9 @@ urls_list = urls_list.split(','); } await browser.close(); if (!cliMode) { - fs.writeFileSync(OUTPUT_PATH, outputText, { encoding: OUTPUT_ENCODE }); + fs.writeFileSync(userSettings.outputPath, outputText, { + encoding: userSettings.outputEncode, + }); } console.info('アクセシビリティ検査が完了しました。'); } catch (error) { diff --git a/user-settings.json b/user-settings.json new file mode 100644 index 0000000..b931369 --- /dev/null +++ b/user-settings.json @@ -0,0 +1,8 @@ +{ + "axeCoreTags": ["wcag2a", "wcag2aa", "wcag21a", "wcag21aa"], + "resultTypes": ["incomplete", "violations"], + "inputPath": "./urls.txt", + "inputEncode": "utf8", + "outputPath": "./axe-results.csv", + "outputEncode": "utf8" +} From 336a3c9544a02c1cee19be13b545f371f246d404 Mon Sep 17 00:00:00 2001 From: ttsukagoshi <taro.tsukagoshi@gmail.com> Date: Wed, 2 Feb 2022 23:27:44 +0900 Subject: [PATCH 3/4] =?UTF-8?q?=E3=83=A6=E3=83=BC=E3=82=B6=E8=A8=AD?= =?UTF-8?q?=E5=AE=9A=E3=81=AE=E8=AA=BF=E6=95=B4=E6=96=B9=E6=B3=95=E3=82=92?= =?UTF-8?q?README=E3=81=AB=E8=BF=BD=E8=A8=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index cb4d50c..2110b67 100644 --- a/README.md +++ b/README.md @@ -43,26 +43,35 @@ node . <img width="1294" alt="「axe-test.js」によって出力されたテスト結果 (.csv) のイメージ" src="https://user-images.githubusercontent.com/55706659/151901139-a87e171b-c37d-4938-867d-14183982eb1d.png"> -### テスト基準の設定変更 +### オプション設定 -「[./src/axe-test.js](https://github.com/ttsukagoshi/axe-test/blob/main/src/axe-test.js)」では、冒頭のユーザ設定で、テスト基準を設定しています。 +作業フォルダ直下にある `user-settings.json` を編集することで、初期設定を変更できます。 -```javascript -const axeCoreTags = ['wcag2a', 'wcag2aa', 'wcag21a', 'wcag21aa']; -``` +#### 設定できる値 -WCAG 2.1 (および 2.0) の、達成基準レベル A と AA に相当するテストルールを適用して、テストを実行する設定ということです。必要に応じて上記 1 行の記述を変更することで、テスト基準の設定を変更することができます。ここに記述可能なタグについては、[axe API Documentation の 「Axe-core Tags」のセクション](https://www.deque.com/axe/core-documentation/api-documentation/#user-content-axe-core-tags) をご参照ください。 +<!-- prettier-ignore --> +| 変数名 | データ型 | 意味 | 初期値 | +| --- | --- | --- | --- | +| `axeCoreTags` | *Array* | テストの基準となるアクセシビリティ水準を指定します。初期値は、WCAG 2.1 (および 2.0) の、達成基準レベル A と AA に相当するテストルールを適用して、テストを実行する設定となっています。ここに記述可能な水準については、[axe API Documentation の 「Axe-core Tags」のセクション](https://www.deque.com/axe/core-documentation/api-documentation/#user-content-axe-core-tags) をご参照ください。 | `["wcag2a", "wcag2aa", "wcag21a", "wcag21aa"]` | +| `resultTypes` | *Array* | 出力する結果の種類を指定します。 `inapplicable`: 判定対象外の基準/`incomplete`: 適合しているか判断できなかった基準/ `passes`: 適合している判断とされた基準/ `violations`: 適合していないと判断された基準。詳細は公式ドキュメントをご参照ください: https://www.deque.com/axe/core-documentation/api-documentation/#options-parameter | `["incomplete", "violations"]` | +| `inputPath` | *String* | URL一覧のテキストファイルのファイルパス | `./urls.txt` | +| `inputEncode` | *String* | URL一覧のテキストファイルの文字エンコード。サポートされている形式については公式ドキュメントを参照: https://nodejs.org/api/buffer.html#buffers-and-character-encodings | `utf8` | +| `outputPath` | *String* | 出力するCSVのファイルパス | `./axe-results.csv` | +| `outputEncode` | *String* | 出力するCSVファイルの文字エンコード。サポートされている形式については公式ドキュメントを参照: https://nodejs.org/api/buffer.html#buffers-and-character-encodings | `utf8` | -### テスト結果として出力する項目の調整 +#### `user-settings.json` の例 -「[./src/axe-test.js](https://github.com/ttsukagoshi/axe-test/blob/main/src/axe-test.js)」では、冒頭のユーザ設定で、テスト結果として出力する項目を定義しています。 +変更した項目だけ残して、残りは削除しても問題ありません。削除した項目では自動的に初期値が適用されます。 -```javascript -const resultTypes = ['incomplete', 'violations']; +```json +{ + "axeCoreTags": ["wcag2a", "wcag2aa"], + "resultTypes": ["violations"], + "inputPath": "./private/urls.txt", + "inputEncode": "utf16le" +} ``` -現状では `incomplete` (適合しているか判断できなかった基準)と `violations` (適合していないと判断された基準)を返す設定となっています。 - ### コマンドラインへの出力 実行コマンドに `--cli` とつけることで、ファイル出力の代わりにコマンドライン出力できます。 From 7a7e2d44b8e3a8a2481b346fae337bf666c19189 Mon Sep 17 00:00:00 2001 From: ttsukagoshi <taro.tsukagoshi@gmail.com> Date: Wed, 2 Feb 2022 23:35:25 +0900 Subject: [PATCH 4/4] =?UTF-8?q?=E5=A4=89=E6=95=B0=E5=AE=9A=E7=BE=A9?= =?UTF-8?q?=E3=81=AE=E9=85=8D=E7=BD=AE=E3=82=92=E6=95=B4=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/axe-test.js | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/src/axe-test.js b/src/axe-test.js index e76e0ff..29e283c 100644 --- a/src/axe-test.js +++ b/src/axe-test.js @@ -1,3 +1,11 @@ +const fs = require('fs'); +const { AxePuppeteer } = require('@axe-core/puppeteer'); +const puppeteer = require('puppeteer'); +const AXE_LOCALE_JA = require('axe-core/locales/ja.json'); +const config = { + locale: AXE_LOCALE_JA, // テスト結果を日本語で出力するように設定する。 +}; + // 初期設定。詳細はREADMEを参照: // https://github.com/ttsukagoshi/axe-test/blob/main-ops/README.md const DEFAULT_SETTINGS = { @@ -10,17 +18,8 @@ const DEFAULT_SETTINGS = { }; // ユーザ設定ファイルのファイルパス const USER_SETTINGS_FILE_PATH = './user-settings.json'; - -const fs = require('fs'); -const { AxePuppeteer } = require('@axe-core/puppeteer'); -const puppeteer = require('puppeteer'); -const AXE_LOCALE_JA = require('axe-core/locales/ja.json'); -const config = { - locale: AXE_LOCALE_JA, // テスト結果を日本語で出力するように設定する。 -}; - // 出力されるテスト結果のフィールド名(ヘッダ行) -const reportHeader = [ +const REPORT_HEADER = [ 'URL', 'Rule Type', // rule ID 'Result Type', // inapplicable, incomplete, passes, or violations @@ -71,7 +70,7 @@ const reportHeader = [ for (let i = 0; i < urls.length; i++) { if (i === 0) { - const outputHeader = reportHeader.join(); // 出力1行目としてヘッダ行を追加 + const outputHeader = REPORT_HEADER.join(); // 出力1行目としてヘッダ行を追加 if (cliMode) { console.log(outputHeader); } else { @@ -140,7 +139,11 @@ const reportHeader = [ encoding: userSettings.outputEncode, }); } - console.info('アクセシビリティ検査が完了しました。'); + console.info( + `アクセシビリティ検査が完了しました。${ + cliMode ? '' : userSettings.outputPath + ' に結果が出力されています。' + }` + ); } catch (error) { console.error(error); }