🔧

قوة اختبار إمكانية الوصول

يجري عمليات تدقيق امتثال WCAG ومعالجة إمكانية الوصول لتطبيقات الويب.

💻 البرمجةمتوسط

البرومبت

---
name: accessibility-testing-superpower
description: |
  يقوم بإجراء تدقيقات الامتثال لمعايير WCAG ومعالجة مشاكل الوصول لتطبيقات الويب.
  استخدمه عندما: 1) تدقيق واجهة المستخدم للامتثال لمعايير WCAG 2.1/2.2 2) إصلاح مشاكل قارئ الشاشة أو التنقل بلوحة المفاتيح 3) تطبيق أنماط ARIA بشكل صحيح 4) مراجعة تباين الألوان وإمكانية الوصول البصري 5) إنشاء نماذج أو مكونات تفاعلية يمكن الوصول إليها.
---

# سير عمل اختبار إمكانية الوصول

## التكوين

- **مستوى WCAG**: ${wcag_level:AA}
- **المكون قيد الاختبار**: ${component_name:Page}
- **معيار الامتثال**: ${compliance_standard:WCAG 2.1}
- **الحد الأدنى لدرجة Lighthouse**: ${lighthouse_score:90}
- **قارئ الشاشة الأساسي**: ${screen_reader:NVDA}
- **إطار عمل الاختبار**: ${test_framework:jest-axe}

## شجرة قرار التدقيق

```
تم استلام طلب إمكانية الوصول
|
+-- مكون/صفحة جديدة؟
|   +-- قم بتشغيل الفحص الآلي أولاً (axe-core, Lighthouse)
|   +-- اختبار التنقل بلوحة المفاتيح
|   +-- التحقق من إعلانات قارئ الشاشة
|   +-- التحقق من تباين الألوان
|
+-- انتهاك موجود للإصلاح؟
|   +-- تحديد معيار نجاح WCAG
|   +-- التحقق مما إذا كان HTML الدلالي يحل المشكلة
|   +-- تطبيق ARIA فقط عندما يكون HTML غير كافٍ
|   +-- التحقق من الإصلاح باستخدام التقنيات المساعدة
|
+-- تدقيق الامتثال؟
    +-- فحص آلي (يكشف حوالي 30% من المشاكل)
    +-- قائمة تحقق الاختبار اليدوي
    +-- توثيق الانتهاكات حسب الخطورة
    +-- إنشاء خارطة طريق للمعالجة
```

## مرجع WCAG السريع

### تصنيف الخطورة

| الخطورة | التأثير | أمثلة | الجدول الزمني للإصلاح |
|----------|--------|----------|--------------|
| حرج | يمنع الوصول بالكامل | لا يوجد تركيز بلوحة المفاتيح، أزرار فارغة، alt مفقود على الصور الوظيفية | فوري |
| خطير | حواجز رئيسية | تباين ضعيف، تسميات نماذج مفقودة، لا توجد روابط تخطي | خلال السبرنت |
| معتدل | صعب ولكن قابل للاستخدام | تنقل غير متناسق، رسائل خطأ غير واضحة | الإصدار التالي |
| ثانوي | إزعاج | نص بديل زائد عن الحاجة، مشاكل طفيفة في ترتيب العناوين | قائمة المهام المتأخرة |

### الانتهاكات الشائعة والإصلاحات

**اسم يمكن الوصول إليه مفقود**
```html
<!-- انتهاك -->
<button><svg>...</svg></button>

<!-- إصلاح: aria-label -->
<button aria-label="Close dialog"><svg>...</svg></button>

<!-- إصلاح: نص مخفي بصريًا -->
<button><span class="sr-only">Close dialog</span><svg>...</svg></button>
```

**ربط تسمية النموذج**
```html
<!-- انتهاك -->
<label>Email</label>
<input type="email">

<!-- إصلاح: ربط صريح -->
<label for="email">Email</label>
<input type="email" id="email">

<!-- إصلاح: ربط ضمني -->
<label>Email <input type="email"></label>
```

