أدوات المطوّرين في المتصفح للمختبِرين
أدوات المطوّرين (DevTools) لوحات مدمجة في كل متصفحات الحاسوب الرئيسية، تُظهر ممّ تتكوّن الصفحة وماذا تفعل: نموذج DOM الحي وأنماطه، ورسائل JavaScript، وطلبات الشبكة، والبيانات المخزّنة، وأين يذهب الوقت. افتحها بالمفتاح F12 أو Ctrl+Shift+I (أو Cmd+Option+I في macOS)، أو انقر بزر الفأرة الأيمن على عنصر واختر «Inspect» (فحص). ولا يُظهرها Safari إلا بعد تفعيل ميزات مطوّري الويب في إعداداته المتقدمة (Advanced).
وبالنسبة إلى المختبِر، تجيب كل لوحة عن سؤال واحد. نموذج الملف الشخصي يعرض «تم حفظ الملف الشخصي»، لكن رقم الهاتف القديم يعود بعد إعادة التحميل. الشاشة لا تخبرك بالسبب؛ أما لوحة الشبكة فتُظهر هل أُرسل طلب، وماذا حمل، وبماذا أجاب الخادم.
لماذا يهم
ما تراه على الشاشة إخفاق (failure)، أما العيب (defect) الذي يسببه ففي شيفرة الصفحة أو في الخادم أو في البيانات. التقرير الذي يقول «الحفظ لا يعمل» يجعل المطوّر يبدأ من الصفر. أما «زر الحفظ يرسل PATCH /api/v1/profile، والخادم يجيب بالرمز 422، والصفحة تعرض رسالة نجاح رغم ذلك» فيخبر الفريق مسبقاً أن الخادم رفض المدخل وأن الصفحة تجاهلت الرفض.
وتكشف أدوات المطوّرين أيضاً إخفاقات تخفيها الواجهة: خطأ في سكربت خلف زر لا يفعل شيئاً، وطلباً يفشل بصمت، وملف تعريف ارتباط (cookie) للجلسة يبقى بعد تسجيل الخروج. ومعرفة السؤال الذي تجيب عنه كل لوحة تحوّل التخمين إلى أدلة.
سؤال واحد لكل لوحة
ست لوحات تغطي معظم عمل الاختبار. يستخدم هذا الدرس أسماءها في Chrome؛ وأدوات المطوّرين في Edge مبنية على شيفرة Chromium نفسها، فتتطابق الأسماء والترتيب في كل موضع تقريباً. ولدى Firefox وSafari الأدوات نفسها، وبعضها بأسماء أخرى: Inspector بدلاً من Elements في Firefox، وStorage بدلاً من Application وResponsive Design Mode بدلاً من شريط أدوات الأجهزة في كليهما. افتح اللوحة التي يطابق سؤالها العَرَض الذي أمامك.
- العناصر (Elements): ما الموجود في الصفحة الآن، ولماذا يبدو هكذا؟
- وحدة التحكم (Console): هل فشلت شيفرة الصفحة، وماذا قالت؟
- الشبكة (Network): ماذا أرسل المتصفح، وبماذا عاد الرد، وكم استغرق؟
- التطبيق (Application): ماذا يخزّن هذا الموقع في متصفحي؟
- الأداء (Performance): أين يذهب الوقت أثناء التحميل أو النقر؟
- شريط أدوات الأجهزة (Device toolbar): كيف يتجاوب التخطيط مع شاشة بحجم الهاتف ومع اللمس؟
| اللوحة | السؤال الذي تجيب عنه | افتحها عندما | الأدلة التي تسجّلها |
|---|---|---|---|
| العناصر (Elements) | ما الموجود في الصفحة الآن، ولماذا يبدو هكذا؟ | عنصر مفقود أو مخفي أو في غير مكانه أو بتنسيق خاطئ | شيفرة العنصر وقاعدة CSS الغالبة |
| وحدة التحكم (Console) | هل فشلت شيفرة الصفحة، وماذا قالت؟ | نقرة لا تفعل شيئاً أو جزء من الصفحة يبقى فارغاً | نص الخطأ بحرفه مع الملف والسطر |
| الشبكة (Network) | ماذا أُرسل، وماذا عاد، وكم استغرق؟ | بيانات لا تُحفظ أو لا تظهر، أو خطوة بطيئة | الطريقة والعنوان والحالة والحمولة والاستجابة والتوقيت |
| التطبيق (Application) | ماذا يخزّن هذا الموقع في متصفحي؟ | سلوك غريب في تسجيل الدخول أو الخروج أو الحالة المحفوظة | أسماء ملفات تعريف الارتباط وسماتها، ومفاتيح التخزين وقيمها |
| الأداء (Performance) | أين يذهب الوقت أثناء التحميل أو النقر؟ | نقرة تستجيب متأخرة أو محتوى يقفز | تسجيل يُظهر المهام الطويلة وإزاحات التخطيط |
| شريط أدوات الأجهزة (Device toolbar) | كيف يتجاوب التخطيط مع شاشة بحجم الهاتف؟ | محتوى يفيض أو عناصر تحكم يصعب لمسها | مقاس منفذ العرض أو الجهاز المختار، ولقطة شاشة |
أسماء اللوحات كما في Chrome، وتطابقها أدوات Edge. ويستخدم Firefox وSafari أسماء أخرى أحياناً: Inspector بدلاً من Elements (في Firefox)، وStorage بدلاً من Application، وResponsive Design Mode بدلاً من شريط أدوات الأجهزة.
العناصر ووحدة التحكم: الصفحة وشيفرتها
تُظهر لوحة العناصر نموذج DOM الحي، كما في درس نموذج DOM. اختر عُقدة فيعرض جزء الأنماط (Styles) قواعد CSS المطبّقة عليها، مع شطب التصريحات التي تغلبها قواعد أخرى؛ وبهذا ترى لماذا يظهر الزر رمادياً أو لماذا يُقصّ نص التسمية. ويعرض جزء إمكانية الوصول (Accessibility) دورها المحسوب واسمها القابل للوصول (accessible name)، أي الاسم الذي يعلنه قارئ الشاشة.
يمكنك تعديل النصوص والأنماط في مكانها لاستقصاء مشكلة، كأن تلصق كلمة عربية طويلة في تسمية لترى هل تفيض عن حدودها. تبقى التعديلات في تبويبك وتختفي عند إعادة التحميل: فهي تدلّك على موضع محتمل للعيب، ولا تثبت أن المنتج يعمل.
وتعرض وحدة التحكم أخطاء JavaScript وتحذيراتها، والموارد التي فشل تحميلها، والرسائل الأمنية، ومعظمها مرتبط بالملف والسطر أو بالعنوان الذي صدر منه. ويمكنك أيضاً كتابة تعبيرات تسأل بها الصفحة، كما في الأمثلة أدناه. ولا تلصق أبداً شيفرة لا تفهمها: فهي تعمل بجلسة تسجيل دخولك. وانتبه إلى حدٍّ واحد: يختصر Chrome قيمة navigator.userAgent إلى الإصدار الرئيسي متبوعاً بـ.0.0.0 وإلى إصدار ثابت لنظام التشغيل، فخذ الإصدار الدقيق للمتصفح من صفحة «About» (حول).
$0 // the element selected in Elements
$0.disabled // is that button disabled right now?
$$('img:not([alt])').length // images without an alt attribute
navigator.userAgent // browser and OS; Chrome gives the major version onlyالشبكة: ماذا أُرسل وماذا عاد
تسجّل لوحة الشبكة كل طلب يحدث ما دامت أدوات المطوّرين مفتوحة، مع رمز حالته ونوعه ومُطلِقه (initiator) وحجمه ومدته. انقر على طلب لترى ترويساته، والحمولة (payload) التي أرسلتها الصفحة، والاستجابة، والتوقيت.
طلب واحد يخبرك أيّ جانب تشكّ فيه. بيانات خاطئة في الطلب: انظر في الصفحة. طلب صحيح واستجابة خاطئة: انظر في الخادم. كلاهما صحيح والشاشة خاطئة: انظر في طريقة تعامل الصفحة مع الاستجابة. والطلب الذي لم يتلقَّ رداً يظهر بالقيمة (failed) بدلاً من رمز الحالة.
افتح اللوحة قبل أن تعيد إنتاج المشكلة، فالطلبات السابقة لا تظهر فيها. ثم استخدم:
- «Preserve log» للإبقاء على القائمة عند انتقال الصفحة، كما بعد إرسال نموذج.
- «Disable cache» لتتجاوز الطلبات ذاكرة HTTP المؤقتة في المتصفح ما دامت أدوات المطوّرين مفتوحة. وتبقى ملفات تعريف الارتباط والبيانات المخزّنة وأي عامل خدمة (service worker)، فلرؤية الموقع كما يراه زائر يفتحه أول مرة استخدم نافذة خاصة.
- الإبطاء (Throttling) لمحاكاة اتصال بطيء أو انقطاع الاتصال، ورؤية حالات التحميل والخطأ.
- مرشّح «Fetch/XHR» لإخفاء الملفات الثابتة والإبقاء على الطلبات التي تحمل البيانات.
- «Copy as cURL»، الذي يحوّل الطلب إلى أمر للبرنامج
curl، وهو برنامج سطر أوامر يرسل طلبات HTTP، ليعيد المطوّر إرسال ما أُرسل بالضبط. يحتوي الأمر على ملفات تعريف الارتباط وترويسةAuthorization: احذفها قبل مشاركته. - «Export HAR» لحفظ كل الطلبات المعروضة في ملف واحد يُرفق بتقرير الخطأ. يستبعد Chrome افتراضياً الترويسات
CookieوSet-CookieوAuthorization، لكن أجسام الطلبات والاستجابات قد تظل تحمل بيانات شخصية.
جرّبها: محلّل أوامر cURL جرّبها: محلّل ترويسات HTTP جرّبها: منسّق JSON
التطبيق والأداء وشريط أدوات الأجهزة
تُظهر لوحة التطبيق ما يخزّنه الموقع في متصفحك: ملفات تعريف الارتباط بسماتها (HttpOnly وSecure وSameSite وتاريخ الانتهاء، ويشرحها درس ملفات تعريف الارتباط وتخزين الويب)، والتخزين المحلي (local storage) وتخزين الجلسة (session storage)، وIndexedDB، وعمّال الخدمة (service workers). يمكنك تعديل المدخلات أو حذفها، أو مسح بيانات الموقع لتبدأ من جديد. ومن الفحوص المعتادة: هل اختفى ملف تعريف ارتباط الجلسة، وهو الذي يُبقيك مسجّل الدخول، بعد تسجيل الخروج؟
وتسجّل لوحة الأداء تحميلاً أو تفاعلاً، وتُظهر ما كان يفعله الخيط الرئيسي (main thread) في المتصفح. تُعلَّم المهام الطويلة (long tasks)، أي التي تتجاوز 50 ms، بالأحمر، ولإزاحات التخطيط (layout shifts) مسار خاص بها، وهذا يفسّر نقرة تستجيب متأخرة أو محتوى يقفز. ونتائج حاسوبك قياسات مخبرية، لا تجربة مستخدميك.
ويحاكي شريط أدوات الأجهزة منفذ عرض (viewport) هاتف أو جهاز لوحي، ونسبة البكسل فيه، وأحداث اللمس، ومع اختيار جهاز جاهز وكيلَ المستخدم (user agent) الخاص به. إنه فحص أولي سريع للتخطيط، لكن المحرك والمعالج والخطوط تبقى خاصة بمتصفح حاسوبك؛ فأكّد النتائج المهمة على جهاز حقيقي. ويفصّل درس اختبار التصميم المتجاوب حدوده في قسم «ما يستطيع شريط أدوات الأجهزة إخبارك به وما لا يستطيع».
مثال تطبيقي: «تم الحفظ» ولم يُحفظ شيء
في بيئة Staging، تغيّر مختبِرة رقم الهاتف إلى +966 50 123 4567، وتنقر «حفظ» فترى «تم حفظ الملف الشخصي»؛ وبعد إعادة التحميل يعود الرقم القديم. وبدلاً من الإبلاغ بأن «الحفظ لا يعمل»، تفعّل «Preserve log» وتختار مرشّح «Fetch/XHR» وتكرّر الخطوات:
- حمل طلب
PATCH(طريقة HTTP لتعديل جزء من مورد) الرقم الجديد: أي أن النموذج جمع المدخل بشكل صحيح. - أجاب الخادم بالرمز 422 (Unprocessable Content في RFC 9110)، أي أنه رفض البيانات: لم يُحفظ شيء، كما يؤكد طلب
GETبعد إعادة التحميل. - ومع ذلك عرضت الصفحة رسالة نجاح، فهي إذن لا تتحقق من رمز حالة الاستجابة؛ وكما في درس أساسيات JavaScript، فالرد من الفئة 4xx لا يجعل
fetch()يفشل. هذا عيب في الصفحة. - هل يُسمح بالمسافات في رقم الهاتف؟ المتطلب هو الذي يحدد هل في تحقق الخادم من المدخل عيب ثانٍ.
- يصف التقرير عيب الصفحة، ويطرح سؤال صيغة رقم الهاتف، ويُرفق لقطة الشاشة والطلب والاستجابة، دون ملف تعريف ارتباط الجلسة.
Console (no errors)
Network Fetch/XHR, Preserve log on
PATCH https://staging.example.com/api/v1/profile
Status: 422
Payload: {"phone":"+966 50 123 4567"}
Response: {"field":"phone","message":"Invalid phone format"}
GET https://staging.example.com/api/v1/profile (after reload)
Status: 200
Response: {"name":"Sara","phone":"+966501112233"}أخطاء شائعة
- فتح أدوات المطوّرين بعد وقوع المشكلة: الطلبات السابقة لا تُسجَّل، ومن دون «Preserve log» يمسح الانتقال إلى صفحة أخرى أو إعادة التوجيه القائمة.
- تصديق الرسالة على الشاشة بدلاً من رمز الحالة والاستجابة.
- اعتبار التعديل في جزء الأنماط إصلاحاً: المستخدمون ما زالوا يتلقون الشيفرة المنشورة.
- الإبلاغ عن كل رسالة في وحدة التحكم: إضافات المتصفح تضيف رسائلها الخاصة، فأعد إنتاج المشكلة أولاً في نافذة خاصة أو بملف شخصي (profile) جديد في المتصفح.
- إرفاق أمر cURL أو ملف HAR ما زال يحتوي ملفات تعريف الارتباط أو الرموز المميزة (tokens) أو بيانات شخصية.
- اعتبار شريط أدوات الأجهزة أو حاسوب سريع الحكمَ النهائي على تخطيط الهاتف أو سرعته.
من منظور ضمان الجودة
يُبقي المختبِرون أدوات المطوّرين مفتوحة أثناء جلسات الاختبار الاستكشافي وكلما أعادوا إنتاج خطأ، ويختارون اللوحة حسب العَرَض: وحدة التحكم حين «لا يحدث شيء»، والشبكة لبيانات لا تُحفظ أو لا تظهر، والعناصر للتخطيط، والتطبيق لتسجيل الدخول والحالة. ويسجّلون الطريقة والعنوان ورمز الحالة، والحمولة والاستجابة ذات الصلة، ونص الخطأ بحرفه، والمتصفح وإصداره، ومقاس منفذ العرض في أخطاء التخطيط.
هذه الأدلة توجّه الخطأ إلى صاحبه: «طلب صحيح وأجاب الخادم بالرمز 500» يذهب إلى الواجهة الخلفية (back end)، و«استجابة صحيحة وقيمة خاطئة على الشاشة» يذهب إلى الواجهة الأمامية (front end). اتفق مع فريقك على الأدلة التي يتطلبها قالب تقرير الخطأ. وتعمل أدوات المطوّرين على بيئة الإنتاج أيضاً: انظر هناك ولا تغيّر شيئاً، ولا تختبر إلا الأنظمة المسموح لك باختبارها.
تمرين عملي
شخّص إعداداً لا يُحفظ
يبلّغ زميل: «إيقاف عروض الرسائل النصية في إعدادات الإشعارات لا يعمل» (Chrome، بيئة Staging). تعيد إنتاج المشكلة وأدوات المطوّرين مفتوحة: تلغي تحديد «SMS offers»، وتختار مربع الاختيار في لوحة العناصر، وتكتب تعبيراً في وحدة التحكم، ثم تنقر «Save» فترى «Settings saved»؛ وبعد إعادة التحميل يعود المربع محدَّداً. العَرَض يطابق المثال التطبيقي، أما الالتقاط أدناه فلا يطابقه. حدّد أين يقع العيب على الأرجح، وأعد كتابة التقرير.
اختياري: على صفحة مسموح لك باختبارها، انسخ طلباً بصيغة cURL والصقه في أداة cURL Parser، والصق ترويسات استجابته في أداة HTTP Headers Parser.
Elements (the unticked SMS checkbox, selected)
<input type="checkbox" id="sms-offers" name="sms" checked>
Console (no errors; typed before clicking Save)
> $0.checked
< false
Network Fetch/XHR, Preserve log on
PATCH https://staging.example.com/api/v1/notification-settings
Status: 200
Payload: {"email":true,"sms":true}
Response: {"email":true,"sms":true}- سمِّ لوحة كل كتلة في الالتقاط، والسؤال الذي تجيب عنه.
- قرّر هل العيب في الطلب، أم في استجابة الخادم، أم في تعامل الصفحة مع الاستجابة، وعلّل قرارك.
- اكتب العنوان والنتيجة المتوقعة والنتيجة الفعلية والأدلة في تقرير الخطأ.
- اكتب الأسئلة التي توجّهها إلى المطوّر أو إلى مالك المنتج.
إظهار الإجابة النموذجية
اللوحات: لوحة العناصر (ما الموجود في الصفحة الآن؟) ما زالت تُظهر السمة checked، لكن السمة، كما في درس نموذج DOM، ليست إلا الحالة الابتدائية. ووحدة التحكم (هل فشلت شيفرة الصفحة؟) لا تُظهر أخطاء، فلم ينهَر أي سكربت؛ والتعبير يسأل الصفحة عن $0.checked، أي الخاصية التي تحمل الحالة الحالية، وقيمتها false: فالمربع أُلغي تحديده فعلاً. والشبكة (ماذا أُرسل وماذا عاد؟) تُظهر أن «Save» أرسل "sms":true وأن الخادم أجاب بالرمز 200 بالقيم نفسها.
الموضع: الطلب خاطئ. فالمربع غير محدَّد، ومع ذلك أرسلت الصفحة "sms":true؛ وخزّن الخادم ما تلقّاه، فالرمز 200 ورسالة «Settings saved» والمربع المحدَّد بعد إعادة التحميل كلها متسقة مع ذلك الطلب. العيب في الصفحة (الواجهة الأمامية). وسبب محتمل يؤكده المطوّر: الشيفرة تقرأ الحالة الابتدائية (السمة) بدلاً من الحالة الحالية (الخاصية).
التقرير: العنوان «إعدادات الإشعارات: إلغاء تحديد SMS offers لا يُحفظ، والطلب ما زال يرسل sms:true». النتيجة المتوقعة: يحمل الطلب "sms":false، ويبقى المربع غير محدَّد بعد إعادة التحميل. النتيجة الفعلية: تظهر «Settings saved»، ويحمل الطلب "sms":true، ويعود المربع محدَّداً بعد إعادة التحميل. الأدلة: الطلب والاستجابة دون ملفات تعريف الارتباط أو الرموز المميزة (tokens)، وسطر وحدة التحكم الذي فيه $0.checked، ولقطتا شاشة قبل «Save» وبعد إعادة التحميل، وإصدار المتصفح، وبناء Staging.
الأسئلة: هل يفشل تحديد مربع بالطريقة نفسها، وهل يتصرف مربع البريد الإلكتروني بالطريقة نفسها؟ هل يفشل التبديل بلوحة المفاتيح كما يفشل بالفأرة؟ هل توجد قاعدة تُبقي عروض الرسائل النصية مفعّلة لبعض العملاء، وإن وُجدت فلماذا تقول الصفحة «Settings saved»؟ ولأن العيب يتجاهل اختيار العميل بشأن الرسائل التسويقية، فاحرص على أن يطّلع عليه مالك المنتج مبكراً.
أسئلة شائعة
هل أحتاج إلى معرفة البرمجة لاستخدام أدوات المطوّرين؟
لا. قراءة لوحة الشبكة ورسائل وحدة التحكم وشجرة العناصر تحتاج فقط إلى أساسيات الويب في هذه الوحدة التعليمية. كتابة تعبيرات قصيرة في وحدة التحكم مفيدة، لكن معظم عمل الاختبار بأدوات المطوّرين قراءةٌ وتصفيةٌ ونسخٌ للأدلة.
هل استخدام أدوات المطوّرين على بيئة الإنتاج آمن؟
المشاهدة آمنة: فحص العناصر وقراءة الطلبات وتسجيل الأداء لا تغيّر شيئاً في الخادم. أما الأفعال فقد يكون لها أثر: إعادة إرسال طلب أو تشغيل شيفرة في وحدة التحكم أو تعديل التخزين تتم بحسابك، فاكتفِ بالمشاهدة في الإنتاج ما لم يُؤذن لك. وتعديلات العناصر والأنماط لا تغيّر إلا ما يعرضه تبويبك، لكن النموذج الذي عدّلته هناك ثم أرسلته يرسل بيانات حقيقية إلى الخادم.
أدوات أيّ متصفح أتعلّم؟
ابدأ بالمتصفح الذي يستهدفه فريقك أكثر من غيره؛ وأدوات المطوّرين في Chrome وEdge مبنية على الشيفرة نفسها. الأسئلة التي تجيب عنها كل لوحة هي نفسها في Firefox وSafari، ولا تختلف إلا الأسماء والترتيب، وستحتاج إليها في أخطاء التوافق بين المتصفحات.
المراجع
- What are browser developer tools? — MDNمقدمة لأدوات المطوّرين المدمجة في المتصفحات — المفتّش ووحدة تحكم JavaScript ومصحّح الأخطاء — لفحص الصفحة أثناء اختبارها.
- RFC 9110: HTTP Semanticsمعاني أساليب HTTP وحقول الترويسات ورموز الحالة والتفاوض على المحتوى، بغضّ النظر عن إصدار البروتوكول.
- Using HTTP cookies — MDNعمر ملف تعريف الارتباط ونطاقه وسمات Secure/HttpOnly/SameSite وآثارها الأمنية.
- ISTQB Glossaryالتعريفات القياسية لمصطلحات الاختبار — حالة الاختبار واختبار الانحدار والخطورة والأولوية وتحليل القيم الحدّية وغيرها.
تدرّب بأدوات متقن
تحليل أمر cURL إلى الطريقة وعنوان URL والترويسات والمتن، ثم تحويله إلى fetch أو axios أو Python أو طلب منظّم.
تحليل ترويسات طلبات واستجابات HTTP الخام إلى جدول منظّم مع الشروحات.
تحليل ترويسات Set-Cookie والتحقق من أفضل الممارسات في Secure وHttpOnly وSameSite وDomain وPath وانتهاء الصلاحية والحجم.
تحليل سلاسل User-Agent إلى المتصفح والإصدار والمحرك ونظام التشغيل ونوع الجهاز مع كشف الروبوتات.
ابحث عن أي رمز حالة HTTP لمعرفة معناه ومرجعه في RFC ومتى يُستخدم.
تنسيق JSON وتجميله والتحقق من صحته فوراً في متصفحك مع مسافة بادئة قابلة للتخصيص.
للتعمّق أكثر
تقدّمك في هذا الموضوع
سجّل الدخول لتتابع تقدّمك
علّم الموضوعات مكتملة، وتابع من حيث توقفت، وافتح امتحانات التخصص.