تحقق من وجود العنصر وانتظر الأمر Selenium

⚡ ملخص ذكي

تحقق من وجود العنصر وانتظر الأوامر في Selenium تقوم بيئة التطوير المتكاملة (IDE) بالتأكد من أن الصفحة تحتوي على العناصر والنصوص التي يتوقعها الاختبار، وتوقف التشغيل مؤقتًا حتى يصبح شرط ديناميكي صحيحًا قبل تشغيل الخطوة التالية.

  • 🔘 عمليات التحقق من العناصر: تقوم الدالة verifyElementPresent بإرجاع القيمة TRUE عندما يتطابق المحدد مع شيء ما في الصفحة، بينما تقوم الدالة verifyElementNotPresent بإرجاع القيمة العكسية تمامًا.
  • ☑️ التحقق من النصوص: تقوم دالة verifyTextPresent بالبحث في الصفحة بأكملها وهي حساسة لحالة الأحرف، لذلك لا تتطابق كلمة "Atlanta" أبدًا مع كلمة "atlanta".
  • التحقق من الوضعية: تقوم الدالتان verifyElementPositionLeft و verifyElementPositionTop بمقارنة إزاحة البكسل للعنصر من حافة الصفحة.
  • 🧪 تحميل الصفحة: تقوم أوامر الانتظار مثل clickAndWait بإيقاف البرنامج النصي مؤقتًا حتى يتم تحميل صفحة جديدة.
  • 🛠️ المحتوى الديناميكي: تنتظر أوامر waitFor شرطًا ما بدلاً من تحميل الصفحة، وهو ما يناسب شاشات AJAX التي لا يتم إعادة تحميلها أبدًا.
  • 📊 بيئة التطوير المتكاملة الحالية: يقوم ملحق المتصفح بإعادة تسمية هذه الخطوات ويمنح كل أمر انتظار مهلة زمنية خاصة به تبلغ بالمللي ثانية.

تحقق من وجود العنصر وانتظر تنفيذ الأمر في Selenium IDE

مسجل Selenium IDE يقوم البرنامج النصي بالنقر والكتابة، لكنه لا يقرر من تلقاء نفسه ما إذا كان التطبيق قد تصرف بشكل صحيح أم لا. تقوم مجموعتان من الأوامر بهذه المهمة: تحقق من الأوامر التي تتحقق من حالة الصفحة، و انتظر الأوامر، التي توقف التنفيذ حتى تصبح الصفحة جاهزة للفحص.

⚠️ ملاحظة حول الإصدارات: لقطات الشاشة أدناه مأخوذة من النسخة الأصلية Firefox-توصيل في Selenium بيئة التطوير المتكاملة (IDE) التي لم تعد تُوزع، ويستخدمون أسماءها المكتوبة بأسلوب CamelCase Selenese. بيئة التطوير المتكاملة الحالية هي Chrome. Firefox والحافة ملحق المستعرضلا يزال السلوك الموصوف هنا ساريًا، ولكن تغيرت أسماء العديد من الأوامر - الخريطةping يظهر الجدول لاحقًا في هذه المقالة، ويتم الاحتفاظ بكل أمر أصلي ولقطة شاشة تمامًا كما تم نشرها.

التحقق من وجود عنصر

يمكننا استخدام الأمرين التاليين للتحقق من وجود عنصر:

  • VerelementPresent - يعود TRUE إذا تم العثور على العنصر المحدد في الصفحة؛ FALSE إذا كان الأمر خلاف ذلك
  • checkElementNotPresent – إرجاع TRUE إذا لم يتم العثور على العنصر المحدد في أي مكان في الصفحة؛ خطأ إذا كان موجودا.

يأخذ كلا الأمرين عنصرًا لتحديد المواقع في Target حقل - معرف، أو اسم، أو مُحدِّد CSS، أو نص رابط، أو كسباث التعبير — ولا يحتاج أي منهما إلى قيمة.

يتحقق البرنامج النصي للاختبار أدناه من وجود مربع نص اسم المستخدم داخل Mercury الصفحة الرئيسية للجولات السياحية بينما لا يوجد مربع نص الاسم الأول. مربع نص الاسم الأول هو في الواقع عنصر موجود في صفحة التسجيل في Mercury جولات، وليس في الصفحة الرئيسية.