**فشل تباين الألوان**
```
الحد الأدنى للنسب (WCAG ${wcag_level:AA}):
- النص العادي (<${large_text_size:18}px أو <${bold_text_size:14}px غامق): ${contrast_ratio_normal:4.5}:1
- النص الكبير (>=${large_text_size:18}px أو >=${bold_text_size:14}px غامق): ${contrast_ratio_large:3}:1
- مكونات واجهة المستخدم والرسومات: 3:1

الأدوات: WebAIM Contrast Checker، أدوات مطوري المتصفح
```

**رؤية التركيز**
```css
/* لا تفعل هذا أبدًا بدون بديل */
:focus { outline: none; }

/* تركيز مخصص صحيح */
:focus-visible {
  outline: ${focus_outline_width:2}px solid ${focus_outline_color:#005fcc};
  outline-offset: ${focus_outline_offset:2}px;
}
```

## إطار عمل قرار ARIA

```
هل تحتاج إلى نقل معلومات إلى التقنيات المساعدة؟
|
+-- هل يمكن لـ HTML الدلالي القيام بذلك؟
|   +-- نعم: استخدم HTML (<button>, <nav>, <main>, <article>)
|   +-- لا: تابع إلى ARIA
|
+-- ما نوع ARIA المطلوب؟
    +-- الدور: ما هو هذا العنصر؟ (role="dialog", role="tab")
    +-- الحالة: ما هي الحالة؟ (aria-expanded, aria-checked)
    +-- الخاصية: ما هي العلاقة؟ (aria-labelledby, aria-describedby)
    +-- المنطقة الحية: محتوى ديناميكي؟ (aria-live="${aria_live_mode:polite}")
```

### أنماط ARIA للمكونات الشائعة

**الإفصاح (إظهار/إخفاء)**
```html
<button aria-expanded="false" aria-controls="content-1">
  Show details
</button>
<div id="content-1" hidden>
  Content here
</div>
```

**واجهة التبويبات**
```html
<div role="tablist" aria-label="${component_name:Settings}">
  <button role="tab" aria-selected="true" aria-controls="panel-1" id="tab-1">
    General
  </button>
  <button role="tab" aria-selected="false" aria-controls="panel-2" id="tab-2" tabindex="-1">
    Privacy
  </button>
</div>
<div role="tabpanel" id="panel-1" aria-labelledby="tab-1">...</div>
<div role="tabpanel" id="panel-2" aria-labelledby="tab-2" hidden>...</div>
```

**مربع حوار مشروط (Modal dialog)**
```html
<div role="dialog" aria-modal="true" aria-labelledby="dialog-title">
  <h2 id="dialog-title">Confirm action</h2>
  <p>Are you sure you want to proceed?</p>
  <button>Cancel</button>
  <button>Confirm</button>
</div>
```

## قائمة تحقق التنقل بلوحة المفاتيح

```
[ ] جميع العناصر التفاعلية قابلة للتركيز باستخدام Tab
[ ] ترتيب التركيز يطابق الترتيب البصري/المنطقي
[ ] التركيز مرئي على جميع العناصر
[ ] لا توجد مصائد لوحة مفاتيح (يمكن دائمًا الخروج باستخدام Tab)
[ ] رابط التخطي كأول عنصر قابل للتركيز
[ ] Escape يغلق النوافذ المنبثقة/القوائم المنسدلة
[ ] مفاتيح الأسهم تتنقل داخل المكونات (التبويبات، القوائم، الشبكات)
[ ] Enter/Space ينشط الأزرار والروابط
[ ] الاختصارات المخصصة موثقة وقابلة للتكوين
```

### أنماط إدارة التركيز

**مصيدة تركيز النافذة المنبثقة (Modal focus trap)**
```javascript
// عند فتح النافذة المنبثقة:
// 1. حفظ العنصر الذي كان مركزًا عليه سابقًا
// 2. نقل التركيز إلى أول عنصر قابل للتركيز في النافذة المنبثقة
// 3. حصر Tab داخل حدود النافذة المنبثقة

// عند إغلاق النافذة المنبثقة:
// 1. إعادة التركيز إلى العنصر المحفوظ
```

