اختبار الروابط والتنقل
اختبار التنقل (Navigation testing) يتحقق من أن الناس يستطيعون التنقل في الموقع والوصول إلى حيث يتوقعون: الروابط تقود إلى المكان الصحيح، والقوائم ومسار التنقل (Breadcrumb) تُظهر أين يقف المستخدم، وزر الرجوع (Back) يعيده إلى العرض السابق، وعنوان URL الملصوق في علامة تبويب جديدة يفتح الصفحة نفسها، والعنوان المكتوب خطأً ينتهي بصفحة «غير موجودة» مفيدة.
ففي صفحة منتج مثلاً، يجب أن ينقلك رابط «التوصيل» إلى قسم التوصيل، وأن يعيدك زر الرجوع إلى الصفحة 2 من النتائج مع بقاء عوامل التصفية.
لماذا يهم
الرابط المعطّل في صفحة الدفع يوقف المستخدم حين يحتاج إلى الخطوة التالية، وزر الرجوع الذي يُضيّع بحثاً مُصفّى يجبره على البدء من جديد، والرابط المُشارَك الذي يفتح الصفحة الرئيسية بدل المنتج يُضيّع الزيارة. ونادراً ما يلاحظ المطورون ذلك: فهم ينقرون إلى الأمام من الصفحة الرئيسية، وقلّما يلصقون العناوين أو يعيدون التحميل أو يرجعون.
والروابط تتعطل أيضاً دون أن يعدّل أحد الصفحة: يُحذف منتج، أو تُعاد تسمية قسم. لذلك فالتنقل خطر انحدار (Regression) في كل إصدار، وعيوبه سهلة الإبلاغ: صفحة واحدة، ورابط واحد، ووجهة خاطئة واحدة.
ما الذي تفحصه في كل رابط
يعمل الرابط، أي العنصر <a href> من درس HTML للمختبِرين، حين تكون وجهته موجودة، ومطابقة لنصه، ويُفتح كما قرر الفريق:
- الوجهة: رابط «سياسة الإرجاع» الذي يفتح مركز المساعدة العام عيب، مع أنه لا يظهر أي خطأ.
- نص الرابط: عشرة روابط «اقرأ المزيد» لا يمكن التمييز بينها في قائمة الروابط لدى قارئ الشاشة. ويشترط معيار النجاح 2.4.4 «غرض الرابط (ضمن السياق)» (Link Purpose (In Context)) في WCAG 2.2 أن يتضح الغرض من النص وسياقه.
- طريقة الفتح (Target): السمة
target="_blank"تفتح علامة تبويب جديدة لا يعمل فيها زر الرجوع. افحص قاعدة الفريق (غالباً: المواقع الخارجية والمستندات فقط)، وتأكد أن هذه الروابط تذكر ذلك. - الروابط داخل الصفحة (Anchors): الرابط
#deliveryينقل إلىid="delivery". والمطابقة حرفية (فالرابط#Deliveryلا يجد شيئاً)، والوجهة المفقودة تفشل بصمت، بلا خطأ ولا تمرير. ويجب ألا تغطي الترويسة الثابتة (Sticky header) عنوان القسم. - المخططات (Schemes):
mailto:وtel:يفتحان تطبيق البريد أو الهاتف بالعنوان أو الرقم الصحيح. - البيئات والترميز: لا يشير أي رابط إلى
localhostأو إلى بيئة أخرى، والمسار العربي المرمَّز بترميز النسبة المئوية (Percent-encoding)، حيث%D8%B9هو «ع»، يعمل عند النقر عليه وعند لصقه.
الروابط المعطّلة ورموز الحالة ونظرة أولى على إعادة التوجيه
رمز حالة HTTP الذي يعيده عنوان الرابط، كما يظهر في لوحة Network ضمن أدوات المطور (DevTools) أو في أداة لفحص الروابط، يُظهر إن كان معطّلاً. 200 OK: وُجدت الصفحة. 404 Not Found: لم توجد. 410 Gone: أُزيلت عمداً (RFC 9110). أما رمز 5xx أو انتهاء المهلة فإخفاق في الخادم أو الشبكة لا رابط خاطئ: أعد المحاولة، ثم أبلغ عنه مع الوقت وعنوان URL.
ورمز الحالة وحده لا يكفي: فصفحة «غير موجودة» تعيد 200، وتُسمّى Soft 404، تمرّ من أداة فحص الروابط البسيطة مع أن محركات البحث تعاملها كخطأ. والجزء #fragment لا يصل إلى الخادم أبداً، فالمتصفح وحده يُظهر إن كان الرابط داخل الصفحة يعمل.
وإعادة التوجيه (Redirect) استجابة من الفئة 3xx تحمل ترويسة Location فيها عنوان آخر يطلبه المتصفح بعد ذلك. ويعرّف RFC 9110 الرمزين 301 Moved Permanently و308 Permanent Redirect للانتقال الدائم، و302 Found و307 Temporary Redirect للانتقال المؤقت، ويُظهر خيار Preserve log في لوحة Network كل قفزة. ويتعمق درس إعادة التوجيه في HTTP أكثر؛ أما هنا فتأكد مما يلي:
- العناوين القديمة من الإشارات المرجعية ونتائج البحث تصل إلى الصفحة الجديدة المطابقة، لا إلى الصفحة الرئيسية.
- قفزة واحدة، بلا سلسلة ولا حلقة (فالحلقة تنتهي بخطأ «too many redirects»).
- سلسلة الاستعلام (Query string) مثل
?page=2&sort=priceتبقى. - روابط صفحاتك تشير مباشرةً إلى العنوان النهائي؛ فالتتبع أدناه يعمل لكنه يهدر قفزتين.
GET http://shop.example.com/help/returns
301 Moved Permanently Location: https://shop.example.com/help/returns
GET https://shop.example.com/help/returns
301 Moved Permanently Location: https://shop.example.com/help/returns/
GET https://shop.example.com/help/returns/
200 OK page title: "Returns and refunds"href في الرابط؟الإجابة: جزء
#fragmentفي الصفحةالنتيجة: رابط داخل الصفحة: افحصه في المتصفحالجزء لا يصل إلى الخادم أبداً. يجب أن يوجد عنصر لهidمطابق تماماً، وأن تنتقل الصفحة إليه دون أن تغطيه ترويسة ثابتة.الإجابة: صفحة في هذا الموقع أو في موقع آخر
سؤال 2: ما رمز الحالة الذي يعيده عنوان URL؟الإجابة:
200سؤال 3: هل هي الصفحة التي يعد بها نص الرابط؟الإجابة: نعم
النتيجة: رابط سليموتأكد أيضاً أنه يُفتح في علامة التبويب التي اتفق عليها الفريق.نجاحالإجابة: لا
النتيجة: وجهة خاطئة أو Soft 404الرمز200مع رسالة «غير موجودة» أو صفحة لا علاقة لها يبقى عيباً.فشل
الإجابة:
301أو302أو307أو308النتيجة: إعادة توجيه: تتبّع كل قفزةمقبولة إن انتهت بالرمز200في الصفحة المطابقة، ويُفضَّل في قفزة واحدة. واجعل روابطك تشير إلى العنوان النهائي.تنبيهالإجابة:
404أو410النتيجة: رابط معطّلأبلغ عنه مع الصفحة المصدر ونص الرابط وقيمةhrefورمز الحالة.فشلالإجابة:
5xxأو لا استجابةالنتيجة: خطأ في الخادم أو الشبكةقد يكون الرابط صحيحاً. أعد المحاولة، ثم أبلغ عن خطأ في الخادم مع الوقت وعنوان URL.تنبيه
الإجابة:
mailto:أوtel:النتيجة: يفتح تطبيق البريد أو الهاتفبالعنوان أو الرقم الصحيح معبّأً مسبقاً.
بعد إعادة التوجيه احكم على الاستجابة النهائية بالطريقة نفسها: رمز حالتها أولاً ثم محتواها.
مثال تطبيقي: فئة أُعيدت تسميتها في إصدار
ملاحظة الإصدار: «تصبح فئة الهواتف (Phones) فئة الجوالات (Mobiles). تنتقل العناوين من /phones/... إلى /mobiles/...، ويُعاد توجيه العناوين القديمة توجيهاً دائماً». وهذه فحوص المختبِر؛ وقد فشلت الحالة NAV-03 على Staging كما يسجّل تقرير الخطأ.
- NAV-01: بند القائمة «الجوالات» يفتح
/mobilesويكون مميَّزاً فيها. - NAV-02:
/phones←301←/mobiles←200، في قفزة واحدة. - NAV-03:
/phones/nova-12←301←/mobiles/nova-12، أي المنتج نفسه لا الفئة. - NAV-04:
/phones?page=2← الصفحة 2 من الجوالات. - NAV-05: مسار التنقل في صفحة Nova 12 هو «الرئيسية › الجوالات › Nova 12»، وروابطه تعمل.
- NAV-06: صفِّ بحثاً، وانتقل إلى الصفحة 2، وافتح منتجاً، ثم اضغط زر الرجوع ← الصفحة 2 مع بقاء عامل التصفية.
- NAV-07: العنوان
/mobiles/nova-12في نافذة خاصة يفتح المنتج، و/mobiles/no-such-phoneيعيد404.
Title: عناوين المنتجات القديمة يُعاد توجيهها إلى فئة الجوالات بدلاً من المنتج
URL: https://staging.shop.example.com/phones/nova-12
Build: web 3.8.0 on staging
Actual: 301 -> /mobiles -> 200 (صفحة الفئة)
Expected: 301 -> /mobiles/nova-12 -> 200 (صفحة المنتج Nova 12)
Impact: الإشارات المرجعية والروابط المشارَكة ونتائج البحث لكل منتجأخطاء شائعة
- التأكد من أن الرابط لا يعيد خطأً، دون التحقق من أنه يفتح الصفحة التي يعد بها نصه.
- الثقة بالرمز
200: فصفحة Soft 404 تنجح في كل فحص لرمز الحالة. - اختبار التنقل بالنقر من الصفحة الرئيسية فقط، دون لصق عنوان URL أو إعادة التحميل أو الضغط على زر الرجوع.
- افتراض أن الروابط داخل الصفحة تعمل لأن الصفحة تُحمَّل؛ فالمتصفح وحده يُظهر إن كان
#sectionيجد وجهته. - الإبلاغ عن «رابط معطّل» دون ذكر صفحته ونصه وقيمة
hrefورمز الحالة. - فحص الروابط مرة واحدة، مع أن المحتوى المحذوف والمواقع الخارجية تعطّلها لاحقاً.
من منظور ضمان الجودة
تبدأ فحوص التنقل حين تضيف قصة مستخدم صفحة أو تنقلها: اسأل أين تظهر في القوائم، وما عنوان URL الخاص بها، وهل يجب أن يُعاد توجيه عنوان قديم وإلى أين، وما الذي يربط بها. فتغيير العنوان دون خطة لإعادة التوجيه فجوة في المتطلبات؛ اطرحها قبل الإصدار.
احتفظ بقائمة فحص قصيرة للتنقل في اختبار الانحدار (القوائم، ومسار التنقل، والرجوع من النتائج، ورابط عميق دون تسجيل دخول، وصفحة 404)، واترك مئات الروابط لفحص آلي. وأبلغ عن الرابط المعطّل مع صفحته المصدر ونصه وقيمة href ورمز الحالة والعنوان النهائي، ومع قائمة القفزات في إعادة التوجيه.
تمرين عملي
خطّط اختبارات التنقل لمركز مساعدة نُقل
تنقل شركة مركز المساعدة من /support/... إلى /help/...، وتضيف مسار تنقل وبنداً في القائمة باسم «المساعدة». تقول ملاحظة الإصدار: «يُعاد توجيه عناوين الدعم القديمة إلى الجديدة. وفي كل مقالة جدول محتويات يربط بأقسامها». اكتب ثمانية فحوص للتنقل على الأقل مع نتائجها المتوقعة.
ثم اقرأ تتبع Staging أدناه: أيّ فحوصك يجيب عنها، وماذا ستُبلغ؟
Link on page: https://example.com/support/returns#refund-time
GET https://example.com/support/returns
302 Found Location: https://example.com/help
GET https://example.com/help
200 OK page title: "Help centre"- اكتب روابط القوائم ومسار التنقل والمحتوى التي يمسّها التغيير.
- أضف فحوص إعادة التوجيه للعناوين القديمة وسلاسل الاستعلام والأجزاء (Fragments).
- أضف فحوصاً للرجوع ولرابط عميق ولصفحة 404.
- قارن التتبع بنتائجك المتوقعة.
إظهار الإجابة النموذجية
فحوص على سبيل المثال: بند «المساعدة» يفتح /help ويكون مميَّزاً فيها؛ ومسار التنقل في المقالة «الرئيسية › المساعدة › الإرجاع» وروابطه تعمل؛ وروابط جدول المحتويات تنقل إلى أقسامها؛ والعناوين القديمة يُعاد توجيهها في قفزة واحدة إلى المقالة المطابقة وتحتفظ بالجزء #section؛ وعنوان بحث قديم مثل /support/search?q=refund يحتفظ بسلسلة الاستعلام؛ وروابط المقالات تشير مباشرةً إلى /help/...؛ وعنوان المقالة يفتحها في نافذة خاصة؛ والرجوع يعيد إلى نتائج البحث؛ و/help/no-such-article يعيد 404.
التتبع يحقق توقعاً واحداً، هو القفزة الواحدة، ويُخلّ بثلاثة: 302 Found إعادة توجيه مؤقتة لانتقال دائم (المتوقع 301 أو 308؛ أكّد ذلك مع الفريق)؛ وينتهي في الصفحة الرئيسية للمساعدة لا في /help/returns؛ ولأن المتصفح يحتفظ بالجزء حين لا يحمل Location جزءاً (RFC 9110)، يصل المستخدم إلى /help#refund-time، وهو قسم غير موجود هناك.
التقرير: «عناوين مقالات الدعم القديمة يُعاد توجيهها مؤقتاً إلى الصفحة الرئيسية للمساعدة بدلاً من المقالة»، مع الرابط المصدر والقفزات، والمتوقع 301 ← /help/returns ← 200، والأثر على الإشارات المرجعية ونتائج البحث. والتتبع يجيب عن فحوص إعادة التوجيه وحدها؛ أما البقية فتحتاج إلى المتصفح.
أسئلة شائعة
ما الفرق بين الرابط المعطّل والرابط المعطّل داخل الصفحة؟
الرابط المعطّل يشير إلى عنوان URL لا يستطيع الخادم تقديمه، ويُظهر ذلك رمز الحالة (404 أو 410). أما الرابط المعطّل داخل الصفحة فيشير إلى #fragment لا يقابله id في الصفحة: تُحمَّل الصفحة بالرمز 200 ولا يحدث تمرير فحسب، فلا تكتشفه إلا في المتصفح.
هل إعادة التوجيه عيب؟
لا. إعادة التوجيه هي الطريقة الصحيحة لإبقاء العناوين القديمة عاملة بعد النقل. وتصبح عيباً حين تقود إلى صفحة خاطئة، أو تستخدم رمزاً مؤقتاً لانتقال دائم، أو تمر بسلسلة من القفزات أو بحلقة. ومع ذلك يجب أن تشير روابط صفحاتك إلى العنوان النهائي.
هل يجب أن يُفتح كل رابط في علامة تبويب جديدة؟
لا. الافتراضي، أي علامة التبويب نفسها، يُبقي زر الرجوع عاملاً ويترك للمستخدم أن يفتح علامة تبويب جديدة بنفسه. وعادةً تخصص الفرق علامات التبويب الجديدة لحالات مثل المواقع الخارجية أو مستند يُفتح أثناء ملء نموذج، ويجب أن يذكر هذا الرابط أنه يفتح علامة تبويب جديدة. افحص وفق قاعدة الفريق لا وفق تفضيلك.
هل يمكن أتمتة فحص الروابط؟
نعم، ويجب ذلك في المواقع الكبيرة: فأداة زحف (Crawler) أو سكربت اختبار يستطيع طلب كل رابط والإبلاغ عن رموز الحالة. لكنه لا يحكم على مطابقة الوجهة لنص الرابط، ولا يكتشف صفحات Soft 404 بشكل موثوق، ولا يختبر الرجوع والروابط العميقة في سياقها، فأبقِ جولة يدوية قصيرة لهذه.
المراجع
- RFC 9110: HTTP Semanticsمعاني أساليب HTTP وحقول الترويسات ورموز الحالة والتفاوض على المحتوى، بغضّ النظر عن إصدار البروتوكول.
- HTML Living Standardلغة HTML، بما فيها مراجع المحارف المسماة (الكيانات) وقواعد التحليل التي تتبعها المتصفحات.
- Web Content Accessibility Guidelines (WCAG) 2.2توصية W3C التي تحدد معايير النجاح القابلة للاختبار لإتاحة محتوى الويب، مرتّبةً تحت أربعة مبادئ وثلاثة مستويات مطابقة (A وAA وAAA).
- Accessible Rich Internet Applications (WAI-ARIA) 1.2توصية W3C التي تعرّف أدوار ARIA وحالاتها وخصائصها — أي كيف تُعلن عناصر الواجهة المخصّصة معناها للتقنيات المساعدة.
تدرّب بأدوات متقن
تتبّع سلاسل إعادة التوجيه (301/302/307/308) وعرض كل قفزة وحالتها وعنوان URL النهائي.
ابحث عن أي رمز حالة HTTP لمعرفة معناه ومرجعه في RFC ومتى يُستخدم.
تفكيك عنوان URL إلى البروتوكول والمضيف والمنفذ والمسار ومعاملات الاستعلام والجزء (fragment) وبيانات الاعتماد.
فكّ ترميز عناوين URL وسلاسل الاستعلام المرمَّزة بالنسبة المئوية وإعادتها إلى نص مقروء.
تحليل سلاسل الاستعلام وبناؤها، بما في ذلك المفاتيح المكرّرة وترميز المصفوفات بالأقواس المربعة.
للتعمّق أكثر
تقدّمك في هذا الموضوع
سجّل الدخول لتتابع تقدّمك
علّم الموضوعات مكتملة، وتابع من حيث توقفت، وافتح امتحانات التخصص.