أساسيات 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): &lt; تعرض < و&amp; تعرض &. وظهور &amp; على الشاشة يعني أن النص رُمِّز مرتين.
زرٌّ مفكَّك إلى أجزائه: وسم البداية يحمل اسم العنصر وسماته، والسمة disabled مفعّلة بمجرد وجودها، والمحتوى هو اسم الزر، أما العنصر الفارغ <input> فلا وسم نهاية له.

عنصر له محتوى

<الجزء 1:button الجزء 2:type="الجزء 3:submit" الجزء 4:id="pay" الجزء 5:disabled>الجزء 6:Pay nowالجزء 7:</button>

عنصر فارغ (Void element)

الجزء 8:<input type="email" name="email" required>

مرجع محرف داخل النص

<p>Tom الجزء 9:&amp; Jerry</p>

  • 1–5وسم البداية: اسم العنصر وسماته، بين < و>
  • 1–7العنصر: وسم البداية والمحتوى ووسم النهاية
  1. 1اسم العنصريقول ما هو العنصر: فالزر الحقيقي button يأتي مع سلوك لوحة المفاتيح وقارئ الشاشة الذي يفتقده div
  2. 2اسم السمةتُكتب السمات في وسم البداية فقط
  3. 3قيمة السمةتُكتب بين علامتي تنصيص بعد =؛ والقيمة submit تجعل الزر يرسل نموذجه
  4. 4السمة idفريدة في الصفحة؛ وتشير إليها التسميات وروابط #pay والمحدِّدات
  5. 5سمة منطقيةمفعّلة بمجرد وجودها ولا تُلغى إلا بحذفها: فالسمة disabled="false" تعطّل الزر أيضاً
  6. 6المحتوىالنص الذي يراه المستخدم، وهو في الزر الاسمُ الذي يعلنه قارئ الشاشة أيضاً
  7. 7وسم النهايةيُغلق العنصر، والمحتوى يقع بين وسم البداية ووسم النهاية
  8. 8عنصر فارغوسم البداية هو العنصر كله: لا محتوى ولا وسم نهاية، كما في <img> و<br>. وrequired سمة منطقية أخرى
  9. 9مرجع محرف (كيان)يُعرض بالشكل &، كما يُعرض &lt; بالشكل <. وظهور &amp; نفسه على الشاشة يعني أن النص رُمِّز مرتين. وتعرض الصفحة:Tom & Jerry

جرّبها: مفكّك ترميز كيانات HTML

الهيكل الثابت لكل صفحة

لكل مستند 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="" إن كانت زخرفية.

مثال تطبيقي: قراءة مصدر نموذج تسجيل

لترى شيفرة 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>

جرّبها: منسّق HTML

أخطاء شائعة

  • الحكم على العنصر من شكله: فعنصر <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>
الخطوات
  1. افحص الهيكل: lang و<title> وعناصر <meta>.
  2. افحص كل href وهل وجهته موجودة.
  3. افحص العناوين والصور وكل ما يُنقر.
  4. افحص النموذج، ثم التعليقات.
إظهار الإجابة النموذجية
الإجابة النموذجية

الهيكل: <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 StandardWHATWGلغة HTML، بما فيها مراجع المحارف المسماة (الكيانات) وقواعد التحليل التي تتبعها المتصفحات.
  • Web Content Accessibility Guidelines (WCAG) 2.2W3C · 2024توصية W3C التي تحدد معايير النجاح القابلة للاختبار لإتاحة محتوى الويب، مرتّبةً تحت أربعة مبادئ وثلاثة مستويات مطابقة (A وAA وAAA).
  • HTML: HyperText Markup Language — MDNMDN Web Docs (Mozilla)مرجع MDN وأدلته لعناصر HTML وسماتها — البنية الدلالية التي تُبنى منها الصفحة وتعتمد عليها الاختبارات والتقنيات المساعدة.
  • Client-side form validation — MDNMDN Web Docs (Mozilla)التحقق من النماذج في المتصفح بالسمات المدمجة وبالسكربتات، ولماذا يساعد المستخدمين لكنه لا يغني أبداً عن التحقق في الخادم.

تدرّب بأدوات متقن

تجميل HTML بمسافات بادئة صحيحة للعناصر المتداخلة، مع الحفاظ على كتل pre وscript وstyle.

التنسيق

تفكيك عنوان URL إلى البروتوكول والمضيف والمنفذ والمسار ومعاملات الاستعلام والجزء (fragment) وبيانات الاعتماد.

الويب

ولّد حالات اختبار للتحقق من حقول النماذج: الإلزامية والصيغة والطول والنطاق والنمط والقواعد المشتركة بين الحقول.

تصميم الاختبارات

للتعمّق أكثر

تقدّمك في هذا الموضوع

جزء من مسار تعلم ضمان الجودة