Selenium نص برمجي لبيئة التطوير المتكاملة (IDE) يستخدم دالة verifyElementPresent في مربع اسم المستخدم ودالة verifyElementNotPresent في مربع الاسم الأول

لأن هؤلاء هم تحقق من الأوامر بدلاً من يجزم عند تنفيذ الأوامر، يُسجل الفشل في سجل النظام، وتستمر الخطوات المتبقية في التنفيذ. سيتم شرح هذا الفرق بالتفصيل لاحقًا.

التحقق من وجود نص معين في الأمر Selenium

لا يكفي دائمًا التحقق من وجود عنصر ما، فغالبًا ما يتطلب الاختبار تأكيد الكلمات المعروضة للمستخدم. ويغطي أمران نصيان هذه الحالة.

  • checkTextPresent - يعود TRUE إذا تم العثور على سلسلة النص المحددة في مكان ما في الصفحة؛ FALSE إذا كان الأمر خلاف ذلك
  • checkTextNotPresent – إرجاع TRUE إذا لم يتم العثور على السلسلة النصية المحددة في أي مكان في الصفحة؛ خطأ إذا تم العثور عليه

تذكر أن هذه الأوامر حساسة لحالة الأحرف.

يُظهر السجل أدناه نفس الصفحة التي تم فحصها مرتين باستخدام تهجئتين مختلفتين لنفس العبارة.

Selenium سجل بيئة التطوير المتكاملة يُظهر نجاح عملية التحقق من وجود النص (verifyTextPresent) من أتلانتا إلى لاس فيغاس وفشلها من أتلانتا إلى لاس فيغاس

في السيناريو أعلاه، تم التعامل مع عبارة "Atlanta to Las Vegas" بشكل مختلف عن عبارة "atlanta to Las Vegas" لأن حرف "A" في كلمة "Atlanta" كان كبيرًا في الأولى وصغيرًا في الثانية. عند استخدام أمر verifyTextPresent على كلتيهما، نجحت إحداهما بينما فشلت الأخرى.

التحقق من الموضع المحدد للعنصر

نادراً ما تتسبب عيوب التخطيط في تعطيل محدد الموقع، لذا فإن عمليات التحقق من الوجود لا تكتشفها. وتعمل أوامر تحديد الموضع على سد هذه الثغرة.

Selenium يشير IDE إلى موضع العنصر عن طريق قياس (بالبكسل) مدى بعده عن الحافة اليسرى أو العلوية لنافذة المتصفح.

  • VereElementPositionLeft - التحقق مما إذا كان العدد المحدد من وحدات البكسل يتطابق مع مسافة العنصر من الحافة اليسرى للصفحة. سيُرجع هذا خطأ إذا كانت القيمة المحددة لا تتطابق مع المسافة من الحافة اليسرى.
  • التحقق من موضع العنصر في الأعلى – التحقق مما إذا كان العدد المحدد من وحدات البكسل يتطابق مع مسافة العنصر من الحافة العلوية للصفحة. سيُرجع هذا خطأ إذا كانت القيمة المحددة لا تتطابق مع المسافة من الحافة العلوية.

يسجل النص البرمجي أدناه إزاحات البكسل المتوقعة في عمود القيمة.

Selenium خطوات بيئة التطوير المتكاملة باستخدام verifyElementPositionLeft و verifyElementPositionTop مع قيم البكسل في عمود القيمة

تعامل مع هذين الأمرين بحذر. يتغير مقدار الإزاحة بالبكسل بتغير حجم النافذة ومستوى التكبير/التصغير والخطوط المثبتة، لذا فإن قيمة ثابتة تنجح على جهاز ما قد تفشل على جهاز آخر.

انتظر الأوامر في Selenium

لا يمكن لأمر التحقق فحص سوى ما هو معروض على الشاشة، لذا فإن أي فحص يُجرى مبكرًا جدًا سيفشل حتى لو كان التطبيق يعمل. أما أوامر الانتظار فتحل مشكلة التوقيت هذه.