**محتوى ديناميكي**
```javascript
// بعد إضافة المحتوى:
// - الإعلان عبر منطقة aria-live، أو
// - نقل التركيز إلى عنوان المحتوى الجديد

// بعد إزالة المحتوى:
// - نقل التركيز إلى العنصر المنطقي التالي
// - لا تترك التركيز أبدًا على العنصر الذي تم إزالته
```

## اختبار قارئ الشاشة

### التحقق من الإعلان

| العنصر | يجب أن يعلن |
|---------|-----------------|
| زر | الدور + الاسم + الحالة ("زر إرسال") |
| رابط | الاسم + "رابط" ("رابط الصفحة الرئيسية") |
| صورة | نص بديل أو "تزييني" (تخطي) |
| عنوان | المستوى + النص ("عنوان المستوى 2، حولنا") |
| حقل نموذج | التسمية + النوع + الحالة + التعليمات |
| خطأ | رسالة الخطأ + ارتباط الحقل |

### أوامر الاختبار (مرجع سريع)

**VoiceOver (macOS)**
- VO = Ctrl + Option
- VO + A: قراءة الكل
- VO + يمين/يسار: التنقل بين العناصر
- VO + Cmd + H: العنوان التالي
- VO + Cmd + J: عنصر التحكم التالي في النموذج

**${screen_reader:NVDA} (Windows)**
- NVDA + أسفل: قراءة الكل
- Tab: العنصر القابل للتركيز التالي
- H: العنوان التالي
- F: حقل النموذج التالي
- B: الزر التالي

## تكامل الاختبار الآلي

### axe-core في الاختبارات
```javascript
// ${test_framework:jest-axe}
import { axe, toHaveNoViolations } from 'jest-axe';
expect.extend(toHaveNoViolations);

test('${component_name:component} is accessible', async () => {
  const { container } = render(<${component_name:MyComponent} />);
  const results = await axe(container);
  expect(results).toHaveNoViolations();
});
```

### عتبة Lighthouse CI
```javascript
// lighthouserc.js
module.exports = {
  assertions: {
    'categories:accessibility': ['error', { minScore: ${lighthouse_score:90} / 100 }],
  },
};
```

## مصفوفة أولوية المعالجة

```
التأثير مقابل الجهد:
                    جهد منخفض    جهد عالٍ
تأثير عالٍ     |   افعل أولاً   |   خطط لاحقًا   |
                |   نص بديل    |   إعادة تصميم    |
                |   تسميات     |   إعادة بناء التنقل |
----------------|--------------|---------------|
تأثير منخفض      |   فوز سريع  |   قائمة المهام المتأخرة     |
                |   تباين   |   ميزات إضافية|
                |   تعديلات     |   تحسينات|
```

## قائمة تحقق التحقق

قبل اعتبار عمل إمكانية الوصول مكتملًا:

```
الاختبار الآلي:
[ ] تقارير axe-core لا تحتوي على انتهاكات
[ ] إمكانية الوصول في Lighthouse >= ${lighthouse_score:90}
[ ] مدقق HTML يمر (يؤثر على تحليل AT)

اختبار لوحة المفاتيح:
[ ] إكمال المهمة بالكامل بدون ماوس
[ ] تركيز مرئي في جميع الأوقات
[ ] ترتيب Tab منطقي
[ ] لا توجد مصائد

اختبار قارئ الشاشة:
[ ] تم الاختبار باستخدام قارئ شاشة واحد على الأقل (${screen_reader:NVDA})
[ ] جميع المحتويات معلنة بشكل صحيح
[ ] العناصر التفاعلية لها أدوار/حالات
[ ] التحديثات الديناميكية معلنة

الاختبار البصري:
[ ] تم التحقق من نسب التباين (الحد الأدنى ${contrast_ratio_normal:4.5}:1)
[ ] يعمل عند تكبير ${zoom_level:200}%
[ ] لا توجد معلومات يتم نقلها باللون وحده
[ ] يحترم prefers-reduced-motion

اضغط لعرض البرومبت الكامل

#إمكانية الوصول#WCAG#تطوير الويب#تدقيق#معالجة

برومبتات ذات صلة