أساسيات HTML للمختبِرين
لغة HTML (HyperText Markup Language) هي التي تصف محتوى صفحة الويب وبنيتها: فكما رأيت في درس «كيف تعمل المتصفحات»، يرسل الخادم مستند HTML ويحوّله المتصفح إلى الصفحة التي تراها. ويتكوّن المستند من عناصر (Elements): فالعنصر <button type="submit">Pay now</button> زرٌّ نصه «Pay now»، وسمته type تقول إنه يرسل نموذجاً.
نادراً ما يكتب المختبِرون شيفرة HTML، لكنهم يقرؤونها كثيراً. فالشيفرة (Markup) تُظهر حقيقة كل عنصر تحكم، وأسماء الحقول التي تصل إلى الخادم، والقواعد التي يفرضها المتصفح؛ وهي حقائق لا تُظهرها لقطة الشاشة.
لماذا يهم
قد تبدو صفحتان متطابقتين وتتصرفان بشكل مختلف. فـ«الزر» المبني من <div> قد يعمل بالفأرة ولا يعمل بلوحة المفاتيح ولا مع قارئ الشاشة (Screen reader)، وهو البرنامج الذي يقرأ الصفحة بصوت مسموع للمستخدمين المكفوفين وضعاف البصر؛ والتسمية (Label) غير المربوطة بحقلها تترك الحقل بلا اسم لدى مستخدمي قارئ الشاشة؛ والرابط قد يشير إلى خادم Staging. هذه العيوب خفية على الشاشة وواضحة في الشيفرة.
وHTML أيضاً لغة مشتركة بين المختبِرين والمطورين والأتمتة. فتقرير الخطأ الذي يقول «التسمية فيها for="mail" بينما id الحقل هو email» يُصلَح أسرع من تقرير يقول «النقر على التسمية لا يفعل شيئاً»، ولاحقاً تعثر أتمتة واجهة المستخدم على العناصر عبر أدوارها وتسمياتها وسماتها.
العناصر والوسوم والسمات
لمعظم العناصر وسم بداية (Start tag) ومحتوى ووسم نهاية (End tag): ففي <a href="/pricing">See pricing</a> المحتوى هو «See pricing» الواقع بين وسم البداية ووسم النهاية </a>. وتتداخل العناصر كالصناديق، مثل بنود <li> داخل القائمة <ul>. أما العناصر الفارغة (Void elements) مثل <input> و<img> و<br> فلا محتوى لها ولا وسم نهاية.
تُكتب السمات (Attributes) داخل وسم البداية على شكل أزواج name="value". وثلاثة تفاصيل منها تهمّ في كل صفحة:
idيسمّي عنصراً واحداً ويجب أن يكون فريداً في الصفحة؛ وتشير إليه التسميات وروابط#fragmentوكثير من المحدِّدات (Locators)، وهي الاستعلامات التي تستخدمها الاختبارات الآلية للعثور على العنصر.- السمات المنطقية (Boolean attributes) مثل
requiredوdisabledتكون مفعّلة بمجرد وجودها ولا تُلغى إلا بحذفها: فالسمةdisabled="false"تعطّل الحقل أيضاً. - المحارف التي لها معنى في HTML تُكتب كمراجع محارف تُسمّى عادةً الكيانات (Entities):
<تعرض<و&تعرض&. وظهور&على الشاشة يعني أن النص رُمِّز مرتين.
disabled مفعّلة بمجرد وجودها، والمحتوى هو اسم الزر، أما العنصر الفارغ <input> فلا وسم نهاية له.عنصر له محتوى
<
عنصر فارغ (Void element)
الجزء 8:<input type="email" name="email" required>
مرجع محرف داخل النص
<p>Tom
- 1–5وسم البداية: اسم العنصر وسماته، بين
<و> - 1–7العنصر: وسم البداية والمحتوى ووسم النهاية
- 1اسم العنصريقول ما هو العنصر: فالزر الحقيقي
buttonيأتي مع سلوك لوحة المفاتيح وقارئ الشاشة الذي يفتقدهdiv - 2اسم السمةتُكتب السمات في وسم البداية فقط
- 3قيمة السمةتُكتب بين علامتي تنصيص بعد
=؛ والقيمةsubmitتجعل الزر يرسل نموذجه - 4السمة
idفريدة في الصفحة؛ وتشير إليها التسميات وروابط#payوالمحدِّدات - 5سمة منطقيةمفعّلة بمجرد وجودها ولا تُلغى إلا بحذفها: فالسمة
disabled="false"تعطّل الزر أيضاً - 6المحتوىالنص الذي يراه المستخدم، وهو في الزر الاسمُ الذي يعلنه قارئ الشاشة أيضاً
- 7وسم النهايةيُغلق العنصر، والمحتوى يقع بين وسم البداية ووسم النهاية
- 8عنصر فارغوسم البداية هو العنصر كله: لا محتوى ولا وسم نهاية، كما في
<img>و<br>. وrequiredسمة منطقية أخرى - 9مرجع محرف (كيان)يُعرض بالشكل
&، كما يُعرض<بالشكل<. وظهور&نفسه على الشاشة يعني أن النص رُمِّز مرتين. وتعرض الصفحة:Tom & Jerry
الهيكل الثابت لكل صفحة
لكل مستند HTML الهيكل نفسه. فالسطر <!DOCTYPE html> يطلب وضع المعايير (Standards mode)، ومن دونه تعود المتصفحات إلى وضع توافق قديم (Quirks mode) يغيّر التخطيط. والعنصر <html> يضم كل شيء، وسمته lang تحدد اللغة، وتضيف الصفحات العربية dir="rtl". أما <head> فيصف الصفحة ولا يُعرض، و<body> يضم ما يراه المستخدم.
<title>: يظهر في التبويب ونتائج البحث، وهو أول ما يعلنه قارئ الشاشة؛ ويجب أن يكون لكل صفحة عنوان خاص بها يصفها (المعيار 2.4.2 في WCAG 2.2).lang: تختار به قارئات الشاشة النطق المناسب (المعيار 3.1.1).<meta charset="utf-8">: غياب الترميز أو خطؤه سبب شائع لظهور النص العربي والهندي مشوّهاً.<meta name="robots" content="noindex">: يُبقي الصفحة خارج محركات البحث؛ وهذا صحيح في بيئة Staging، لكنه عيب خطير في صفحة عامة على بيئة الإنتاج.<meta name="viewport">يطلب من الهاتف أن يرتّب الصفحة بعرض شاشته هو، ومن دونه يعرض الهاتف تخطيط سطح المكتب مصغَّراً. أما<link rel="stylesheet">و<script src>فيحمّلان شيفرة CSS وJavaScript، لذا فالمسار الخاطئ فيهما يُفسد تنسيق الصفحة أو سلوكها.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Track your order | Example Store</title>
<meta name="description" content="Check where your order is.">
<link rel="stylesheet" href="/styles.css">
<script src="/app.js" defer></script>
</head>
<body>
<header>...logo and menu...</header>
<main>...the content of this page...</main>
<footer>...contact and legal links...</footer>
</body>
</html>العناصر الدلالية: المعنى لا الشكل
العنصر الدلالي (Semantic element) يقول ما هو محتواه: فالعناصر <header> و<nav> و<main> و<footer> تحدد مناطق الصفحة، و<h1> إلى <h6> تحدد العناوين، و<ul> يحدد قائمة، و<button> إجراءً، و<a href> رابطاً. أما <div> و<span> فلا معنى لهما؛ إنهما صندوقان للتخطيط والتنسيق.
يمكن لـCSS أن تجعل <div> يبدو تماماً مثل الزر، لكن الزر الحقيقي <button> يأتي مع سلوكه: يُوصل إليه بمفتاح Tab، ويُفعَّل بمفتاح Enter أو المسافة، ويعلنه قارئ الشاشة زراً. أما <div> القابل للنقر فلا يحصل على شيء من ذلك ما لم يضفه المطور يدوياً. وبالمثل، فالنص الكبير العريض داخل <div> يبدو عنواناً لكنه يغيب عن قائمة العناوين في قارئ الشاشة.
- كل ما ينفّذ إجراءً عند النقر يجب أن يكون
<button>، أو<a href>إن كان ينقل إلى صفحة أخرى. - الصور تحتاج إلى
alt: وصف قصير إن كانت تحمل معلومة، وalt=""إن كانت زخرفية.
النماذج والروابط في الشيفرة
يرسل العنصر <form> حقوله إلى العنوان المذكور في action بطريقة HTTP المذكورة في method: فالطريقة post تضع البيانات في جسم الطلب، أما get، وهي الافتراضية، فتضعها في عنوان URL حيث تنتهي في سجل المتصفح وسجلات الخادم. ويُرسَل كل حقل على شكل زوج من اسمه name وقيمته؛ والحقل الذي لا name له لا يُرسَل أصلاً.
والرابط عنصر <a> له href: عنوان كامل، أو مسار مثل /help، أو جزء (Fragment) مثل #faq ينتقل إلى العنصر الذي يحمل id="faq"، أو مخطط مثل mailto:. وسمات الحقول والروابط تعطيك أفكار اختبار مباشرة:
typeمثلemailوnumberوdateيحدد فحوص المتصفح المدمجة ولوحة المفاتيح أو أداة الاختيار التي تظهر على الهاتف.requiredوminlengthوmaxlengthوminوmaxوpatternقواعد قابلة للاختبار، وحدودها تعطيك القيم الحدّية. لكن أي شخص يستطيع حذفها، لذا يجب أن يفحص الخادم القواعد نفسها. ولاحظ أنminlengthوحدها لا ترفض الحقل الفارغ.- تمنح
<label>الحقلَ اسمه القابل للوصول (Accessible name)، وهو الاسم الذي يعلنه قارئ الشاشة للحقل، حين تساوي قيمةforفيها قيمةidالحقل أو حين تحيط بالحقل؛ وعندها ينقل النقر على التسمية التركيز إلى الحقل أيضاً. - الزر
<button>الذي لاtypeله داخل نموذج هو زر إرسال. <input type="hidden">مخفي على الشاشة لكن المستخدم يستطيع تعديله، لذا يجب ألا يثق الخادم بقيمته.
مثال تطبيقي: قراءة مصدر نموذج تسجيل
لترى شيفرة HTML التي أرسلها الخادم، اضغط Ctrl+U في Chrome أو Edge أو Firefox على Windows وLinux، أو اكتب view-source: قبل العنوان. المصدر هو المستند قبل أن تغيّره JavaScript؛ أما الصفحة الحية ففي أدوات المطوّر (DevTools) التي تتناولها دروس لاحقة. والمصدر المصغَّر (Minified)، المضغوط في بضعة أسطر طويلة، تسهل قراءته بعد لصقه في أداة تنسيق HTML. وكثير من تطبيقات الصفحة الواحدة (SPA)، التي تبني الصفحة بـJavaScript، يرسل <body> شبه فارغ، فلا يُظهر مصدرها إلا القليل.
يبدو نموذج التسجيل هذا سليماً على الشاشة، أما مصدره فلا:
method="get": سينتقل البريد الإلكتروني وكلمة المرور في عنوان URL. المتوقع:post.- تسمية Email بلا
forولا تحيط بالحقل، فلا اسم قابلاً للوصول لهذا الحقل. for="pass"لا تطابقid="password": العيب نفسه.type="text"لحقل بريد إلكتروني: لا لوحة مفاتيح خاصة بالبريد على الهاتف ولا فحص للصيغة في المتصفح.minlength="12"دونrequired: كلمة المرور الفارغة تجتاز فحص المتصفح. اختبر 0 و11 و12 حرفاً، واسأل عن الحد الأقصى.- الحقل المخفي
planقيمتهfree: في بيئة اختبار مسموح لك باختبارها، غيّره في أدوات المطوّر وأرسل النموذج. فالخادم لا الصفحة هو من يجب أن يقرر الخطة. <button>Cancel</button>لاtypeله، فهو يرسل النموذج. المتوقع:type="button".- «Create account» عنصر
<div>: لا يُوصل إليه بمفتاح Tab ولا يعلنه قارئ الشاشة زراً.
<form action="/signup" method="get">
<label>Email</label>
<input type="text" id="email" name="email" required>
<label for="pass">Password</label>
<input type="password" id="password" name="password" minlength="12">
<input type="hidden" name="plan" value="free">
<button>Cancel</button>
<div class="btn-primary" onclick="createAccount()">Create account</div>
</form>أخطاء شائعة
- الحكم على العنصر من شكله: فعنصر
<div>المنسّق كزر ليس زراً بالنسبة إلى لوحة المفاتيح وقارئ الشاشة. - اعتبار
requiredأوmaxlengthدليلاً على وجود التحقق بدلاً من اختبار أن الخادم يفرض القواعد نفسها. - الاكتفاء بمصدر الصفحة في تطبيق الصفحة الواحدة، الذي لا يظهر محتواه إلا في DOM الحي.
- كتابة «التسمية لا تعمل» في تقرير الخطأ بدلاً من اقتباس العنصر والسمة وقيمتها.
- إهمال
<head>: فخطأ<title>أوlangأوnoindexلا يظهر في الصفحة أبداً، لكنه يضرّ مستخدمي قارئات الشاشة ونتائج البحث.
من منظور ضمان الجودة
أثناء الاختبار الاستكشافي أبقِ المصدر أو أدوات المطوّر مفتوحة بجانب الصفحة، وإذا تصرّف عنصر تحكم بغرابة فتحقق مما هو فعلاً. وفي مراجعة الشاشات الجديدة اطلب عناصر <button> و<label> وعناوين حقيقية، وسمات ثابتة مثل id أو data-testid تعتمد عليها الأتمتة.
في تقرير الخطأ اقتبس أصغر مقطع يُظهر العيب، والشيفرة المتوقعة، وأثره على المستخدمين («لا يستطيع مستخدمو لوحة المفاتيح إنشاء حساب»)، مع عنوان URL والبيئة، لأن Staging والإنتاج قد يقدّمان شيفرة HTML مختلفة. ولا تختبر إلا الأنظمة المسموح لك باختبارها، وأحِل ملاحظات مثل التعليقات المكشوفة إلى إجراءات الأمان المتبعة في فريقك.
تمرين عملي
راجع مصدر صفحة «اتصل بنا»
أمامك مصدر صفحة «اتصل بنا» اجتازت المراجعة البصرية. اذكر كل عيب أو سؤال مفتوح تجده في الشيفرة، ولماذا يهمّ المستخدم، والشيفرة المتوقعة أو السؤال الذي ستطرحه.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Untitled</title>
<meta name="robots" content="noindex">
</head>
<body>
<div class="top-bar">
<img src="/logo.png">
<a href="http://staging.example.com/pricing">Pricing</a>
<a href="#faq">FAQ</a>
<span class="link" onclick="openHelp()">Help</span>
</div>
<div class="big-title">Contact us</div>
<!-- demo login: demo@example.com / Demo-2026 (remove before release) -->
<form action="/contact" method="post">
<label for="msg">Message</label>
<textarea id="message" name="message" maxlength="500"></textarea>
<button type="submit">Send</button>
</form>
<section id="questions">...</section>
</body>
</html>- افحص الهيكل:
langو<title>وعناصر<meta>. - افحص كل
hrefوهل وجهته موجودة. - افحص العناوين والصور وكل ما يُنقر.
- افحص النموذج، ثم التعليقات.
إظهار الإجابة النموذجية
الهيكل: <html> بلا lang (المعيار 3.1.1)؛ و<title>Untitled</title> لا يصف الصفحة (المعيار 2.4.2)؛ ولا يوجد <meta name="viewport">، فيعرض الهاتف تخطيط سطح المكتب مصغَّراً؛ وnoindex يُبقي صفحة عامة خارج نتائج البحث، فاسأل هل هو من بقايا بيئة Staging.
الروابط: رابط Pricing يشير إلى http://staging.example.com، أي إلى بيئة خاطئة ودون HTTPS. والرابط #faq لا يطابق أي id (فالقسم يحمل id="questions")، لذا لا يفعل شيئاً. وHelp عنصر <span>: لا يُوصل إليه بمفتاح Tab، ولا يُعلَن رابطاً، ولا يمكن فتحه في تبويب جديد.
الدلالات: صورة الشعار <img> بلا alt؛ و«Contact us» عنصر <div> منسّق بدلاً من <h1>؛ والشريط العلوي <div> وليس <header> يضم <nav>.
النموذج والتعليق: for="msg" لا تطابق id="message"، فلا اسم قابلاً للوصول لمربع النص. ولا يحمل حقل الرسالة required: فاسأل هل يجوز إرسال رسالة فارغة. وmaxlength="500" يعطي اختبارات حدّية عند 500 و501 حرف؛ والمتصفح يمنع الكتابة بعد 500، لذا فالقيمة 501 تختبر الخادم: هل يفرض الحدّ أيضاً؟ أما التعليق فيكشف بيانات دخول لكل من يفتح المصدر: أبلغ عنه بوصفه عيباً أمنياً.
أسئلة شائعة
هل أحتاج إلى تعلّم كتابة HTML لأصبح مختبِراً؟
لا. تحتاج إلى قراءتها: أن تميّز العناصر والسمات، وتجد الحقل أو الرابط أو العنوان الذي تختبره، وتقتبسه في تقرير الخطأ. وكتابة صفحات صغيرة تساعدك على التعلّم، لكن القراءة هي المهارة التي تستخدمها كل يوم.
ما الفرق بين مصدر الصفحة ولوحة Elements في أدوات المطوّر؟
مصدر الصفحة هو مستند HTML الذي أرسله الخادم. أما لوحة Elements فتعرض DOM الحي: الصفحة بعد أن حلّلها المتصفح وغيّرتها JavaScript. ويتطابقان في الصفحات البسيطة ويختلفان كثيراً في تطبيقات الصفحة الواحدة؛ وتتناول الدروس اللاحقة عن DOM وأدوات المطوّر العرض الحي.
هل شيفرة HTML غير الصالحة عيب دائماً؟
ليس دائماً. يصلح المتصفح كثيراً من الأخطاء، مثل وسم نهاية مفقود، فقد تعمل الصفحة رغم ذلك. أبلغ عن مشكلات الشيفرة بأثرها: id مكرر يكسر تسمية، أو عنصر غير مغلق يبتلع المحتوى، أو alt مفقود. ومدقق HTML مفيد لاكتشافها، لكن الأثر على المستخدمين هو ما يحدد الخطورة.
المراجع
- HTML Living Standardلغة HTML، بما فيها مراجع المحارف المسماة (الكيانات) وقواعد التحليل التي تتبعها المتصفحات.
- Web Content Accessibility Guidelines (WCAG) 2.2توصية W3C التي تحدد معايير النجاح القابلة للاختبار لإتاحة محتوى الويب، مرتّبةً تحت أربعة مبادئ وثلاثة مستويات مطابقة (A وAA وAAA).
- HTML: HyperText Markup Language — MDNمرجع MDN وأدلته لعناصر HTML وسماتها — البنية الدلالية التي تُبنى منها الصفحة وتعتمد عليها الاختبارات والتقنيات المساعدة.
- Client-side form validation — MDNالتحقق من النماذج في المتصفح بالسمات المدمجة وبالسكربتات، ولماذا يساعد المستخدمين لكنه لا يغني أبداً عن التحقق في الخادم.
تدرّب بأدوات متقن
تجميل HTML بمسافات بادئة صحيحة للعناصر المتداخلة، مع الحفاظ على كتل pre وscript وstyle.
فكّ ترميز كيانات HTML (& و© و…) وإعادتها إلى أحرف عادية.
تفكيك عنوان URL إلى البروتوكول والمضيف والمنفذ والمسار ومعاملات الاستعلام والجزء (fragment) وبيانات الاعتماد.
ولّد حالات اختبار للتحقق من حقول النماذج: الإلزامية والصيغة والطول والنطاق والنمط والقواعد المشتركة بين الحقول.
للتعمّق أكثر
تقدّمك في هذا الموضوع
سجّل الدخول لتتابع تقدّمك
علّم الموضوعات مكتملة، وتابع من حيث توقفت، وافتح امتحانات التخصص.