فيما يلي أنواع أوامر الانتظار في Selenium

وأوامر الانتظار

هذه هي الأوامر التي ستنتظر تحميل صفحة جديدة قبل الانتقال إلى الأمر التالي.

ومن الأمثلة على ذلك

  • انقر وانتظر
  • typeAndWait
  • حدد وانتظر

كل واحد منها عبارة عن أمر إجراء عادي مع إضافة لاحقة AndWait، كما توضح الخطوة المسجلة أدناه.

خطوة النقر والانتظار المسجلة مع الاستمرار في الضغط على Selenium يستمر تشغيل البرنامج النصي في بيئة التطوير المتكاملة حتى اكتمال تحميل الصفحة التالية

انتظر الأوامر

هذه هي الأوامر التي تنتظر حتى يصبح الشرط المحدد صحيحًا قبل المتابعة إلى الأمر التالي (بغض النظر عن تحميل صفحة جديدة). تعد هذه الأوامر أكثر ملاءمة للاستخدام على مواقع الويب الديناميكية المستندة إلى AJAX والتي تغير القيم والعناصر دون إعادة تحميل الصفحة بأكملها. الامثله تشمل:

  • waitForTitle
  • waitForTextPresent
  • waitForAlert

خذ بعين الاعتبار سيناريو الفيسبوك أدناه.

نموذج التسجيل في فيسبوك يوضح لماذا أحتاج إلى تقديم رابط تاريخ ميلادي قبل النقر عليه.

يمكننا استخدام مزيج من "النقر" و"waitForTextPresent" للتحقق من وجود النص "توفير عيد ميلادك".

Selenium خطوات IDE: انقر مع waitForTextPresent لانتظار ظهور نص تاريخ ميلادك

لا يمكننا استخدام clickAndWait لأنه لم يتم تحميل أي صفحة عند النقر على "لماذا أحتاج إلى تقديم تاريخ ميلادي؟" وصلة. إذا فعلنا ذلك، فسوف يفشل الاختبار

وينطبق نفس المبدأ على أي محتوى يتم إدخاله بواسطة البرامج النصية بدلاً من التنقل، ولهذا السبب شاشات تعمل بتقنية AJAX نحتاج دائمًا تقريبًا إلى استخدام waitFor بدلاً من andWait.

أوامر Assert و Verify و waitFor في Selenium IDE

غالباً ما يختار المبتدئون العائلة الخاطئة ثم يتساءلون لماذا تتوقف المجموعة عند أول عيب، أو لماذا تُبلغ عن عشرين عطلاً جميعها tracنعود إلى واحد. تجيب البادئات الثلاث على ثلاثة أسئلة مختلفة.

بادئة ماذا يفعل في حالة الفشل أفضل يستخدم لـ
يجزم يفحص الحالة على الفور يسجل الفشل ويوقف حالة الاختبار الشروط المسبقة - عملية تسجيل دخول يجب أن تنجح قبل أن يصبح أي شيء آخر منطقيًا
تحقق من يفحص الحالة على الفور يسجل الفشل ويتابع تنفيذ الأمر التالي عمليات التحقق المستقلة، مثل وجود عدة ملصقات على صفحة تأكيد واحدة
انتظر استطلاعات الرأي حتى يتحقق الشرط يسجل الفشل بمجرد انتهاء المهلة، ثم يتابع. أي شيء يظهر متأخراً - استجابات AJAX، ومؤشرات التحميل، والحوارات

يجمع نمط عملي بين العناصر الثلاثة: التحقق من الصفحة التي وصلت إليها، وانتظار العنصر الذي يصل بشكل غير متزامن، ثم التحقق من كل حقل على حدة. يؤدي القيام بذلك بهذا الترتيب إلى إيقاف الاختبار مبكرًا في حالة وجود خلل في التنقل، بينما يتم الإبلاغ عن عدد قليل من حالات عدم التطابق الشكلية في تشغيل واحد. وينطبق نفس المبدأ على Selenium الاختبارات المكتوبة بلغة البرمجة، حيث تكون المكافئات هي التأكيدات الصارمة والتأكيدات المرنة والانتظارات الصريحة.

