الاختبار الآلي لإمكانية الوصول
يشغّل الاختبار الآلي لإمكانية الوصول (Automated accessibility testing) قواعد على الصفحات أو المكونات المعروضة ويُبلغ عن الحالات القابلة للفحص آلياً: صورة بلا سمة alt، أو عنصر نموذج بلا اسم قابل للوصول، أو نص دون عتبة التباين في WCAG، أو سمة ARIA غير صالحة. إنه سريع وقابل للتكرار ومكانه في كل خط تسليم (Pipeline). لكنه ناقص بطبيعته — إذ تنص نظرة W3C العامة على التقييم على أنه لا توجد أداة تستطيع وحدها تحديد ما إذا كان الموقع يستوفي معايير إمكانية الوصول، وأن التقييم البشري المتمكّن مطلوب.
يشرح هذا الدليل أين يقع الحد بين القواعد والحكم البشري، وما قواعد ACT، وكيف تتكامل المحركات الشائعة، وكيف تشغّل الفحوص على مستوى الوحدة والمكوّن والاختبار الشامل وCI، وكيف تفرز النتائج وتضع لها خط أساس وتُبلغ عنها دون أن يُعدّ فحص أخضر دليلاً على المطابقة.
ما تستطيع القواعد الآلية حسمه — وما يحتاج إلى إنسان
تستطيع القاعدة حسم سؤال حين تكون الإجابة موجودة كاملة في DOM وشجرة إمكانية الوصول والأنماط المحسوبة. ولا تستطيع حسم أسئلة المعنى أو الجودة أو التجربة. وكثير من معايير نجاح WCAG يجمع الأمرين: تستطيع الأداة رؤية وجود السمة alt (جزء من 1.1.1) لكنها لا تعرف هل النص مكافئ للصورة. تعامل بحذر مع أي ادعاء منشور بأن الأدوات تغطي نسبة ثابتة من WCAG؛ المهم أن تعرف أي فحوصك حاسمة وأيها يطرح أسئلة فقط.
- قابل للحسم عادةً: غياب السمة alt؛ حقل نموذج أو زر بلا اسم قابل للوصول؛ غياب lang في <html>؛ أدوار ARIA وحالاتها وخصائصها غير الصالحة أو المكتوبة خطأ؛ غياب الأبناء أو الآباء المطلوبين في ARIA؛ تباين النص العادي على خلفية مصمتة؛ تعطيل التكبير عبر وسم viewport؛ العناوين والروابط الفارغة.
- قابل للحسم جزئياً (الأداة تنبّه والإنسان يؤكد): تباين النص فوق الصور أو التدرّجات؛ هل الصورة زخرفية؛ هل بنية العناوين منطقية؛ حجم الهدف حين قد تنطبق استثناءات التباعد؛ هل تُعلن المنطقة الحيّة في الوقت المناسب.
- يحتاج حكماً بشرياً: جودة النص البديل والتسميات؛ منطقية ترتيب التركيز وترتيب القراءة؛ هل تُوصف الأخطاء بطريقة مفيدة (3.3.3)؛ قابلية تشغيل العناصر المخصّصة بلوحة المفاتيح أبعد من السمات الثابتة؛ دقة الترجمة النصية والوصف الصوتي؛ هل الحركة جوهرية أم لا؛ العبء الإدراكي ووضوح اللغة؛ وهل يمكن إنجاز المهمة كاملة بقارئ شاشة.
قابل للحسم عادةً
الإجابة موجودة كاملة في DOM وشجرة إمكانية الوصول والأنماط المحسوبة.
- الصور:
- غياب السمة
alt - البنية:
- العناوين والروابط الفارغة
- الأسماء والرسائل:
- حقل نموذج أو زر بلا اسم قابل للوصول
- ما تُبلغ عنه الأداة عادةً:
- يُبلَّغ عنها إخفاقاً أو نجاحاً (في
axe-coreمثلاً: المخالفات والنجاحات)
قابل للحسم جزئياً
الأداة تنبّه والإنسان يؤكد.
- الصور:
- هل الصورة زخرفية
- البنية:
- هل بنية العناوين منطقية
- الأسماء والرسائل:
- هل تُعلن المنطقة الحيّة في الوقت المناسب
- ما تُبلغ عنه الأداة عادةً:
- تُوسم لمراجعة بشرية (في
axe-coreمثلاً: نتائج غير مكتملة)، فأرسلها إلى شخص
يحتاج حكماً بشرياً
سؤال عن المعنى أو الجودة أو التجربة.
- الصور:
- جودة النص البديل
- البنية:
- منطقية ترتيب التركيز وترتيب القراءة
- الأسماء والرسائل:
- هل تُوصف الأخطاء بطريقة مفيدة (3.3.3)
- ما تُبلغ عنه الأداة عادةً:
- غالباً لا شيء: السلبيات الكاذبة مثل
alt="image123"تنجح في القواعد
الأمثلة مأخوذة من قائمة كل مجموعة أعلاه. والأعمدة المتساوية ليست حصصاً متساوية من WCAG؛ تعامل بحذر مع أي ادعاء بنسبة ثابتة.
قواعد ACT: تعريف مشترك للاختبار
قد تُبلغ أداتان عن نتيجتين مختلفتين للصفحة نفسها لأنهما تفسّران المعيار بشكل مختلف. تعالج قواعد اختبار مطابقة إمكانية الوصول (ACT rules) ذلك: كل قاعدة إجراء اختبار دقيق وموثّق لجزء من متطلب في WCAG أو ARIA، مع قابلية التطبيق والتوقعات والافتراضات وحالات الاختبار. تسردها W3C في صفحة «All ACT Rules»؛ ويطوّرها ACT Rules Community Group وفريق ACT Task Force التابع لمجموعة عمل إرشادات إمكانية الوصول، وهي إرشادية — غير مطلوبة لتحديد المطابقة.
تُوسم القواعد بأنها مقترحة (Proposed) أو معتمدة (Approved)؛ والقاعدة المعتمدة نفّذتها أداة واحدة على الأقل وراجعتها مجموعة عمل W3C المعنية. وتُسرد التنفيذات لكل أداة، وقد تكون آلية أو شبه آلية أو يدوية أو على شكل مدقّق شيفرة (Linter). ومن أمثلة عناوين القواعد «Image has non-empty accessible name» و«HTML page has lang attribute». وبالنسبة إلى المختبِر، قواعد ACT حَكَم مفيد: حين تُعترض نتيجة أداة، قارنها بتوقعات القاعدة وحالات اختبارها.
المحركات والأدوات بوصف محايد
معظم الأدوات محرّك قواعد مع طريقة لتشغيله. ومعرفة المحرك الذي تحت الأداة تفسّر لماذا تتفق أداتان كثيراً.
- axe-core — محرك قواعد إمكانية وصول مفتوح المصدر بلغة JavaScript يعمل داخل سياق المتصفح. يعيد المخالفات (Violations) والنجاحات والنتائج غير المكتملة (عناصر تحتاج مراجعة بشرية) والقواعد غير المنطبقة، ويوسم القواعد بمستوى WCAG. وتغلّفه تكاملات كثيرة.
- تدقيق إمكانية الوصول في Lighthouse — جزء من Lighthouse من Google؛ فحوصه لإمكانية الوصول مبنية على axe-core ويُنتج درجة موزونة. الدرجة 100 تعني أن القواعد المدقّقة نجحت، لا أن الصفحة مطابقة.
- لوحات إمكانية الوصول في أدوات المطوّر بالمتصفح — تعرض شجرة إمكانية الوصول والاسم والدور والحالات المحسوبة ومعلومات التباين للعنصر المحدد. لا غنى عنها للتحقق اليدوي من النتائج الآلية.
- pa11y — أداة سطر أوامر مفتوحة المصدر لتشغيل فحوص إمكانية الوصول الآلية على عناوين URL، وتُستخدم كثيراً في سكربتات CI.
- تكاملات أطر الاختبار — تضيف حزم مجتمعية وتجارية تأكيدات إمكانية الوصول إلى Playwright وCypress وJest وما شابهها؛ ومدقّقات الشيفرة الساكنة (مثلاً لـ JSX) تلتقط بعض المشكلات في الشيفرة المصدرية قبل عرض أي شيء.
- الجوال — توثّق Android الاختبار اليدوي باستخدام TalkBack والفحوص الآلية عبر أطر الاختبار وتطبيق Accessibility Scanner؛ ويوفّر XCTest من Apple دعماً لتدقيق إمكانية الوصول في إصدارات Xcode الحديثة.
- الاختيار — تتيح قائمة أدوات تقييم إمكانية الوصول في W3C (Web Accessibility Evaluation Tools List) تصفية الأدوات حسب الإرشاد والنوع والبيئة؛ وتصرّح W3C بأنها لا تزكّي منتجات بعينها.
تشغيل الفحوص في اختبارات الوحدة والمكوّنات وE2E وCI
ضع الفحوص في أدنى مستوى يستطيع رؤية المشكلة، ثم أضف فحوصاً أوسع في المستويات الأعلى. تلتقط اختبارات المكوّنات والوحدة الأسماء المفقودة وARIA غير الصالحة في كل نسخة من مكوّن نظام التصميم قبل وجود أي صفحة بوقت طويل. لاحظ أن محاكيات DOM مثل jsdom لا تحسب التخطيط، وأن وثائق axe-core تذكر أن قاعدة color-contrast لا تعمل مع JSDOM، لذا تحتاج قواعد التباين والتخطيط إلى متصفح حقيقي. والاستعلام عن العناصر بالدور والاسم القابل للوصول (الأولوية التي توصي بها وثائق Testing Library) فحص خفيف لإمكانية الوصول بحد ذاته: إذا لم يجد الاختبار الزر باسمه، فلن يجده قارئ الشاشة أيضاً.
تعمل الاختبارات الشاملة (E2E) في متصفحات حقيقية ويمكنها فحص الصفحات في الحالات التي يراها المستخدمون — بعد تسجيل الدخول، ومع نافذة حوار مفتوحة، ومع ظهور أخطاء التحقق. تصف وثائق Playwright هذا النمط باستخدام حزمة مبنية على axe؛ ولدى Cypress إضافات مجتمعية مكافئة. وفي CI شغّل الفحوص في كل طلب دمج (Pull request) على الصفحات والمكوّنات التي يمسّها التغيير، مع فحص مجدول أوسع للموقع كله.
// Example: Playwright + @axe-core/playwright, scanning a page in an error state
import { test, expect } from '@playwright/test';
import AxeBuilder from '@axe-core/playwright';
test('checkout form with errors has no WCAG A/AA violations', async ({ page }) => {
await page.goto('/checkout');
await page.getByRole('button', { name: 'Pay now' }).click(); // trigger validation
await expect(page.getByRole('alert')).toBeVisible();
const results = await new AxeBuilder({ page })
.withTags(['wcag2a', 'wcag2aa', 'wcag21a', 'wcag21aa', 'wcag22aa'])
.exclude('#third-party-chat') // documented exclusion, tracked separately
.analyze();
expect(results.violations).toEqual([]);
});افحص الحالات لا عناوين URL فقط
يفحص المحرك ما هو معروض لحظة تشغيله. فالصفحة المفحوصة عند التحميل لا تقول شيئاً عن القائمة التي تُفتح بالنقر، أو نافذة الحوار، أو ملخّص الأخطاء، أو الحالة الفارغة، أو السمة الداكنة، أو تخطيط 320 px. اكتب سكربتات للتفاعلات التي تكشف هذه الحالات وافحص بعد كل منها. وضمّن السمتين إن كنت توفّرهما، وعرضاً ضيقاً واحداً على الأقل، وكل لغة باتجاه مختلف — فالصفحة العربية من اليمين إلى اليسار قد تحمل عيوباً مختلفة عن نظيرتها الإنجليزية.
فرز النتائج: الإيجابيات الكاذبة والسلبيات الكاذبة
عامِل كل نتيجة كفرضية حتى تتحقق منها في أدوات المطوّر أو بالتقنيات المساعدة. الإيجابيات الكاذبة (False positives) تحدث — تباين قيس مقابل طبقة خلفية خاطئة، أو عنصر مخفي أبلغت عنه الأداة، أو نمط ARIA مشروع لا يمثّله المحرك. أما السلبيات الكاذبة (False negatives) فأكثر شيوعاً بكثير وغير مرئية: نص بديل بلا معنى مثل «image123»، أو تسمية تسمّي الحقل الخطأ، أو قائمة منسدلة مخصّصة بأدوار صحيحة لكن بلا دعم للوحة المفاتيح — كلها تنجح في القواعد.
جمّع النتائج حسب القاعدة والمكوّن لا حسب الصفحة: اسم مفقود واحد في مكوّن زر مشترك قد ينتج مئات النتائج المتطابقة. اربط كل مجموعة بمعيار نجاح WCAG، وحدّد الخطورة حسب أثرها على مهمة المستخدم (دفع متوقف يتقدّم على أيقونة زخرفية)، وأرسل العناصر الموسومة بغير مكتملة أو تحتاج مراجعة إلى شخص بدلاً من تجاهلها. ولاحظ أن WCAG 2.2 أزالت المعيار 4.1.1 Parsing، فنتائج صحة الترميز مثل المعرّفات المكررة ليست إخفاقات في WCAG 2.2 بحد ذاتها — ما لم تكسر شيئاً آخر، مثل تسمية أو aria-labelledby تشير إلى العنصر الخطأ.
وضع خط أساس للمشكلات القديمة دون إخفائها
تفعيل بوابة «صفر مخالفات» على منتج ناضج يُفشل عادةً كل بناء. خط الأساس (Baseline) يجعل البوابة مفيدة: سجّل المخالفات الحالية (معرّف القاعدة مع هدف ثابت كالمكوّن أو المحدِّد)، وأفشل البناء فقط على النتائج غير الموجودة في خط الأساس، وراجع ملف خط الأساس في طلبات الدمج كما تراجع الشيفرة. يجب أن يشير كل عنصر فيه إلى تذكرة في قائمة العمل ليُصلَح لا ليُنسى؛ وخط الأساس يجب أن يتقلّص فقط. تجنّب تعطيل القواعد بالجملة — استثنِ منطقة محددة مع سبب ومسؤول، كما في المثال السابق.
{
"generated": "2026-09-28",
"known": [
{ "rule": "color-contrast", "target": ".legacy-footer a", "ticket": "A11Y-214" },
{ "rule": "label", "target": "#old-search input", "ticket": "A11Y-219" }
]
}الإبلاغ عن النتائج الآلية بأمانة
التقرير المفيد يذكر النطاق (الصفحات والحالات وأحجام العرض والسمات واللغات)، والمحرك وإصدار مجموعة القواعد، وإصدار WCAG والمستوى المستهدف، والأعداد حسب معيار النجاح والخطورة، والمشكلات الجديدة مقابل المدرجة في خط الأساس، وما الذي لم يُختبر آلياً بشكل صريح. لا تصف أبداً تشغيلاً آلياً نظيفاً بأنه «مطابق لـ WCAG». واكتب العيوب الفردية بطريقة العيوب اليدوية نفسها — المكوّن، والإخفاق الملحوظ، والمعيار، والمستخدمون المتأثرون — واربط توثيق القاعدة.
الجمع بين الأتمتة والاختبار اليدوي وعيّنات WCAG-EM
البرنامج المستدام يطبّق الأساليب طبقات: قواعد آلية مع كل تغيير؛ وفحوص يدوية للوحة المفاتيح والعرض البصري والنماذج مع كل ميزة؛ واختبار بالتقنيات المساعدة للرحلات الأساسية بقارئات الشاشة والتكبير؛ وحيثما أمكن، جلسات مع أشخاص من ذوي الإعاقة، وهو ما تشجّع عليه إرشادات التقييم في W3C طوال التطوير.
ولتقييم رسمي لموقع كامل، تقدّم منهجية تقييم WCAG من W3C (WCAG-EM 2.0) البنية: تحديد نطاق التقييم، واستكشاف المنتج، واختيار عيّنة ممثِّلة، وتقييم العيّنة، والإبلاغ عن النتائج. تجمع العيّنة بين اختيار منظَّم — الواجهات الشائعة، والوظائف الأساسية، وأنواع المحتوى والتقنيات المختلفة، وكل صفحة في كل عملية كاملة — ومجموعة مختارة عشوائياً. والفحوص الآلية مناسبة لاستكشاف الموقع كله واختيار هذه العيّنة؛ ثم تُقيَّم العيّنة نفسها مقابل كل معيار نجاح منطبق، يدوياً في الغالب.
الأسئلة الشائعة
ما النسبة المئوية من WCAG التي تستطيع الأدوات الآلية اختبارها؟
لا يوجد رقم واحد موثوق، فالأمر يعتمد على المحرك والمحتوى وطريقة احتساب المعايير القابلة للأتمتة جزئياً. وموقف W3C أنه لا توجد أداة تستطيع وحدها تحديد المطابقة. خطّط لأن تلتقط الأتمتة جزءاً بموثوقية، وأن يغطي الاختبار اليدوي واختبار التقنيات المساعدة الباقي.
هل درجة 100 في تدقيق Lighthouse تعني أن موقعي ميسّر؟
لا. تعني أن القواعد الآلية المدقّقة نجحت في تلك الصفحة وفي تلك الحالة. قابلية التشغيل بلوحة المفاتيح وجودة النص البديل ومعالجة الأخطاء وتجربة قارئ الشاشة خارج ما تقيسه الدرجة.
هل يجب أن يفشل بناء CI عند مخالفات إمكانية الوصول؟
نعم للمخالفات الجديدة في الشيفرة التي يمسّها التغيير، مع خط أساس مُراجَع للمخالفات القائمة. أما الإفشال على كل شيء دفعة واحدة فيدفع الفرق عادةً إلى تعطيل الفحص.
ماذا أفعل بنتائج «تحتاج مراجعة» أو غير المكتملة؟
وجّهها إلى شخص. إنها حالات لم يستطع المحرك حسمها — مثل نص فوق صورة خلفية — وكثيراً ما تختبئ فيها العيوب الحقيقية.
هل يمكن تشغيل فحوص إمكانية الوصول في اختبارات الوحدة؟
نعم للبنية والأسماء: عرض مكوّن وتشغيل محرك إمكانية وصول أو استعلامات قائمة على الدور يلتقط التسميات المفقودة وARIA غير الصالحة مبكراً. أما فحوص التباين والتخطيط فتحتاج متصفحاً حقيقياً، فأبقها في اختبارات المكوّنات داخل المتصفح أو الاختبارات الشاملة.
هل تعمل الأدوات الآلية مع تطبيقات الجوال الأصلية؟
توجد أدوات للمنصات — توثّق Android فحوصاً آلية لإمكانية الوصول وتطبيق Accessibility Scanner، ويتضمن XCTest من Apple تدقيقات إمكانية الوصول في الإصدارات الحديثة — لكنها، كما على الويب، تكمّل الاختبار باستخدام TalkBack وVoiceOver ولا تحلّ محله.
المراجع
- Evaluating Web Accessibility Overviewمدخل W3C إلى تقييم إمكانية الوصول: لماذا يبدأ التقييم مبكراً ويستمر طوال التطوير، وكيف تتكامل الفحوص اليدوية والأدوات ومشاركة المستخدمين.
- All ACT Rulesقواعد اختبار مطابقة إمكانية الوصول (ACT): إجراءات اختبار دقيقة وموثّقة لمتطلبات WCAG وARIA، تجعل نتائج الأدوات والاختبار اليدوي متسقة.
- Web Content Accessibility Guidelines (WCAG) 2.2توصية W3C التي تحدد معايير النجاح القابلة للاختبار لإتاحة محتوى الويب، مرتّبةً تحت أربعة مبادئ وثلاثة مستويات مطابقة (A وAA وAAA).
- WCAG Evaluation Methodology (WCAG-EM) 2.0منهجية W3C لتقييم موقع كامل وفق WCAG: تحديد النطاق، والاستكشاف، واختيار عيّنة ممثِّلة، وتدقيقها، ثم إعداد التقرير.
- Web Accessibility Evaluation Tools Listقائمة قابلة للتصفية بأدوات تقييم إمكانية الوصول حسب النوع والإرشاد والبيئة — تسردها W3C دون أن تزكّي أياً منها.
- Playwright Documentationالتوثيق الرسمي لـ Playwright، إطار الاختبار الشامل الذي يشغّل Chromium وWebKit وFirefox.
- Cypress Documentationالتوثيق الرسمي لاختبار الويب الشامل واختبار المكونات في المتصفح باستخدام Cypress.
- About Queries — Testing Libraryأنواع الاستعلامات وأولويتها — الدور والتسمية قبل النص، ومعرّفات الاختبار أخيراً — لتعثر الاختبارات على العناصر كما يفعل المستخدمون والتقنيات المساعدة.
تمرين عملي
افرز نتائج فحص آلي لإمكانية الوصول في طلب دمج
أنت مهندس الجودة في Darb Bus، وهو تطبيق ويب لحجز تذاكر الحافلات (مثال خيالي). يضيف طلب الدمج (Pull request) رقم #482 صفحة جديدة فيها مخطط للمقاعد ونموذج لبيانات المسافر. ويشغّل كل طلب دمج المحرك axe-core داخل اختبار شامل (E2E) مكتوب بـ Playwright، مع خط أساس (Baseline) للمشكلات القديمة. فشل التشغيل الأول، ثم دفع المطوّر الإيداع (Commit) a2 فصارت المهمة خضراء، ويقول وصف طلب الدمج الآن إن الصفحة مطابقة لـ WCAG 2.2 AA. وقبل الدمج تراجع أنت النتائج والفحص والادعاء. تعرض المادة أدناه السياق، والفحص، والتشغيلين، ومخرجات مدقّق HTML، وخط الأساس، ونص طلب الدمج، ومقتطفاً من ترميز الصفحة.
اعمل على الورق مستعيناً بالدليل: ما تستطيع القواعد حسمه وما لا تستطيع، والفرز، وخط الأساس، وفحص الحالات، والإبلاغ الأمين. اربط كل نتيجة بمعيار نجاح في WCAG 2.2، وحدّد الخطورة حسب أثرها على مهمة الحجز وفق سُلّم الفريق: حاجب (Blocker) وحرج (Critical) ورئيسي (Major) وثانوي (Minor) وتافه (Trivial). ونسب التباين معطاة في المادة، فلا تحتاج إلى أداة لحساب التباين. خصّص لذلك 20–30 دقيقة.
Darb Bus - تطبيق ويب لحجز تذاكر الحافلات (مثال خيالي). واجهة إنجليزية وعربية،
وسمة فاتحة وأخرى داكنة. يستهدف الفريق WCAG 2.2 بالمستوى AA.
يضيف طلب الدمج #482 «Seat map and passenger details» الصفحة /booking/details:
اختيار مقعد من مخطط المقاعد (إلزامي)، ثم إدخال بيانات المسافر (كل الحقول إلزامية
ما عدا جهة الاتصال للطوارئ)، ثم «Continue to payment».
يشغّل كل طلب دمج مهمة E2E اسمها a11y-e2e: المحرك axe-core عبر @axe-core/playwright.
1. الفحص بعد الإيداع a2 (e2e/booking-details.a11y.spec.ts)
// imports as in the guide, plus the baseline file and the team helper newFindings(),
// which drops every finding whose rule + target pair is listed in a11y-baseline.json
test('booking details page is accessible', async ({ page }) => {
await page.goto('/booking/details?trip=RUH-DMM-0715');
const results = await new AxeBuilder({ page })
.withTags(['wcag2a', 'wcag2aa'])
// contrast is noisy here and is covered by the Jest unit tests (jsdom)
.disableRules(['color-contrast'])
.analyze();
expect(newFindings(results.violations, baseline)).toEqual([]);
});
2. المهمة a11y-e2e، التشغيل 1 على الإيداع a1 (قبل سطر disableRules): FAILED
ما فُحص: /booking/details عند تحميل الصفحة، 1280 x 720، الواجهة الإنجليزية،
السمة الفاتحة
# rule elements target baseline
Violations
V1 button-name 40 elements .seat-map button.seat NEW
V2 duplicate-id-aria 2 elements input#phone NEW
V3 image-alt 1 element .trip-summary img.operator-logo NEW
V4 color-contrast 1 element button#continue NEW
#FFFFFF on #4CAF50 = 2.78:1, 16px bold;
expected 4.5:1
V5 color-contrast 3 elements .legacy-footer a KNOWN A11Y-88
V6 link-name 1 element footer a.social-x KNOWN A11Y-91
Incomplete (needs review)
I1 color-contrast 1 element .trip-banner h2
"Riyadh to Dammam", white, 24px;
background could not be determined
(background image)
تعليق المطوّر: «V1 إيجابية كاذبة: كل زر مقعد يحتوي أيقونة SVG».
فحص يدوي لـ I1 أجرته هناء (منتقي الألوان في أدوات المطوّر عند أفتح نقطة خلف
العنوان): #5C5C5C، والنسبة 6.7:1 مقابل الأبيض. وصورة الشريط تتغير بتغيّر الوجهة.
3. المهمة markup-check على الإيداع a1 (مدقّق HTML؛ رسائله تستشهد بـ WCAG 2.1)
duplicate id "phone" 2 elements WCAG 4.1.1 Parsing - failure
duplicate id "promo" 2 elements WCAG 4.1.1 Parsing - failure
لا تشير أي تسمية أو سمة ARIA إلى المعرّف "promo": إنه على غلافَي div زخرفيين.
4. الملف a11y-baseline.json في الفرع main
التذاكر: A11Y-88 مفتوحة؛ A11Y-91 مفتوحة؛ A11Y-95 منجزة في 2 سبتمبر 2026
(أعيد بناء حقل رمز الخصم في صفحة الدفع بتسمية مرئية)
{
"generated": "2026-08-14",
"known": [
{ "rule": "color-contrast", "target": ".legacy-footer a", "ticket": "A11Y-88" },
{ "rule": "link-name", "target": "footer a.social-x", "ticket": "A11Y-91" },
{ "rule": "label", "target": "#promo-code", "ticket": "A11Y-95" },
{ "rule": "image-alt", "target": ".promo-banner img" }
]
}
5. الإيداع a2 «Make a11y job green» - التشغيل 2: PASSED، و0 مخالفات جديدة
يضيف سطر disableRules الظاهر في الجزء 1، وهذه الإدخالات إلى a11y-baseline.json:
{ "rule": "button-name", "target": ".seat-map button.seat", "ticket": "A11Y-140" },
{ "rule": "duplicate-id-aria", "target": "input#phone", "ticket": "A11Y-141" },
{ "rule": "image-alt", "target": ".trip-summary img.operator-logo" }
6. وصف طلب الدمج (مسودة)
«إمكانية الوصول: يُبلغ axe عن 0 مخالفات، ويعطي Lighthouse الصفحة الرئيسية درجة
100 في إمكانية الوصول. صفحة الحجز الجديدة مطابقة لـ WCAG 2.2 AA».
7. مقتطف من ترميز /booking/details (الواجهة الإنجليزية، بعد اختيار مقعد؛ مقعد من كل
نوع، والمجموع 40)
<div class="trip-summary">
<img class="operator-logo" src="/img/op/17.png"> <span>Eastern Coaches</span>
<span>Riyadh to Dammam, Fri 16 Oct 2026, 07:15</span>
</div>
<img src="/img/seat-legend.png" alt="legend">
<div class="seat-map">
<button class="seat"><svg class="i-seat"><path d="..."/></svg></button>
<button class="seat seat--taken"><svg class="i-seat"><path d="..."/></svg></button>
<button class="seat seat--selected"><svg class="i-seat"><path d="..."/></svg></button>
</div>
<label for="dob">Passport number</label>
<input id="passport" name="passport">
<label for="passport">Date of birth</label>
<input id="dob" name="dob" placeholder="DD/MM/YYYY">
<span id="nat-label">Nationality</span>
<div role="combobox" aria-labelledby="nat-label" aria-expanded="false"
aria-controls="nat-list" tabindex="0" onclick="toggleList()">Select</div>
<ul id="nat-list" role="listbox" hidden>
<li role="option" onclick="pickNationality(this)">Saudi Arabia</li> ...
</ul>
<label for="phone">Mobile phone</label> <input id="phone" type="tel">
<label for="phone">Emergency contact phone</label> <input id="phone" type="tel">
<p class="error" hidden>Invalid input</p>
<button id="continue">Continue to payment</button>
تعرض صورة المفتاح ثلاث أيقونات مقاعد مع الكلمات Available (أبيض) وTaken (رمادي)
وSelected (أخضر). وحالة المقعد تظهر بلون تعبئته فقط (الصنفان seat--taken
وseat--selected). الدالة toggleList() تُظهر القائمة أو تخفيها وتحدّث
aria-expanded، ولا توجد معالجات للمفاتيح. وكل p.error تحت حقلها وتظهر عند الإرسال.- افرز التشغيل الأول: لكل مخالفة وللنتيجة غير المكتملة قرّر هل هي إيجابية صحيحة (True positive) أم إيجابية كاذبة (False positive) وكيف تتحقق من ذلك، وجمّع النتائج حسب المكوّن، وسمِّ معيار النجاح في WCAG 2.2، وحدّد خطورة النتائج الجديدة. وقرّر في تعليق المطوّر على V1 وفي نتيجتي المهمة markup-check.
- راجع الإيداع a2 وخط الأساس: ماذا تقبل وماذا ترفض، ولماذا؟ وماذا يجب أن يحتوي خط الأساس بعد طلب الدمج هذا؟
- راجع الفحص نفسه: اذكر ما لا يستطيع رؤيته، واكتب خطة فحص أفضل تشمل مستويات الاختبار والوسوم (Tags) والحالات واللغات وأحجام العرض والسمات.
- اقرأ مقتطف الترميز بحثاً عمّا تجتازه القواعد ويحتاج إلى حكم بشري. واذكر لكل نتيجة المعيار والخطورة والفحص اليدوي أو فحص التقنيات المساعدة الذي يكشفها.
- أعد كتابة عبارة إمكانية الوصول في وصف طلب الدمج على شكل تقرير أمين.
إظهار الإجابة النموذجية
V1: إيجابية صحيحة، وتعليق المطوّر خاطئ. عنصر svg بلا title ولا aria-label ولا نص داخله لا يمنح الزر اسماً قابلاً للوصول (Accessible name): تُظهر لوحة إمكانية الوصول في أدوات المطوّر الدور button باسم فارغ، وقاعدة ACT «Button has non-empty accessible name» تتوقع اسماً غير فارغ. والعناصر الأربعون عيب واحد في مكوّن زر المقعد، لا أربعون عيباً. المعيار: 4.1.2 Name, Role, Value. الخطورة: حاجب، فمستخدم قارئ الشاشة يسمع «button» أربعين مرة، ولا يستطيع التمييز بين المقاعد ولا معرفة المتاح منها، ولا يستطيع المتابعة دون مقعد، فلا يُنجَز الحجز إلا بالتخمين. المتوقع: أن يُسمّى كل مقعد برقمه وحالته، مثل «Seat 12, available»؛ أما الحالة نفسها فتأتي في مراجعة الترميز أدناه.
V2: إيجابية صحيحة، وأخطر مما يوحي به اسم قاعدتها. كلتا التسميتين تحمل for="phone"، والتسمية تشير إلى أول عنصر يحمل هذا المعرّف، فيحصل حقل الهاتف الجوال على التسميتين ولا يحصل حقل جهة الاتصال للطوارئ على أي تسمية. المعيار: 4.1.2 Name, Role, Value، لأن هذا الحقل بلا اسم قابل للوصول. الخطورة: رئيسي، فالحقل اختياري، لكن مستخدم قارئ الشاشة لا يعرف أي رقم يُكتب في أي حقل، وقد يُحفظ الرقم الخطأ رقماً للطوارئ. الإصلاح: معرّفات فريدة، مثل emergency-phone. وسطر markup-check الخاص بـ phone هو العيب نفسه، فتغطيهما تذكرة واحدة. أما المعرّف المكرر promo فليس إخفاقاً في WCAG 2.2: فقد أزالت WCAG 2.2 المعيار 4.1.1 Parsing، ولا تشير إلى هذا المعرّف أي تسمية أو سمة ARIA، فلا يكسر اسماً ولا علاقة. سجّله إن شئت عنصراً منخفض الأولوية في جودة الشيفرة، واطلب أن تتوقف رسائل المدقّق عن الاستشهاد بالمعيار 4.1.1 في مشروع يستهدف WCAG 2.2.
V3: إيجابية صحيحة، 1.1.1 Non-text Content. اسم شركة النقل موجود أصلاً في النص المجاور للشعار، فالإصلاح الصحيح هو alt="" الذي يجعل الصورة زخرفية؛ أما نص بديل مثل «Eastern Coaches logo» فيجعل الاسم يُقرأ مرتين. الخطورة: ثانوي، فقد يلجأ قارئ الشاشة إلى قراءة اسم الملف، وهذا تشويش لا يؤثر في إنجاز المهمة.
V4: إيجابية صحيحة، 1.4.3 Contrast (Minimum). لا يُعدّ النص العريض كبير الحجم إلا من 14 نقطة، أي نحو 18.7px، فتسمية الزر بحجم 16px وخط عريض تحتاج إلى 4.5:1، والنسبة 2.78:1 تُخفق. الخطورة: رئيسي، فالطريق الوحيد إلى الدفع صعب القراءة على ضعاف البصر، مع أن المهمة ما زالت ممكنة. أصلح اللون (الأبيض على #2E7D32 مثلاً نحو 5.1:1) وأعد التحقق في متصفح حقيقي وفي السمتين. وهذه هي المخالفة الحقيقية التي أخفاها الإيداع a2.
V5 وV6 نتيجتان قديمتان مدرجتان في خط الأساس ولهما تذكرتان مفتوحتان (A11Y-88 وA11Y-91): لا تُفشلان طلب الدمج هذا ولم يتسبب فيهما، لكن مكانهما في التقرير بوصفهما مشكلتين معروفتين. أما I1 فليست مخالفة ولا إيجابية كاذبة: لم يستطع المحرك الحسم فأحال السؤال إلى إنسان. وقياس هناء، 6.7:1 عند أفتح نقطة، ناجح: فالنص بحجم 24px نص كبير الحجم يحتاج إلى 3:1، بل إنه يتجاوز 4.5:1 أيضاً. سجّله ناجحاً لهذا المسار مع الدليل. ولأن الصورة تتغير بتغيّر الوجهة، اطلب أن يضمن التصميم هذا التباين على أي صورة، مثلاً بطبقة داكنة خلف النص، أو افحص أفتح الصور أيضاً.
الإيداع a2: ارفضه. سطر disableRules يعطّل قاعدة كاملة: أخفى V4، وهي مخالفة حقيقية في طلب الدمج هذا، وسيخفي كل انحدار مستقبلي في التباين على الصفحة. وسببه خاطئ أيضاً: jsdom لا يحسب التخطيط، ووثائق axe-core تذكر أن قاعدة color-contrast لا تعمل مع JSDOM، فاختبارات Jest لا تفحص التباين أصلاً. وإن كان لا بد من استبعاد عنصر بعينه فاستثنِ ذلك العنصر وحده مع سبب ومسؤول وتذكرة. والإدخالات الثلاثة الجديدة في خط الأساس تخفي مخالفات في شيفرة يضيفها طلب الدمج هذا: فخط الأساس يسجّل المشكلات القديمة ويجب أن يتقلّص فقط، والبوابة موجودة لتُفشل هذه بالذات؛ وإدخال image-alt بلا تذكرة أصلاً. أصلح V1 إلى V4 في طلب الدمج هذا بدلاً من ذلك. ويحتاج خط الأساس في الفرع main إلى تصحيحين أيضاً. احذف إدخال A11Y-95: فالمشكلة أُصلحت، وبقاء إدخالها يخفي انحدارها — وتأكّد أولاً في الفحص المجدول للموقع كله، لأن فحص هذه الصفحة لا يصل إلى حقل رمز الخصم. وافتح تذكرة لـ .promo-banner img. وبعد الدمج يضم خط الأساس ثلاثة إدخالات: A11Y-88 وA11Y-91 والتذكرة الجديدة، وليس فيه شيء من طلب الدمج هذا.
الفحص يفحص حالة واحدة: الصفحة عند التحميل، بالإنجليزية، في السمة الفاتحة، بحجم 1280 × 720. لا يرى أبداً مقعداً محدداً، ولا قائمة الجنسية مفتوحة، ولا أخطاء التحقق، ولا الصفحة العربية من اليمين إلى اليسار، ولا عرضاً ضيقاً، ولا السمة الداكنة. والوسمان wcag2a وwcag2aa لا يشغّلان إلا القواعد التي يصنّفها axe-core تحت معايير WCAG 2.0؛ ولهدف WCAG 2.2 AA أضف wcag21a وwcag21aa وwcag22aa كما في مثال الدليل، فمثلاً يصنّف axe-core فحص autocomplete تحت 1.3.5 Identify Input Purpose، وهو معيار من WCAG 2.1. خطة أفضل: في الاختبار الشامل افحص (1) عند التحميل، و(2) بعد اختيار مقعد، و(3) بعد فتح قائمة الجنسية، و(4) بعد النقر على «Continue to payment» مع ترك الحقول الإلزامية فارغة؛ وكرّر الفحوص الأربعة على الواجهة العربية، وبعرض 320px، وفي السمة الداكنة؛ وأبقِ color-contrast مفعّلة. وفي مستوى أدنى أضف اختبار مكوّن لزر المقعد يجد كل مقعد بدوره واسمه، مثل getByRole('button', { name: 'Seat 12, available' }): يفشل اليوم، ويعمل في jsdom، ويلتقط الاسم المفقود قبل وجود أي صفحة بوقت طويل. وفي مستوى أعلى أبقِ فحصاً مجدولاً أوسع للموقع كله.
ما تجتازه القواعد ويحتاج إلى حكم بشري: خمس نتائج في الترميز. (1) لصورة المفتاح نص بديل، فتنجح قاعدة image-alt، لكن «legend» ليس مكافئاً لما تقوله الصورة: 1.1.1. وكلماتها أيضاً صورة نص في موضع يكفي فيه النص الحقيقي: 1.4.5 Images of Text. اذكر الألوان الثلاثة ومعانيها في النص البديل، أو الأفضل أن يكون المفتاح نصاً حقيقياً، فيعالج الأمرين معاً. الخطورة: رئيسي ما دام هو الشرح الوحيد لألوان المقاعد. تكشفه مراجعة النص البديل لكل صورة مقابل محتواها. (2) حالة المقعد تظهر باللون وحده: 1.4.1 Use of Color؛ ولا تُعرض حالتا «محجوز» و«محدد» للتقنيات المساعدة أصلاً: 4.1.2. أصلحه مع V1، مثلاً المقعد المحجوز زراً معطّلاً (disabled)، والمقعد المحدد مع aria-pressed="true"، وفرق مرئي غير اللون. وهو جزء من عيب مخطط المقاعد الحاجب. يكشفه النظر إلى الصفحة بتدرّج الرمادي والاختبار بقارئ الشاشة.
(3) تسميتا رقم الجواز وتاريخ الميلاد متبادلتان. لكل حقل تسمية فتنجح قاعدة label، لكن حقل الجواز يُعلَن «Date of birth» والعكس: 1.3.1 Info and Relationships و2.5.3 Label in Name. الخطورة: حرج، فمستخدمو قارئ الشاشة والتحكم الصوتي يكتبون في الحقل الخطأ؛ وأفضل الاحتمالات رسالة خطأ، وأسوؤها بيانات مسافر خاطئة في الحجز. تكشفه مقارنة الاسم المحسوب لكل حقل في أدوات المطوّر بتسميته المرئية. (4) لمربع التحرير والسرد (Combobox) الخاص بالجنسية دور واسم وحالة صحيحة، لكن له معالج onclick فقط: لا يفعل Enter ولا Space ولا مفاتيح الأسهم شيئاً، فلا يستطيع مستخدمو لوحة المفاتيح اختيار الجنسية: 2.1.1 Keyboard. الخطورة: حاجب لمستخدمي لوحة المفاتيح لأن الحقل إلزامي. ولا يكشفه إلا اختبار بلوحة المفاتيح. (5) «Invalid input» لا تقول ما الخطأ ولا كيف يُصحَّح، مع أن الصيغة المتوقعة معروفة: 3.3.3 Error Suggestion، مثل «Enter the date of birth as DD/MM/YYYY». الخطورة: رئيسي. لم يصل الفحص إلى هذه الحالة قط، والصياغة تحتاج إلى إنسان في كل الأحوال. وأمران آخران للتحقق: لا شيء يربط كل رسالة بحقلها أو يُعلنها (لا aria-describedby ولا aria-invalid ولا منطقة حيّة)، فتأكّد بقارئ الشاشة في حالة الخطأ أن المستخدم يسمع أي حقل فيه خطأ وما الخطأ (3.3.1 Error Identification)؛ ولا شيء في الترميز يميّز الحقول الإلزامية (لا كلمة «required» في التسميات ولا السمة required)، فإن لم يميّزها التصميم المرئي أيضاً فلن يعرفها المستخدم إلا من رسائل الخطأ (3.3.2 Labels or Instructions).
العبارة الأمينة التي تحل محل المسودة: «إمكانية الوصول، الجزء الآلي. النطاق: /booking/details عند التحميل فقط؛ الواجهة الإنجليزية، السمة الفاتحة، 1280 × 720. المحرك: axe-core (الإصدار من ملف القفل) عبر @axe-core/playwright؛ الوسوم wcag2a وwcag2aa، أي قواعد WCAG 2.0 للمستويين A وAA فقط، مقابل هدف WCAG 2.2 AA. التشغيل الأول: 4 مخالفات جديدة في شيفرة يضيفها طلب الدمج هذا: 4.1.2 أزرار مقاعد بلا أسماء (40 عنصراً، مكوّن واحد، حاجب)، و4.1.2 المعرّف المكرر phone الذي يترك هاتف جهة الطوارئ بلا تسمية (رئيسي)، و1.4.3 زر Continue بنسبة 2.78:1 (رئيسي)، و1.1.1 شعار شركة النقل بلا alt (ثانوي)؛ ونتيجتان مدرجتان في خط الأساس (A11Y-88 وA11Y-91)؛ ونتيجة غير مكتملة فُحصت يدوياً ونجحت. أُلغي الإيداع a2، وتُصلَح المخالفات الأربع في طلب الدمج هذا، وتبقى البوابة مفعّلة مع color-contrast. ما لم تغطّه الأتمتة: الحالات الأخرى، والواجهة العربية، والسمة الداكنة، والعروض الضيقة، والتشغيل بلوحة المفاتيح، وصحة التسميات والنصوص البديلة، ورسائل الخطأ، ورحلة قارئ الشاشة؛ ووجدت مراجعة يدوية للترميز خمسة عيوب أخرى (التذاكر مرفقة). هذه ليست ادعاء مطابقة.» واحذف جملة Lighthouse: درجة الصفحة الرئيسية لا تقول شيئاً عن هذه الصفحة، وحتى هناك لا تعني الدرجة 100 إلا أن القواعد المدقّقة نجحت في تلك الحالة.
إن اختلفت إجاباتك فتحقّق من أن لكل نتيجة دليلها ومعيارها وخطورتها مع السبب، ومالكاً أو تذكرة. اختلافات مقبولة: حرج بدلاً من حاجب لـ V1 أو لمربع الجنسية إن كان فريقك يحجز مستوى «حاجب» لتوقف خدمة كاملة، أو نص بديل يذكر اسم شركة النقل لو لم يكن الاسم ظاهراً نصاً. وغير مقبول: عدّ V1 إيجابية كاذبة، أو قبول أي جزء من الإيداع a2، أو عدّ المعرّف المكرر promo إخفاقاً في WCAG 2.2، أو إغلاق I1 دون فحص بشري، أو أي ادعاء بأن الصفحة «مطابقة لـ WCAG» لأن الفحص أخضر.
تقدّمك في هذا الموضوع
سجّل الدخول لتتابع تقدّمك
علّم الموضوعات مكتملة، وتابع من حيث توقفت، وافتح امتحانات التخصص.
جزء من مسار تعلم ضمان الجودة
قبل هذا الموضوع
الموضوعات التالية
الأدوات المذكورة في هذا الدليل
افحص HTML بحثاً عن مشكلات إمكانية الوصول الشائعة — نص بديل مفقود، وحقول بلا تسميات، وأزرار وروابط بلا أسماء، وأخطاء ARIA، والعناوين، والتباين — مربوطة بمعايير WCAG 2.2.
ولّد قائمة تحقق QA مخصّصة (وظيفية وواجهة مستخدم وAPI وأمان وأداء وإمكانية وصول وإصدار) لأي ميزة باستخدام الذكاء الاصطناعي من متقن.
ولّد عناوين أخطاء واضحة وقابلة للبحث من وصف غير مرتّب باستخدام الذكاء الاصطناعي من متقن.
احصل على درجة خطورة مقترحة (Blocker / Critical / Major / Minor / Trivial) مع التبرير من الذكاء الاصطناعي من متقن.