واجهات الويب تتغير باستمرار: class names تُبنى تلقائيًا، عناصر تغلف بعقد إضافية، وترتيب أجزاء يتحرك. إذا كان Automation test يعتمد على مسار CSS طويل فسيفشل رغم أن المستخدم ما زال قادرًا على تنفيذ المهمة. الحل ليس تجاهل DOM، بل اختيار contracts أكثر ثباتًا.
اختبر النتيجة قبل البنية
إذا كانت المهمة تسجيل عنصر، تحقق من ظهور العنصر أو response ناجح، لا من عدد divs. استخدم DOM فقط للوصول للإجراء. Assertions على business outcome أقل هشاشة وتكشف failures حقيقية.
فضل identifiers دلالية
استخدم data-testid أو role/name أو labels إذا يملكها الموقع. تجنب nth-child ومسارات تعتمد hierarchy. عندما لا تملك الموقع، ابحث عن attributes مستقرة مرتبطة بالوظيفة لا style.
خطوات عملية
- حاول accessible role.
- ثم label/text مستقر.
- ثم attribute دلالي.
- CSS path آخر خيار.
ضع fallback محدودًا
وجود عشرة selectors بديلة يخفي تغيرًا حقيقيًا. اسمح ببديل أو اثنين موثقين، وإذا تغير contract أكثر أوقف المهمة للمراجعة. fallback لا يجب أن ينقر أول زر يشبه المطلوب.
قائمة مراجعة
- selector محدد.
- scope داخل container.
- تأكيد قبل click.
- log أي fallback مستخدم.
اختبر variations مقصودة
شغّل الاختبار على viewport مختلفة ولغة أخرى و A/B variants إن كانت متاحة. هذا يكشف الاعتماد على نص أو ترتيب ضيق. لا تحتاج تغطية كل شكل، بل المتغيرات التي يعرف الفريق أنها تتغير.
راقب drift قبل failure
سجل عندما يتحول selector من primary إلى fallback أو يزيد wait time. هذه إشارات مبكرة على تغير DOM تسمح بإصلاح automation قبل الانهيار الكامل.
أنشئ Contract Tests للصفحات الحرجة
بالنسبة للمواقع التي تعتمد عليها يوميًا، لا تنتظر فشل workflow كامل لتكتشف تغير DOM. نفذ contract صغيرًا دوريًا يفتح الصفحة ويثبت وجود anchors المهمة وال roles والحقول الأساسية بدون تنفيذ action نهائي. إذا تغير contract، علّم integration degraded وأوقف المهام الحساسة أو حولها لمراجعة. الاختبار لا يحتاج نسخ DOM كامل؛ خمس أو عشر إشارات دلالية تكفي. بهذه الطريقة يتحول تغير واجهة الموقع إلى تنبيه مبكر بدل سلسلة failures بعد بدء حملة كبيرة.
اختبر البيانات الديناميكية وال ـvirtualized lists
بعض DOMs تعرض فقط العناصر المرئية وتعيد استخدام nodes أثناء scroll. Selector صحيح قد يشير لاحقًا إلى عنصر آخر إذا احتفظت ب ـElementHandle قديم. اختبر lists طويلة و lazy loading، وأعد query قبل action الحساس بدل تخزين reference طويلًا. تحقق من business ID داخل row بعد scroll. كذلك اختبر loading skeletons التي تحمل نفس role مؤقتًا. هذه الحالات لا تظهر في صفحات صغيرة لكنها شائعة في لوحات الإدارة وتسبب actions على صف خاطئ إذا افترض automation أن node identity ثابتة.
قائمة مراجعة
- re-query قبل action.
- تحقق من row ID.
- انتظر انتهاء skeleton.
- اختبر scroll وإعادة تدوير العناصر.
حوّل الفكرة إلى سيناريو قابل للإعادة
لتقييم «كيف تختبر Automation ضد تغيّر DOM بدون تحويل الاختبار إلى هش» اكتب workflow صغيرًا له بداية معروفة ونهاية قابلة للقياس، ثم اختبر happy path وحالة timeout وحالة إعادة التشغيل. يجب أن يكون واضحًا ما إذا كانت الخطوة قابلة للتكرار بأمان، وما الذي يحدث إذا نُفذت مرتين، وأين تحفظ حالة التقدم. بعد ذلك شغّل السيناريو على بيانات اختبار لا على حساب إنتاجي، وسجّل سبب كل retry والوقت المستغرق. هذه التفاصيل تمنع نجاحًا ظاهريًا في أول تشغيل ثم فشلًا صعب التفسير عندما تعمل المهام بالتوازي أو تستأنف بعد crash.
قائمة مراجعة
- بداية ونهاية واضحتان.
- Retry محدود ومسبب.
- اختبار تنفيذ الخطوة مرتين.
- استعادة بعد restart أو crash.
شارك في تقييم ونقاش المقال
رأيك يضيف قيمة للمقال ويساعدنا على تحسين المحتوى والنقاش حوله.
النقاش
جارٍ تحميل التعليقات…