أوامر التحقق والانتظار في الوضع الحالي Selenium IDE

استخدم Firefoxتم إيقاف دعم إضافة IDE التي أنتجت لقطات الشاشة أعلاه، وأُعيد بناء مجموعة الأوامر لتتوافق مع إضافة المتصفح الحالية. وقد بقيت بعض الأسماء من لغة سيلين، بينما أُعيد تسمية بعضها الآخر، وحُذف عدد قليل منها. يوضح الجدول أدناه العلاقة بين الأوامر المستخدمة في هذه المقالة وما يقابلها في الوقت الحاضر، والمأخوذة من المصدر الرسمي. Selenium مرجع أوامر بيئة التطوير المتكاملة.

أمر سيليني قديم الأمر في بيئة التطوير المتكاملة الحالية
VerelementPresent التحقق من وجود العنصر
checkElementNotPresent تم التحقق من عدم وجود العنصر
checkTextPresent التحقق من النص (ضمن نطاق محدد العنصر، وليس الصفحة بأكملها)
checkTextNotPresent التحقق من عدم وجود نص (ضمن نطاق محدد العنصر)
تحقق من العنوان تحقق من العنوان
verifyElementPositionLeft / verifyElementPositionTop لا يوجد ما يعادل ذلك - تم إسقاط تأكيدات الموقف
انقر وانتظر، اكتب وانتظر، حدد وانتظر لا يوجد لاحقة AndWait — أمر الفتح ينتظر بالفعل تحميل الصفحة
waitForElementPresent انتظر حتى يظهر العنصر، مع وقت انتظار بالمللي ثانية
waitForAlert تأكيد التنبيه أو التحقق من نص التنبيه بعد ظهور مربع الحوار

هناك فرقان رئيسيان يؤثران بشكل كبير على العمل اليومي. أولاً، أوامر الانتظار الحالية - مثل انتظار وجود العنصر، وانتظار ظهور العنصر، وانتظار إمكانية تحرير العنصر، وما يقابلها من أوامر سلبية - تتطلب كل منها مدة انتظار محددة بالمللي ثانية، لذا لم تعد الخطوات البطيئة تعتمد على مهلة زمنية عامة واحدة. ثانياً، تم الاستغناء عن البحث النصي على مستوى الصفحة: فالتحقق من النص يتطلب مُحدد موقع، وهو ما يُنتج عادةً فحصاً أدق.

الأخطاء الشائعة في أوامر التحقق والانتظار

معظم المشاكل المُبلغ عنها مع هذه الأوامر ليست عيوبًا في بيئة التطوير المتكاملة (IDE). تتضمن القائمة أدناه الأخطاء الأكثر شيوعًا وكيفية إصلاح كل منها.

  • العنصر موجود ولكن الفحص لا يزال يفشل. الوجود والرؤية حالتان مختلفتان. العنصر المخفي خلف قاعدة CSS يظل موجودًا في DOM، لذا يجب ربط فحص الوجود بانتظار ظهور العنصر عندما يعتمد الاختبار على رؤية المستخدم له فعليًا.
  • يفشل فحص النص عند وجود عبارات تبدو متطابقة. المسافات غير القابلة للكسر، والمسافات البيضاء الزائدة، وعلامات الترقيم المائلة المنسوخة من مستند تصميم، كلها تُفسد التطابق التام. أعد كتابة النص المطلوب يدويًا بدلًا من لصقه.
  • أمر الانتظار ينتهي بمهلة زمنية على صفحة تم تحميلها بوضوح. عادةً ما يكون العنصر داخل إطار iframe. قم بتشغيل الأمر select frame أولاً، وإلا سيتم تقييم المحدد على المستند الخاطئ.
  • تطبيق clickAndWait يتوقف عند صفحة واحدة. لا يحدث أي تنقل، لذا لا يوجد ما يستدعي الانتظار. استبدل ذلك بنقرة متبوعة بأمر الانتظار المناسب.
  • ينجح فحص الموقع محليًا ويفشل على خادم البناء. يختلف حجم الشاشة وعرض الخطوط. يُفضّل استخدام فحص وجود العناصر أو فحص النص، أو تحديد حجم نافذة صريح في بداية الاختبار.
  • تتوقف المجموعة بأكملها عند أول اختلاف. تم تسجيل أمر تأكيد في مكان كان من المفترض أن يكون أمر تحقق. قم بتغيير البادئة وسيقوم البرنامج بالإبلاغ عن كل فشل بدلاً من الفشل الأول فقط.

