اختبار إمكانية الوصول في النماذج
النماذج هي المكان الذي تكون فيه عيوب إمكانية الوصول (Accessibility) الأعلى كلفة: فنموذج تسجيل أو دفع أو طلب حكومي لا يستطيع مستخدم قارئ الشاشة إكماله ليس مشكلة شكلية، بل معاملة متوقفة. ومعظم عيوب النماذج سهلة الاكتشاف متى عرفت ما تبحث عنه — حقل بلا تسمية برمجية، أو خطأ يظهر باللون الأحمر فقط، أو رمز تحقق لمرة واحدة لا يمكن لصقه.
يقدّم لك هذا الدليل معايير نجاح WCAG 2.2 التي تنطبق على النماذج، ومعنى كل منها عملياً، وإجراء اختبار قابلاً للتكرار، وقائمة فحص جاهزة للنسخ، وعناوين عيوب واقعية. أما التشغيل بلوحة المفاتيح وتقنيات قارئ الشاشة فلكل منهما دليله الخاص؛ وهنا نطبّقهما على النماذج.
أي معايير WCAG 2.2 تنطبق على النماذج
لا يوجد معيار نجاح (Success criterion) واحد اسمه «النماذج». المتطلبات موزّعة على المبادئ الأربعة، لذا فمراجعة النموذج هي في الحقيقة مرور على مجموعة معروفة من المعايير. ما يلي هو المجموعة الأساسية، والمستويات كما نُشرت في WCAG 2.2.
- 1.3.1 Info and Relationships (A) — يجب أن تكون التسميات والمجموعات وحالة الإلزام متاحة برمجياً، لا بصرياً فقط.
- 1.3.5 Identify Input Purpose (AA) — الحقول التي تجمع معلومات عن المستخدم تُعلن غرضها (في HTML عبر السمة autocomplete).
- 1.4.1 Use of Color (A) — لا يُشار إلى الحقول الإلزامية والأخطاء باللون وحده.
- 2.5.3 Label in Name (A) — الاسم القابل للوصول (Accessible name) للعنصر يحتوي نص تسميته المرئية.
- 3.2.2 On Input (A) — تغيير قيمة حقل لا يسبب تغييراً غير متوقع في السياق، مثل إرسال النموذج.
- 3.3.1 Error Identification (A) — عند اكتشاف خطأ إدخال يُحدَّد الحقل ويوصف الخطأ نصاً.
- 3.3.2 Labels or Instructions (A) — تُقدَّم تسميات أو تعليمات حين يتطلب المحتوى إدخالاً من المستخدم.
- 3.3.3 Error Suggestion (AA) — حين يكون التصحيح معروفاً يُقترح، ما لم يُعرّض ذلك الأمن أو الغرض للخطر.
- 3.3.4 Error Prevention (Legal, Financial, Data) (AA) — الإرسال ذو الأثر القانوني أو المالي أو على البيانات قابل للتراجع أو مُتحقَّق منه أو مؤكَّد.
- 3.3.7 Redundant Entry (A) — المعلومات المُدخلة سابقاً في العملية نفسها تُملأ تلقائياً أو تُتاح للاختيار.
- 3.3.8 Accessible Authentication (Minimum) (AA) — لا تتطلب أي خطوة دخول اختبار وظيفة إدراكية ما لم يوجد بديل أو آلية مسموح بها.
- 4.1.2 Name, Role, Value (A) و4.1.3 Status Messages (AA) — العناصر المخصّصة تُعلن الاسم والدور والحالة، ورسائل الحالة والخطأ تصل إلى التقنيات المساعدة دون نقل التركيز.
التسميات والتعليمات والحقول الإلزامية
يحتاج كل حقل إدخال إلى اسم قابل للوصول يطابق ما يقرؤه المستخدم المبصر بجواره. الطريقة المتينة في HTML هي عنصر <label> مربوط بالحقل عبر for/id أو محيط به. النص النائب داخل الحقل الفارغ ليس تسمية: يختفي عند الكتابة، وكثيراً ما يفشل في التباين، ودعمه كاسم قابل للوصول غير متسق. السمتان aria-label وaria-labelledby صحيحتان حين لا يوجد عنصر تسمية مرئي، لكن تحقّق حينها من معيار Label in Name — فزر يظهر عليه «إرسال» واسمه البرمجي «Submit form» يُربك مستخدمي التحكم الصوتي الذين ينطقون ما يرونه.
التعليمات وتلميحات التنسيق («يوم/شهر/سنة»، «8 أحرف على الأقل ورقم واحد») مكانها قبل الحقل أو مرتبطة به، عادةً عبر aria-describedby، لتُقرأ عند وصول التركيز إلى الحقل. أما التعليمات التي لا تظهر إلا في تلميح عند مرور المؤشر فيفوّتها مستخدمو لوحة المفاتيح واللمس.
تحتاج الحقول الإلزامية إلى إشارة مرئية وأخرى برمجية معاً. النجمة الحمراء وحدها تعتمد على اللون وعلى معرفة المستخدم بالعُرف؛ فاشرحها مرة في أعلى النموذج («الحقول المعلَّمة بـ * إلزامية») أو اكتب «(إلزامي)» في التسمية، واضبط السمة required أو aria-required="true" ليعلنها قارئ الشاشة.
- افحص الاسم القابل للوصول لكل حقل في لوحة إمكانية الوصول ضمن أدوات المطوّر في المتصفح — لا تستنتجه من الشيفرة.
- انقر التسمية المرئية: يجب أن ينتقل التركيز إلى الحقل (فحص سريع لارتباط التسمية فعلاً).
جرّبها: مولّد اختبارات التحقق جرّبها: فاحص إمكانية الوصول في HTML
تجميع الحقول المترابطة باستخدام fieldset وlegend
لمجموعة أزرار الاختيار أو مربعات التحديد مستويان من المعنى: السؤال وكل إجابة. إذا وُسمت الإجابات وحدها يسمع مستخدم قارئ الشاشة «نعم، زر اختيار، 1 من 2» دون أن يعرف ما السؤال. ضع المجموعة داخل <fieldset> مع <legend>، أو استخدم role="group" أو role="radiogroup" مع aria-labelledby في العناصر المخصّصة. وينطبق الأمر نفسه على تاريخ الميلاد المقسّم إلى يوم وشهر وسنة، وعلى كتل العناوين المتكررة.
<!-- Defect: the question is plain text, not associated with the radios -->
<p>هل لديك إقامة سارية؟</p>
<input type="radio" id="p-yes" name="permit"><label for="p-yes">نعم</label>
<input type="radio" id="p-no" name="permit"><label for="p-no">لا</label>
<!-- Fixed: the legend names the group; each option keeps its own label -->
<fieldset>
<legend>هل لديك إقامة سارية؟ (إلزامي)</legend>
<input type="radio" id="p-yes" name="permit" required><label for="p-yes">نعم</label>
<input type="radio" id="p-no" name="permit"><label for="p-no">لا</label>
</fieldset>تحديد الأخطاء واقتراح تصحيحها والإعلان عنها
عند فشل التحقق يجب أن تتحقق ثلاثة أمور: يُحدَّد الحقل الذي فيه الخطأ؛ ويوصف الخطأ نصاً (3.3.1)؛ وحين يكون التصحيح معروفاً يُقترح (3.3.3) — «أدخل التاريخ بصيغة يوم/شهر/سنة، مثل 05/03/2026» بدلاً من «إدخال غير صالح». الإطار الأحمر وحده يُخفق في 1.4.1؛ والأيقونة وحدها تحتاج بديلاً نصياً؛ ويجب ربط الرسالة بالحقل برمجياً (aria-describedby أو aria-errormessage مع aria-invalid="true") لتُقرأ حين يعود المستخدم إليه.
حقل تاريخ الميلاد بعد إدخال بصيغة خاطئة
<label الجزء 1:for="dob">الجزء 2:Date of birth (required)</label> <p id="dob-hint">الجزء 3:DD/MM/YYYY</p> <input الجزء 1:id="dob" الجزء 4:required الجزء 5:autocomplete="bday" الجزء 6:aria-invalid="true" الجزء 7:aria-describedby="dob-hint dob-error"> <p id="dob-error">الجزء 8:Enter the date as DD/MM/YYYY, for example 05/03/2026</p>
- 1تسمية مربوطة بالحقلقيمة
forتطابقidالحقل: النقر على التسمية ينقل التركيز إلى الحقل.1.3.1 - 2التسمية المرئية = الاسم القابل للوصوليحتوي الاسم نصَّ التسمية المرئية؛ وعبارة
(required)مكتوبة في التسمية، لا يُشار إليها باللون وحده.2.5.3 · 3.3.2 · 1.4.1 - 3تلميح التنسيق قبل الحقلمكتوب قبل الحقل، لا في تلميح يظهر عند مرور المؤشر فقط؛ ومربوط عبر (7) ليُقرأ عند وصول التركيز إلى الحقل.3.3.2
- 4حالة الإلزامالسمة
requiredأوaria-required="true"ليعلنها قارئ الشاشة.1.3.1 - 5غرض الإدخالالقيمة
bdayتعلن ما يجمعه الحقل، فيستطيع المتصفح ملأه.1.3.5 - 6حالة الخطأتُضبط على الحقل ما دامت قيمته لا تجتاز التحقق.
- 7ربط التلميح ورسالة الخطأيشير إلى التلميح (3) والخطأ (8) فيُقرآن مع الحقل. والبديل:
aria-errormessageمعaria-invalid. - 8الخطأ نصاً مع اقتراح التصحيحيصف المشكلة ويقترح الصيغة المتوقعة بمثال، بدلاً من «إدخال غير صالح».3.3.1 · 3.3.3
قد يضيف التنسيق إطاراً أحمر أو أيقونة، لكن الإطار الأحمر وحده يُخفق في 1.4.1، والأيقونة وحدها تحتاج بديلاً نصياً: الخطأ هنا مكتوب نصاً (8).
ويحتاج المستخدم أيضاً إلى أن يعرف أن خطأً قد وقع. نمطان عمليان شائعان: عند الإرسال، اعرض ملخّص أخطاء أعلى النموذج وانقل التركيز إليه واربط كل بند بحقله؛ أو انقل التركيز مباشرة إلى أول حقل خاطئ. وللرسائل التي تظهر دون نقل التركيز — «تم الحفظ»، «3 نتائج»، أو «اسم المستخدم محجوز» القادمة بشكل غير متزامن — استخدم منطقة حيّة (Live region) مثل role="status" أو aria-live="polite" للمعلومات، وrole="alert" للأخطاء العاجلة، لتستوفي 4.1.3 Status Messages. يجب أن تكون حاوية المنطقة الحيّة موجودة في الصفحة قبل إدراج النص، وإلا فإن كثيراً من قارئات الشاشة لا تعلنه.
راقب توقيت التحقق الفوري. الإعلان عن خطأ مع كل ضغطة مفتاح، أو أثناء كتابة المستخدم لبريده الإلكتروني، مزعج ومربك؛ والتحقق عند مغادرة الحقل أو عند الإرسال أهدأ عادةً. ولا يجوز أن يؤدي تغيير حقل إلى إرسال النموذج أو الانتقال من الصفحة من تلقاء نفسه (3.2.2 On Input) ما لم يُبلَّغ المستخدم مسبقاً.
- أرسل نموذجاً فارغاً: يُبلَّغ عن كل حقل إلزامي نصاً، مع ذكر اسم الحقل في الرسالة.
- أدخل صيغة خاطئة: تذكر الرسالة الصيغة المتوقعة مع مثال.
- باستخدام قارئ شاشة، أرسل النموذج الخاطئ: تسمع أن هناك أخطاء دون أن تبحث عنها.
- أخطاء الخادم (مثل «رُفضت البطاقة») تُعلن بالطريقة نفسها التي تُعلن بها أخطاء المتصفح.
جرّبها: مولّد الاختبارات السلبية جرّبها: مولّد حمولات خطأ وهمية
منع الأخطاء وتجنّب الإدخال المكرر
ينطبق 3.3.4 Error Prevention (Legal, Financial, Data) على الصفحات التي تُنشئ التزامات قانونية أو معاملات مالية، أو تعدّل بيانات يتحكم بها المستخدم أو تحذفها، أو ترسل إجابات اختبار. ويجب أن يتحقق خيار واحد على الأقل من ثلاثة: أن يكون الإرسال قابلاً للتراجع؛ أو أن تُفحص البيانات ويُتاح للمستخدم تصحيحها؛ أو أن تتوفر آلية لمراجعة المعلومات وتأكيدها وتصحيحها قبل الإتمام. عملياً يتحقق المختبِر من وجود خطوة مراجعة قبل الدفع، أو نافذة تراجع أو إلغاء، أو حوار تأكيد قبل حذف الحساب — ومن أن شاشة المراجعة نفسها ميسّرة (عناوين، وقيم مقروءة، ورابط «تعديل» لكل قسم باسم واضح).
أما 3.3.7 Redundant Entry (A) فمعيار جديد في WCAG 2.2. إذا طلبت عملية متعددة الخطوات معلومات أدخلها المستخدم سابقاً — عنوان الشحن في خطوة الفوترة، أو رقم الهوية الوطنية في خطوة التأكيد — فيجب ملؤها تلقائياً أو عرضها للاختيار (مثل مربع «مطابق لعنوان الشحن»). وتوجد استثناءات حين تكون إعادة الإدخال جوهرية، أو مطلوبة للأمان (مثل تأكيد كلمة مرور جديدة)، أو حين لا تعود المعلومات السابقة صالحة.
غرض الإدخال والإكمال التلقائي والمصادقة الميسّرة
يطلب 1.3.5 Identify Input Purpose أن تُعلن الحقول التي تجمع معلومات عن المستخدم غرضها برمجياً حين يكون الغرض مدرجاً في قسم «Input Purposes for User Interface Components» في WCAG. في HTML يعني ذلك السمة autocomplete بالقيمة الصحيحة: name وgiven-name وfamily-name وemail وtel وstreet-address وpostal-code وbday وusername وcurrent-password وnew-password وcc-number وغيرها. وأبعد من المطابقة، تتيح القيم الصحيحة للمتصفحات ومديري كلمات المرور ملء النموذج، ما يساعد مباشرة ذوي الإعاقات الحركية والإدراكية. تحقق من القيمة في كل حقل؛ ووجود autocomplete="off" على حقل بيانات شخصية ملاحظة تستحق الرفع.
وينص 3.3.8 Accessible Authentication (Minimum) على ألا تتطلب أي خطوة في عملية المصادقة اختبار وظيفة إدراكية (Cognitive function test) — تذكّر كلمة مرور، أو حل لغز، أو نسخ رمز يدوياً — ما لم تقدّم الخطوة طريقة بديلة لا تعتمد عليه، أو آلية مساعدة (ومن أمثلة WCAG نفسها دعم مديري كلمات المرور والنسخ واللصق)، أو كان الاختبار تعرّفاً على أشياء أو على محتوى شخصي قدّمه المستخدم. وتَعُدّ وثيقة Understanding نسخَ رمز التحقق لمرة واحدة يدوياً اختبارَ وظيفة إدراكية، لذا يجب على الأقل أن يستطيع المستخدم لصق الرمز.
- حقول اسم المستخدم وكلمة المرور تقبل اللصق ويمكن لمديري كلمات المرور ملؤها (لا توجد شيفرة تمنع اللصق أو الملء التلقائي).
- يمكن لصق رمز التحقق لمرة واحدة (OTP) كاملاً. مدخلات «خانة لكل رقم» تفشل في هذا غالباً: اللصق يملأ الخانة الأولى فقط — اختبر ذلك صراحة. القيمة autocomplete="one-time-code" في HTML تساعد المتصفح على اقتراح الرمز، لكنها ليست ضمن قائمة أغراض الإدخال في WCAG، فعاملها كممارسة جيدة لا كمتطلب لـ 1.3.5.
- اختبار CAPTCHA: اختبار CAPTCHA النصي أو اللغزي اختبار وظيفة إدراكية ويحتاج إلى بديل؛ أما CAPTCHA القائم على التعرّف على الأشياء فمستثنى في المستوى AA (لا في AAA، أي 3.3.9 Accessible Authentication (Enhanced)). وأي صورة CAPTCHA تحتاج مع ذلك إلى بديل نصي يحدد غرضها وفق 1.1.1، إضافة إلى صيغة بديلة بحاسة مختلفة.
- الخيارات بلا كلمة مرور (رابط عبر البريد، مفاتيح المرور Passkeys/WebAuthn) بدائل تتجنب اختبار الوظيفة الإدراكية — تحقق من أنها قابلة للوصول والتشغيل بلوحة المفاتيح وقارئ الشاشة.
إجراء اختبار عملي
- جولة البنية (أدوات المطوّر): لكل حقل اقرأ الاسم القابل للوصول المحسوب والدور والوصف وحالتي الإلزام والخطأ في شجرة إمكانية الوصول (Accessibility tree). وتحقق من قيم autocomplete.
- جولة لوحة المفاتيح: أكمل النموذج باستخدام Tab وShift+Tab والأسهم وSpace وEnter فقط — ترتيب التركيز يتبع الترتيب المرئي، والتركيز ظاهر دائماً، وقوائم الاختيار ومنتقيات التاريخ المخصّصة قابلة للتشغيل (راجع دليل اختبار لوحة المفاتيح).
- جولة قارئ الشاشة: أكمل النموذج بـ NVDA أو JAWS على Windows، أو VoiceOver على macOS/iOS، أو TalkBack على Android — كل حقل ومجموعة وتلميح وخطأ يُعلن بشكل مفهوم (راجع دليل اختبار قارئ الشاشة).
- جولة الأخطاء: أرسل فارغاً، وأرسل كل صيغة خاطئة، وأطلق أخطاء الخادم، وأطلق انتهاء المهلة. راقب انتقال التركيز والإعلانات.
- الجولة البصرية: كبّر إلى 200% وتحقق من إعادة التدفق عند عرض 320 CSS px؛ تبقى التسميات والأخطاء بجوار حقولها؛ ولا تعتمد الأخطاء على اللون؛ وحدود الحقول ومؤشرات التركيز تستوفي تباين العناصر غير النصية.
قائمة فحص: حالات اختبار النماذج الميسّرة
انسخ هذه القائمة إلى أداة إدارة الاختبار بوصفها قائمة لكل نموذج، أو حوّل كل سطر إلى حالة اختبار (Test case) بحقول النموذج وبياناته الفعلية. والقائمة أدناه بالإنجليزية لتُنسخ كما هي، وهذه بنودها:
- التسميات والتعليمات — لكل حقل تسمية مرئية واسم قابل للوصول مطابق لها (1.3.1 و3.3.2 و2.5.3)؛ والنص النائب (Placeholder) ليس التسمية الوحيدة أبداً؛ وتلميحات الصيغة مرتبطة بالحقل (aria-describedby) وتُقرأ عند التركيز؛ والحقول الإلزامية معلَّمة بنص مرئي أو برمز مشروح مع required أو aria-required (1.3.1 و1.4.1).
- التجميع — لمجموعات أزرار الاختيار ومربعات التحديد وللحقول المقسّمة (التاريخ والهاتف) عنصر fieldset مع legend، أو role=group مع اسم.
- الأخطاء — عند الإرسال فارغاً تسمّي كل رسالة الحقل وتظهر نصاً (3.3.1)؛ وعند الصيغة الخاطئة تقترح الرسالة الصيغة الصحيحة بمثال (3.3.3)؛ والخطأ مرتبط بالحقل وaria-invalid مضبوطة على الحقول غير الصالحة؛ والأخطاء تُعلَن، إما بنقل التركيز إلى الملخص أو إلى أول خطأ وإما بمنطقة حية (4.1.3)؛ ولا تُعرض الأخطاء باللون وحده (1.4.1)؛ وتغيير قيمة حقل لا يرسل النموذج ولا ينقل الصفحة على نحو غير متوقع (3.2.2).
- منع الأخطاء والإدخال المتكرر — في الإرسالات القانونية والمالية والتي تغيّر البيانات توجد مراجعة أو تراجع أو فحص وتصحيح (3.3.4)؛ والبيانات المُدخلة في خطوات سابقة تُملأ مسبقاً أو يمكن اختيارها (3.3.7)؛ ويمكن تمديد مهلة الجلسة دون فقدان البيانات (2.2.1).
- الغرض والمصادقة — قيم autocomplete صحيحة في حقول البيانات الشخصية (1.3.5)؛ واللصق ومديرو كلمات المرور يعملون في حقول اسم المستخدم وكلمة المرور ورمز OTP (3.3.8)؛ ولصق رمز OTP كاملاً في المربعات المقسّمة يملؤها كلها؛ ولاختبار CAPTCHA بديل وله بديل نصي (3.3.8 و1.1.1).
- التشغيل — يمكن إكمال النموذج كله بلوحة المفاتيح وحدها مع تركيز مرئي، ويمكن إكماله بقارئ الشاشة؛ وعند تكبير 200% وعرض 320 CSS px لا تضيع التسميات ولا الأخطاء؛ والنماذج العربية تعلن lang="ar" dir="rtl"، وحقول البيانات ذات الاتجاه من اليسار إلى اليمين تستخدم dir="ltr" أو dir="auto".
FORM A11Y CHECKLIST — <form name / URL / build>
Labels & instructions
[ ] Every field has a visible label and a matching accessible name (1.3.1, 3.3.2, 2.5.3)
[ ] Placeholder is never the only label
[ ] Format hints are associated with the field (aria-describedby) and read on focus
[ ] Required fields: visible text or explained marker + required/aria-required (1.3.1, 1.4.1)
Grouping
[ ] Radio/checkbox groups and split fields (date, phone) have fieldset+legend or role=group with a name
Errors
[ ] Empty submit: each error names the field and is in text (3.3.1)
[ ] Wrong format: message suggests the correct format with an example (3.3.3)
[ ] Error is associated with the field; aria-invalid set on invalid fields
[ ] Errors are announced: focus moves to summary/first error, or live region used (4.1.3)
[ ] Errors are not shown by colour alone (1.4.1)
[ ] Changing a field does not submit or navigate unexpectedly (3.2.2)
Prevention & redundant entry
[ ] Legal/financial/data-changing submit: review, undo or check-and-correct exists (3.3.4)
[ ] Data from earlier steps is pre-filled or selectable (3.3.7)
[ ] Session timeout can be extended without data loss (2.2.1)
Purpose & authentication
[ ] autocomplete tokens correct on personal-data fields (1.3.5)
[ ] Paste and password managers work on username/password/OTP fields (3.3.8)
[ ] Pasting a full OTP into split boxes fills all boxes
[ ] CAPTCHA has an alternative and a text alternative (3.3.8, 1.1.1)
Operation
[ ] Whole form completable by keyboard only; focus visible
[ ] Whole form completable with a screen reader
[ ] 200% zoom and 320 CSS px width: no lost labels or errors
[ ] RTL forms: lang="ar" dir="rtl"; LTR data fields use dir="ltr"/"auto"عيوب نموذجية مكتوبة كعناوين تقارير أخطاء
تُصلَح عيوب إمكانية الوصول أسرع حين يسمّي العنوان العنصر والإخفاق الملحوظ والمستخدمين المتأثرين، ويذكر متن التقرير معيار النجاح. بنية التقرير الكاملة يغطيها دليل كتابة تقرير الخطأ؛ وهذه عناوين واقعية تحتذي بها.
- «التسجيل: حقل البريد الإلكتروني بلا اسم قابل للوصول — قارئ الشاشة يعلن ‹حقل تحرير› فقط (1.3.1، 4.1.2)»
- «الدفع: أخطاء البطاقة تظهر كإطار أحمر فقط دون رسالة نصية (1.4.1، 3.3.1)»
- «الدفع: ملخّص الأخطاء يظهر بعد الإرسال لكن التركيز يبقى على الزر ولا يُعلن شيء (4.1.3)»
- «تسجيل الدخول: اللصق ممنوع في حقل كلمة المرور ومديرو كلمات المرور لا يستطيعون ملأه (3.3.8)»
- «شاشة OTP: لصق رمز من 6 أرقام يملأ الخانة الأولى فقط من ست خانات (3.3.8)»
- «طلب التأشيرة، الخطوة 3: يجب كتابة رقم الجواز مرة أخرى رغم إدخاله في الخطوة 1 (3.3.7)»
النماذج العربية والنماذج من اليمين إلى اليسار
تضيف النماذج العربية فحوصاً خاصة فوق القائمة السابقة. تحتاج الصفحة أو النموذج إلى lang="ar" وdir="rtl" ليغيّر قارئ الشاشة صوته ويقرأ بالترتيب الصحيح؛ ويجب أن تتبع التسميات والتلميحات وملخّصات الأخطاء ترتيب القراءة من اليمين إلى اليسار (RTL)، وأن يطابقه ترتيب التركيز. أما الحقول التي تحمل بيانات من اليسار إلى اليمين — البريد الإلكتروني، وعناوين URL، وأرقام IBAN، وكثير من صيغ الهاتف — فتحتاج عادةً إلى dir="ltr" (أو dir="auto") على الحقل نفسه كي لا يُعاد ترتيب المحارف أثناء الكتابة، ويجب ألا تتشوّه هذه القيم حين تقتبسها رسائل الخطأ.
ويجب أن يقبل التحقق ما يكتبه الناس فعلاً بالعربية: الأرقام العربية المشرقية (٠١٢٣) في الهاتف ورقم الهوية إن كان النظام يحوّلها، والأسماء بالحرف العربي، والتواريخ الهجرية حيث يقبلها العمل. رسالة مثل «أدخل اسماً صالحاً» تظهر عند إدخال اسم عربي صحيح عيب وظيفي وعيب إمكانية وصول معاً. ويغطي دليل اختبار الواجهات من اليمين إلى اليسار النص ثنائي الاتجاه وعكس الواجهة والإدخال مختلط الاتجاه بالتفصيل.
الأسئلة الشائعة
هل يكفي النص النائب داخل الحقل كتسمية؟
لا. يختفي حين يبدأ المستخدم الكتابة، وكثيراً ما يكون تباينه منخفضاً، ولا يُعرض بشكل موثوق كاسم قابل للوصول. استخدم تسمية مرئية مرتبطة بالحقل، واحتفظ بالنص النائب — إن استُخدم — لقيمة مثال.
هل تظهر الأخطاء بجوار الحقول أم في ملخّص أم كليهما؟
تشترط WCAG تحديد الحقل ووصف الخطأ نصاً، ولا تفرض تخطيطاً معيناً. كثير من الفرق تستخدم الاثنين: ملخّصاً في الأعلى يتلقى التركيز بعد الإرسال مع روابط إلى كل حقل، ورسالة بجوار كل حقل مرتبطة به برمجياً.
aria-live="polite" أم role="alert" لأخطاء النماذج؟
استخدم الإعلانات المهذّبة (role="status" أو aria-live="polite") لتحديثات الحالة والرسائل غير العاجلة، وrole="alert" باقتصاد للأخطاء التي تحتاج انتباهاً فورياً. وأياً كان اختيارك، تحقق بقارئ شاشة حقيقي من أن الرسالة تُعلن مرة واحدة ولا تتكرر مع كل ضغطة مفتاح.
هل يمنع المعيار 3.3.8 كلمات المرور؟
لا. يشترط ألا يكون اختبار الوظيفة الإدراكية هو الطريق الوحيد، أو أن تتوفر آلية مساعدة. والسماح لمديري كلمات المرور بملء الحقل والسماح باللصق آلية تذكرها WCAG نفسها مثالاً.
هل autocomplete="off" إخفاق وفق WCAG؟
في الحقول التي تجمع معلومات عن المستخدم ولها غرض مدرج في قائمة أغراض الإدخال في WCAG، يجب أن يكون الغرض قابلاً للتحديد برمجياً؛ وautocomplete="off" يزيل هذه الإشارة، لذا يُبلَّغ عنه عادةً تحت 1.3.5. أما في الحقول التي لا تخص المستخدم، كمربع البحث أو مرجع لمرة واحدة، فاستخدامه مشروع.
المراجع
- Web Content Accessibility Guidelines (WCAG) 2.2توصية W3C التي تحدد معايير النجاح القابلة للاختبار لإتاحة محتوى الويب، مرتّبةً تحت أربعة مبادئ وثلاثة مستويات مطابقة (A وAA وAAA).
- Understanding WCAG 2.2الشرح التوضيحي لكل إرشاد ومعيار نجاح في WCAG 2.2: الغرض، ومن يستفيد، والأمثلة والتقنيات (غير إلزامي).
- How to Meet WCAG (Quick Reference)قائمة قابلة للتصفية بكل معايير نجاح WCAG 2.2 مع التقنيات الكافية وحالات الإخفاق الشائعة.
- Accessible Rich Internet Applications (WAI-ARIA) 1.2توصية W3C التي تعرّف أدوار ARIA وحالاتها وخصائصها — أي كيف تُعلن عناصر الواجهة المخصّصة معناها للتقنيات المساعدة.
- ARIA Authoring Practices Guide (APG)أنماط للعناصر الشائعة (التبويبات والقوائم ونوافذ الحوار والقوائم المنسدلة) مع تفاعل لوحة المفاتيح المتوقع واستخدام ARIA — المرجع الذي تُقارَن به المكونات المخصصة.
- Accessibility — MDNأدلة عملية لبناء صفحات ويب ميسّرة وفحصها: HTML الدلالي وARIA ودعم لوحة المفاتيح والاختبار.
- Evaluating Web Accessibility Overviewمدخل W3C إلى تقييم إمكانية الوصول: لماذا يبدأ التقييم مبكراً ويستمر طوال التطوير، وكيف تتكامل الفحوص اليدوية والأدوات ومشاركة المستخدمين.
تمرين عملي
راجع نموذج طلب من أربع خطوات وفق WCAG 2.2 AA
تختبر طلب الإنترنت المنزلي بالألياف لدى مزوّد خدمة خيالي في السعودية. يمرّ الطلب بأربع خطوات: الدخول برقم الجوال، وبياناتك، والتركيب، والمراجعة والدفع. وأساس الاختبار (Test basis) لإمكانية الوصول هو WCAG 2.2 المستوى AA. وقبل الإصدار تراجع النموذج بالإجراء الذي يقدّمه الدليل. تعرض المادة أدناه شيفرة الخطوة 2 كما يقدّمها الخادم، وملاحظاتك من جولات لوحة المفاتيح وقارئ الشاشة والأخطاء.
اعمل على الورق مستعيناً بقائمة المعايير وقائمة الفحص في الدليل. لكل عيب اذكر معيار النجاح (Success criterion) برقمه واسمه ومستواه، ولكل بند ليس عيباً اذكر السبب. خصّص لذلك 20–30 دقيقة.
طلب إنترنت منزلي بالألياف لدى مزوّد خدمة في السعودية (مثال خيالي) - ويب، بيئة Staging
الصفحة: <html lang="ar" dir="rtl">. أساس الاختبار: WCAG 2.2، المستوى AA.
الخطوات: 1 الدخول برقم الجوال · 2 بياناتك · 3 التركيب · 4 المراجعة والدفع
في الخطوة 1 يسجّل العميل دخوله برقم جواله ورمز من 6 أرقام يصله برسالة SMS،
ويُنشأ له حساب إن كان الرقم جديداً.
شيفرة الخطوة 2 (مقتطف كما يقدّمه الخادم)
<h2>الخطوة 2 من 4: بياناتك</h2>
<p>جميع الحقول إلزامية.</p>
<form id="details" novalidate>
<span class="lbl">الاسم الكامل</span>
<input id="name" name="name" autocomplete="name" required>
<label for="email">البريد الإلكتروني</label>
<input id="email" name="email" type="email" dir="ltr" autocomplete="off" required>
<input id="mobile" name="mobile" type="tel" placeholder="رقم الجوال" required>
<p>تاريخ الميلاد</p>
<select id="dob-d" name="dob-d" aria-label="اليوم" required>…</select>
<select id="dob-m" name="dob-m" aria-label="الشهر" required>…</select>
<select id="dob-y" name="dob-y" aria-label="السنة" required>…</select>
<label for="nid">رقم الهوية الوطنية أو الإقامة</label>
<input id="nid" name="nid" inputmode="numeric" aria-describedby="nid-hint" required>
<p id="nid-hint">10 أرقام تبدأ بـ 1 (الهوية الوطنية) أو 2 (الإقامة)</p>
<button type="submit" aria-label="إرسال النموذج">التالي</button>
</form>
تعرض كل قائمة من قوائم التاريخ كلمة «اليوم» أو «الشهر» أو «السنة» حتى تُختار قيمة.
ويتحقق النموذج من المدخلات بسكربت خاص به (novalidate) عند مغادرة الحقل
وعند ضغط «التالي».
ملاحظات من الجولات الأخرى (لوحة المفاتيح فقط، وNVDA مع Chrome على Windows)
ملاحظة N1، الخطوة 1: يُكتب الرمز في ست خانات داخل <fieldset> نص <legend> فيه
«أدخل الرمز المكوّن من 6 أرقام الذي أرسلناه برسالة SMS». لكل خانة maxlength="1"
واسم من «الرقم 1» إلى «الرقم 6». كتابة رقم تنقل التركيز إلى الخانة التالية.
ولصق الرمز 482913 من الرسالة في الخانة الأولى يضع فيها 4، وتبقى الخمس الأخرى فارغة.
ملاحظة N2، الخطوة 1: لا تحمل خانات الرمز الست السمة autocomplete.
ملاحظة N3، الخطوة 2، ضغط «التالي» وكل الحقول فارغة: يظهر إطار أحمر حول كل حقل،
ولا يظهر أي نص في أي مكان، ويبقى التركيز على «التالي»، ولا يقول NVDA شيئاً.
ملاحظة N4، الخطوة 2، رقم هوية من 9 أرقام ثم «التالي»: يظهر تحت الحقل نص أحمر
«إدخال غير صالح»، وينتقل التركيز إلى الحقل.
ملاحظة N5، الخطوة 2، مغادرة حقل البريد الإلكتروني بعنوان له حساب سابق: يظهر تحت
الحقل «هذا البريد الإلكتروني مسجّل مسبقاً. سجّل الدخول بدلاً من ذلك.»
داخل <div class="err"> ينشئه السكربت في تلك اللحظة، بلا role ولا aria-live.
ولا يقول NVDA شيئاً.
ملاحظة N6، الخطوة 3: قائمة «موعد التركيب» (<select>) ترسل الخطوة فور تغيّر قيمتها.
على القائمة المغلقة يختار السهم للأسفل الموعد التالي، وتُفتح الخطوة 4 فوراً.
ملاحظة N7، الخطوة 4: تُعرض كل القيم من الخطوات 1 إلى 3 تحت عنوان لكل خطوة، ولكل
خطوة رابط تعديل يحمل اسمها (مثل «تعديل التركيب»). ولا يُقدَّم الطلب إلا بعد
تحديد مربع «راجعتُ طلبي» وضغط «ادفع 299.00 ريال». ويمكن إلغاؤه مجاناً خلال 24 ساعة.- أجرِ جولة البنية على شيفرة الخطوة 2: لكل عنصر اكتب اسمه القابل للوصول (Accessible name)، وكيف تُعلَن مجموعته وتلميحه وحالة الإلزام فيه، وقيمة
autocompleteفيه. وعلّم كل إخفاق بمعياره. - صنّف الملاحظات من N1 إلى N7: عيب مع معيار النجاح، أو ليس عيباً مع السبب.
- اكتب عنوان تقرير خطأ لكل عيب بنمط الدليل (الشاشة، والعنصر، والإخفاق الملحوظ، والمعيار)، وعلّم العيوب التي قد تمنع فئة من المستخدمين من إتمام الطلب.
- اكتب التغيير في الشيفرة أو في السلوك الذي يُصلح كل عيب، ثم اذكر ما ستفحصه في اختبار التأكيد (Confirmation testing) وفي اختبار الانحدار (Regression testing) عند وصول الإصلاحات.
إظهار الإجابة النموذجية
جولة البنية على الخطوة 2، عنصراً عنصراً. «الاسم الكامل»: الاسم القابل للوصول فارغ، لأن النص المرئي داخل <span> لا داخل <label> مربوط بالحقل، فيعلن قارئ الشاشة حقل تحرير بلا اسم. وهذا يُخفق في 1.3.1 Info and Relationships (A) و4.1.2 Name, Role, Value (A)؛ أما autocomplete="name" وrequired فصحيحتان. «البريد الإلكتروني»: اسمه من <label>، وحالة الإلزام معلنة، لكن autocomplete="off" على حقل يجمع عنوان المستخدم نفسه يُخفق في 1.3.5 Identify Input Purpose (AA). حقل الجوال (mobile): تسميته الوحيدة هي النص النائب (Placeholder) الذي يختفي بمجرد الكتابة ولا يُعرض اسماً بشكل موثوق، فهو يخالف قاعدة قائمة الفحص «النص النائب ليس التسمية الوحيدة أبداً» (3.3.2 Labels or Instructions، المستوى A)، وتنقصه أيضاً autocomplete="tel" (1.3.5). والأهم أن الرقم أُدخل وتُحقِّق منه في الخطوة 1، ولا يُملأ تلقائياً ولا يُعرض للاختيار: 3.3.7 Redundant Entry (A). ولا ينطبق أي استثناء: إعادة الإدخال ليست جوهرية، ولا مطلوبة للأمان، والرقم ما زال صالحاً.
«تاريخ الميلاد»: لكل قائمة اسم («اليوم» و«الشهر» و«السنة») يطابق نصها المرئي، لكن السؤال «تاريخ الميلاد» فقرة <p> عادية، فيسمع مستخدم قارئ الشاشة اسم «اليوم» ودور القائمة دون أن يعرف أي تاريخ هو المطلوب. المجموعة غير معلنة: 1.3.1 (A). وتنقص القوائمَ الثلاث القيمُ autocomplete="bday-day" و"bday-month" و"bday-year" المدرجة في قائمة أغراض الإدخال في WCAG، وهذا إخفاق ثانٍ في 1.3.5 (AA). «رقم الهوية الوطنية أو الإقامة»: اسمه من <label>، والتلميح يُقرأ عند التركيز عبر aria-describedby، وحالة الإلزام معلنة؛ لا عيب هنا. وليس له قيمة autocomplete، وهذا صحيح، لأن رقم الهوية الوطنية ليس من أغراض الإدخال في WCAG. زر «التالي»: اسمه القابل للوصول يأتي من aria-label="إرسال النموذج" ولا يحتوي الكلمة المرئية «التالي»، فمستخدم التحكم الصوتي الذي ينطق ما يراه لا يصل إلى الزر: 2.5.3 Label in Name (A). والصفحة تعلن لغتها واتجاهها (lang="ar" dir="rtl"، المعيار 3.1.1 Language of Page)، فيقرأ قارئ الشاشة بالصوت الصحيح، وdir="ltr" على حقل البريد يحفظ ترتيب المحارف أثناء الكتابة كما في قسم النماذج العربية من الدليل؛ لا عيب هنا.
الملاحظات. N1 — عيب، 3.3.8 Accessible Authentication (Minimum) (AA). الخطوة 1 هي تسجيل الدخول، وكتابة رمز من رسالة SMS يدوياً هي النسخ الذي تَعُدّه وثيقة Understanding اختبار وظيفة إدراكية (Cognitive function test)؛ واللصق، وهو الآلية التي تستوفي المعيار، لا يملأ إلا الخانة الأولى. N2 — ليس عيباً: القيمة autocomplete="one-time-code" تساعد المتصفح على اقتراح الرمز، لكن رمز التحقق لمرة واحدة ليس ضمن قائمة أغراض الإدخال في WCAG، فغيابها لا يُخفق في 1.3.5؛ أوصِ بها ممارسةً جيدة داخل تقرير N1. N3 — عيب: الأخطاء معروضة باللون وحده، وهذا يُخفق في 1.4.1 Use of Color (A)، ولا يُحدَّد أي حقل ولا يوصف أي خطأ نصاً، وهذا يُخفق في 3.3.1 Error Identification (A)؛ بل إن مستخدم قارئ الشاشة لا يعرف حتى أن الخطوة رُفضت. N4 — عيب، 3.3.3 Error Suggestion (AA): التصحيح معروف (10 أرقام تبدأ بـ 1 أو 2) والرسالة لا تقترحه.
N5 — عيب، 4.1.3 Status Messages (AA): الخطأ الذي يظهر دون نقل التركيز يجب أن يصل إلى التقنيات المساعدة عبر دور (Role) أو منطقة حيّة (Live region)، و<div> عادي يُنشأ في تلك اللحظة لا يعطي NVDA شيئاً يعلنه. N6 — عيب، 3.2.2 On Input (A): تغيير قيمة قائمة يجب ألا يسبب تغييراً غير متوقع في السياق، وهنا يرسل مستخدم لوحة المفاتيح الذي يتنقّل بين المواعيد بالأسهم الخطوةَ عند أول ضغطة. N7 — ليس عيباً. الدفع معاملة مالية، فينطبق 3.3.4 Error Prevention (Legal, Financial, Data) (AA)، وهو مستوفى مرتين: يستطيع المستخدم مراجعة كل شيء وتصحيحه وتأكيده قبل الدفع، ويمكن إلغاء الطلب خلال 24 ساعة؛ وكان يكفي أحدهما. وتبقى شاشة المراجعة هذه ضمن جولتي لوحة المفاتيح وقارئ الشاشة.
عناوين تقارير الأخطاء، وأولها الأربعة التي قد توقف فئة من المستخدمين: (1) «الخطوة 1، رمز OTP: لصق الرمز المكوّن من 6 أرقام من رسالة SMS يملأ الخانة الأولى فقط من ست خانات (3.3.8)». (2) «الخطوة 2: حقل الاسم الكامل بلا اسم قابل للوصول — قارئ الشاشة يعلن حقل تحرير بلا اسم (1.3.1، 4.1.2)». (3) «الخطوة 2: الإرسال الفارغ يُظهر إطارات حمراء فقط — لا نص للخطأ ولا إعلان (1.4.1، 3.3.1)». (4) «الخطوة 3: قائمة موعد التركيب ترسل الخطوة عند التغيير — مستخدم لوحة المفاتيح لا يستطيع اختيار الموعد الذي يريده (3.2.2)». ثم: (5) «الخطوة 2: الاسم البرمجي لزر ‹التالي› هو ‹إرسال النموذج› — نطق الكلمة المرئية لا يفعّل الزر (2.5.3)». (6) «الخطوة 2: يجب كتابة رقم الجوال مجدداً رغم التحقق منه في الخطوة 1، وتسميته نص نائب فقط (3.3.7، 3.3.2)». (7) «الخطوة 2: قوائم تاريخ الميلاد غير مجمّعة — قارئ الشاشة يعلن ‹اليوم› دون ‹تاريخ الميلاد› (1.3.1)». (8) «الخطوة 2: حقل البريد عليه autocomplete="off"، وحقل الجوال وقوائم تاريخ الميلاد بلا قيم autocomplete (1.3.5)». (9) «الخطوة 2: خطأ رقم الهوية يقول ‹إدخال غير صالح› فقط دون اقتراح الصيغة المتوقعة (3.3.3)». (10) «الخطوة 2: رسالة ‹هذا البريد الإلكتروني مسجّل مسبقاً› لا تُعلن لقارئ الشاشة (4.1.3)».
لماذا هذه الأربعة: N1 يوقف عند الخطوة الأولى من لا يستطيع نسخ رمز بدقة، فلا يصل إلى بقية الطلب أصلاً. ولمستخدمي قارئ الشاشة، يعني حقل الاسم الكامل بلا اسم مع أخطاء معروضة باللون وحده أنهم لا يعرفون ماذا يكتبون ولا لماذا رُفضت الخطوة. ومستخدمو لوحة المفاتيح على Windows لا يستطيعون اختيار أي موعد غير الموعد التالي، إلا إن صادف أن فتحوا القائمة أولاً بالضغط على Alt مع السهم للأسفل. أما الستة الأخرى فتجعل الطلب أبطأ أو أصعب دون أن توقفه؛ فمستخدم التحكم الصوتي مثلاً يستطيع الوصول إلى الزر بأوامر أخرى أبطأ. والتقسيم المختلف مقبول إن سُجّل سببه؛ فبعض الفرق تعدّ عيب Label in Name موقفاً لمستخدمي التحكم الصوتي.
الإصلاحات. الاسم الكامل: <label for="name">الاسم الكامل</label> بدلاً من <span>. البريد الإلكتروني: autocomplete="email". الجوال: احذف الحقل من الخطوة 2 واعرض الرقم المُتحقَّق منه نصاً مع رابط للعودة إلى الخطوة 1، أو املأه مسبقاً مع <label> مرئي وautocomplete="tel". تاريخ الميلاد: ضع القوائم الثلاث داخل <fieldset> مع <legend>تاريخ الميلاد</legend>، وأضف autocomplete="bday-day" و"bday-month" و"bday-year". التالي: احذف aria-label ليصبح الاسم هو الكلمة المرئية. الخطوة 1: حقل واحد للرمز بتسمية مرئية مع inputmode="numeric" وautocomplete="one-time-code"، أو معالج لصق يوزّع الأرقام الستة على الخانات.
الأخطاء: عند ضغط «التالي» أعطِ كل حقل غير صالح رسالة نصية تسمّيه («أدخل اسمك الكامل»)، واربطها به عبر aria-describedby، واضبط aria-invalid="true"؛ ثم انقل التركيز إلى ملخّص أخطاء في الأعلى يربط كل بند بحقله، أو إلى أول حقل خاطئ. ويمكن أن يبقى الإطار الأحمر إشارةً إضافية. وتصبح رسالة الهوية: «أدخل الرقم المكوّن من 10 أرقام الذي يبدأ بـ 1 (الهوية الوطنية) أو 2 (الإقامة)». ولفحص البريد ضع في الصفحة عند تحميلها حاوية فارغة عليها role="status" (أو role="alert" إن عدّ الفريق الرسالة عاجلة)، وأدرج النص فيها، واربطها بالحقل عبر aria-describedby. موعد التركيب: تغيير القائمة يغيّر القيمة فقط، وتُرسل الخطوة بزر «التالي» الخاص بها. أما تنبيه المستخدم إلى هذا السلوك قبل القائمة فيستوفي نص المعيار 3.2.2، لكنه لا يحل مشكلة مستخدم لوحة المفاتيح.
اختبار التأكيد على البناء المُصلَح يكرر كل فحص فشل: لوحة إمكانية الوصول تعرض «الاسم الكامل» والمجموعة «تاريخ الميلاد» والزر «التالي»؛ والملء التلقائي في المتصفح يملأ البريد وتاريخ الميلاد؛ والخطوة 2 لم تعد تُلزم المستخدم بكتابة رقم الجوال مجدداً؛ ولصق رمز كامل من 6 أرقام يملأ الأرقام كلها ويُقبل الرمز؛ والإرسال الفارغ ورقم هوية من 9 أرقام يعطيان رسائل نصية يعلنها NVDA ويُفهم معناها دون اللون؛ ورسالة «مسجّل مسبقاً» تُعلن مرة واحدة دون نقل التركيز؛ والسهم للأسفل على قائمة المواعيد يغيّر الموعد ويبقى في الخطوة 3. واختبار الانحدار: جولة بلوحة المفاتيح وجولة بقارئ الشاشة عبر الخطوات الأربع، لأن التسميات وإدارة التركيز والتحقق من المدخلات تغيّرت، مع فحص أن الخطوة 4 ما زالت تعرض القيم الصحيحة.
إن اختلفت قائمتك فراجع كل بند مقابل نص المعيار ومستواه. تقرير العيب يسمّي العنصر والإخفاق الملحوظ والمعيار؛ وما هو ممارسة جيدة فقط (N2) أو مطابق أصلاً (رقم الهوية بلا قيمة autocomplete، وN7) يُسجَّل توصيةً أو نجاحاً، لا عيباً.
تقدّمك في هذا الموضوع
سجّل الدخول لتتابع تقدّمك
علّم الموضوعات مكتملة، وتابع من حيث توقفت، وافتح امتحانات التخصص.
جزء من مسار تعلم ضمان الجودة
قبل هذا الموضوع
الموضوعات التالية
الأدوات المذكورة في هذا الدليل
افحص HTML بحثاً عن مشكلات إمكانية الوصول الشائعة — نص بديل مفقود، وحقول بلا تسميات، وأزرار وروابط بلا أسماء، وأخطاء ARIA، والعناوين، والتباين — مربوطة بمعايير WCAG 2.2.
ولّد حالات اختبار للتحقق من حقول النماذج: الإلزامية والصيغة والطول والنطاق والنمط والقواعد المشتركة بين الحقول.
ولّد حالات اختبار سلبية لحقول النماذج وواجهات API: قيم فارغة وnull ونوع خاطئ وطول زائد وحقن وصيغة غير صالحة.
ولّد حمولات أخطاء تحقق على مستوى الحقل للنماذج وواجهات API، بالجملة، لاختبار حالات الخطأ في واجهة المستخدم.
ولّد سجلات مستخدمين وهمية (الاسم واسم المستخدم والبريد الإلكتروني وكلمة المرور وبذرة الصورة الرمزية والدور) لحسابات الاختبار.
ولّد أسماء أولى وأسماء عائلات عشوائية بالإنجليزية والعربية والهندية مع خيارات الجنس والصيغة.
ولّد قائمة تحقق QA مخصّصة (وظيفية وواجهة مستخدم وAPI وأمان وأداء وإمكانية وصول وإصدار) لأي ميزة باستخدام الذكاء الاصطناعي من متقن.
ولّد عناوين أخطاء واضحة وقابلة للبحث من وصف غير مرتّب باستخدام الذكاء الاصطناعي من متقن.