بمجرد أن ينجو البرنامج النصي من هذه الفخاخ، فإن الخطوة التالية عادة ما تكون قم بتخزين قيم وقت التشغيل في متغيرات لذا فإن عمليات التحقق تقارن بالبيانات الحقيقية بدلاً من السلاسل النصية المضمنة في الكود.

الأسئلة الشائعة

كانت بيئة التطوير المتكاملة القديمة تشترك في مهلة زمنية عامة واحدة لجميع خطوات الانتظار، ويتم تغييرها باستخدام الأمر setTimeout. أما الإضافة الحالية فتأخذ وقت انتظار محدد بالمللي ثانية في كل أمر انتظار، لذا لم يعد وجود شاشة واحدة بطيئة يجبر كل خطوة أخرى على الانتظار لفترة طويلة.

لا. خاصية الإيقاف المؤقت تُبقي التطبيق في وضع السكون طوال المدة المحددة، لذا فهي تُهدر الوقت حتى عندما تكون الصفحة سريعة، وتفشل حتى عندما تكون بطيئة. استخدمها فقط لتوضيح خطوة معينة خلال عرض توضيحي، وليس في مجموعة تطبيقات تنوي تشغيلها بشكل متكرر.

لا، ليس الأمر كذلك. تعني خاصية "الوجود" أن العنصر موجود في نموذج كائن المستند (DOM)، وهذا ينطبق على العناصر المخفية بواسطة CSS أو الموجودة خارج الشاشة. عندما يعتمد الاختبار على رؤية المستخدم لعنصر ما، أضف شرط "انتظار ظهور العنصر" إلى جانب فحص الوجود.

نعم، ويتطلب ذلك بيئة التطوير المتكاملة الحالية. يأخذ أمر التحقق من النص مُحدد العنصر بالإضافة إلى السلسلة المتوقعة، وهو أمر أكثر صرامة من البحث القديم على مستوى الصفحة، ويمنع عنصر قائمة غير ذي صلة من استيفاء شرط لم يكن من المفترض أن يستوفيه أصلًا.

Code تُحوّل عملية التصدير كل أمر إلى عبارة مكافئة في اللغة المستهدفة، بحيث تصبح خطوة الانتظار انتظارًا صريحًا في WebDriver. اقرأ الملف المُنشأ قبل الوثوق به، لأن مهل الانتظار وسلوك الفشل (سواءً كان فشلًا برمجيًا أو برمجيًا) لا تبقى دائمًا سليمة بعد الترجمة.

تقرأ نماذج التعلم الآلي بيانات التشغيل السابقة وتُشير إلى الخطوات التي تفشل بشكل متقطع بدلاً من فشلها باستمرار، وهو ما يُعد مؤشراً على وجود انتظار مفقود. أما إصلاح المُحدد بمساعدة الذكاء الاصطناعي فيعالج السبب الشائع الآخر من خلال اقتراح مُحدد جديد عند تغيير الترميز.

إنه يتعامل مع الجزء الميكانيكي بشكل جيد - حيث يحول خطوة الانتظار إلى WebDriverWait مع شرط متوقع. Revانظر إلى المهلة الزمنية التي يختارها والشرط الذي يختاره، حيث أن شرط التواجد الذي تم إنشاؤه غالباً ما يحتاج إلى أن يكون شرط رؤية بدلاً من ذلك.

يتم تقييم محددات المواقع مقابل المستند المحدد حاليًا، والإطار المضمن (iframe) هو عنصر منفصل. شغّل أمر تحديد الإطار أولًا، ثم أمر التحقق، ثم ارجع إلى المستند الرئيسي بعد ذلك حتى لا يتم البحث في الخطوات التالية في سياق خاطئ.

تلخيص هذه التدوينة بـ: