معالجة الاستثناءات في Selenium برنامج تشغيل الويب (الأنواع)

⚡ ملخص ذكي

معالجة الاستثناء في Selenium يمنع برنامج WebDriver إيقاف تنفيذ أمر فاشلping تجربة تشغيل كاملة. Java تُعطي عبارة try-catch، وكتل catch المتعددة، و throw، و throws، وأخيرًا كل منها البرنامج النصي طريقة مختلفة للتعافي.

  • 🔘 فريف: الاستثناء هو خطأ يحدث أثناء تنفيذ البرنامج، والاستثناء غير المعالج يؤدي إلى تعطل البرنامج.
  • ☑️ مجال العمل Selenium يحتوي WebDriver على أكثر من أربعين فئة استثناء، وكلها تنحدر من WebDriverException.
  • المخالفون المتكررون: تتسبب استثناءات NoSuchElementException و TimeoutException و StaleElementReferenceException و ElementNotInteractableException في معظم حالات الفشل في العالم الحقيقي.
  • 🧪 التعامل مع المواد: يعمل زوج try-catch على عزل نوع واحد من الأخطاء، وتفصل كتل catch المتعددة بين عدة أنواع، وفي النهاية يتم التنفيذ دائمًا.
  • 🛠️ التصعيد: تقوم الكلمتان المفتاحيتان throw و throws بإرجاع استثناء إلى المستدعي عندما لا تستطيع الطريقة الحالية حله.
  • 📊 التشخيص: printStackTracتقوم كل من e() و toString() و getMessage() بالإبلاغ عن مستوى مختلف من التفاصيل حول الفشل.

معالجة الاستثناء في Selenium WebDriver مع try-catch و throw و finally

ما هو الاستثناء؟

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

يشير الاستثناء إلى أنه على الرغم من إمكانية وقوع الحدث، إلا أن هذا النوع من الأحداث نادر الحدوث. عندما لا تتمكن إحدى الدوال من معالجة الاستثناء، يتم طرحه إلى الدالة التي استدعته. Javaوهو ما يدفع معظم Selenium في مجموعات البرامج، يتم عدم فحص كل استثناء WebDriver، لذلك لا يجبرك المترجم أبدًا على التقاطه - يظهر الفشل غير المعالج فقط في وقت التشغيل.

أنواع الاستثناءات في Selenium ويب درايفر

يُعدّ WebDriverException الفئة الأساسية في التسلسل الهرمي، وكل استثناء أدنى منه يرث منه. يسرد الجدول جميع الاستثناءات الـ 41 التي قد تواجهها، بالإضافة إلى الشرط الذي يُثير كل استثناء.

# استثناء عندما يحدث ذلك
1 ElementNotVisibleException يحتوي عنصر موجود في DOM على مجموعة ميزات مخفية.
2 استثناء العنصر غير القابل للتحديد العنصر موجود في DOM ولكن لا يمكن تحديده، لذا فإن التفاعل معه مستحيل.
3 NoSuchElementException لم يتم العثور على العنصر باستخدام لتحديد المواقع زودت.
4 استثناء NoSuchFrameException استخدم هيكل الهدف المراد التحويل إليه غير موجود.
5 NoAlertPresentException التحول إلى إنذار يتم تشغيله عندما لا يتم عرض أي تنبيه.
6 NoSuchWindowException نافذة الهدف المراد التبديل إليها غير موجودة.
7 استثناء مرجع العنصر القديم تم فصل عنصر الويب عن العنصر الحالي DOM.
8 استثناء عدم العثور على الجلسة يتصرف برنامج تشغيل الويب بعد إغلاق المتصفح.
9 TimeoutException لم يكتمل أحد الأوامر في الوقت المحدد - على سبيل المثال، لم يتم العثور على العنصر الذي تم البحث عنه خلال فترة الانتظار.
10 WebDriverException الفئة الأساسية لاستثناءات WebDriver الأخرى؛ يتم طرحها أيضًا عندما يتصرف WebDriver مباشرة بعد إغلاق المتصفح.
11 استثناء إغلاق الاتصال يوجد خلل في برنامج التشغيل.
12 تم قبول استثناء ElementClickInterceptedException العنصر الذي يستقبل الأحداث يخفي العنصر المطلوب للنقر.
13 استثناء ElementNotInteractableException العنصر موجود في DOM، ولكن من المستحيل التفاعل معه.
14 خطأ في الاستجابة حدث خطأ ما أثناء التفاعل مع Firefox ملحق أو خادم برنامج التشغيل البعيد.
15 ErrorHandler.UnknownServerException يُستخدم كعنصر نائب عندما يُرجع الخادم خطأً بدون تتبع للمكدس. trace.
16 ImeActivationFailedException فشل تفعيل محرك IME.
17 استثناء ImeNotAvailableException دعم IME غير متوفر.
18 استثناء الشهادة غير الآمنة أدى التنقل إلى وصول وكيل المستخدم إلى تحذير بشأن الشهادة، وهو ما يمكن أن يتسبب فيه وجود شهادة TLS غير صالحة أو منتهية الصلاحية.
19 InvalidArgumentException لا ينتمي الوسيط إلى النوع المتوقع.
20 استثناء نطاق ملف تعريف الارتباط غير الصالح A كوكي تمت إضافتها تحت نطاق مختلف بدلاً من النطاق الحالي URL.
21 استثناء الإحداثيات غير الصالحة العملية المتفاعلة المطابقة غير صالحة.
22 استثناء حالة العنصر غير الصالح لا يمكن إكمال الأمر لأن العنصر غير صالح.
23 استثناء معرف الجلسة غير الصالح معرف الجلسة المحدد ليس من بين الجلسات النشطة، لذا فهو غير موجود أو غير نشط.
24 مفتاح تبديل غير صالحTargetاستثناء الإطار أو النافذة المستهدفة المراد التبديل إليها غير موجودة.
25 Javascriptاستثناء حدث خطأ أثناء التنفيذ Javaالنص المقدم من قبل المستخدم.
26 JsonException يتم طلب الجلسة عندما لا تكون الجلسة قد تم إنشاؤها.
27 استثناء عدم وجود سمة لم يتم العثور على سمة العنصر.
28 تحركTargetOutOfBoundsException الهدف المقدم إلى طريقة ActionChains move() غير صالح - على سبيل المثال، خارج المستند.
29 استثناء NoSuchContextException لا يستطيع برنامج ContextAware، الذي يقوم باختبار الأجهزة المحمولة، العثور على السياق المطلوب.
30 استثناء NoSuchCookieException لم يتم العثور على أي ملف تعريف ارتباط يطابق اسم المسار المحدد بين ملفات تعريف الارتباط الخاصة بالمستند الذي يتم تصفحه حاليًا.
31 لم يتم العثور على استثناء فئة فرعية من WebDriverException، يتم طرحها عندما لا يكون عنصر ما موجودًا في DOM.
32 استثناء خادم برنامج التشغيل عن بعد الخادم لا يستجيب لأن الإمكانيات الموصوفة غير مناسبة.
33 استثناء لقطة الشاشة ليس من الممكن التقاط الشاشة.
34 استثناء SessionNotCreatedException تعذر إنشاء جلسة جديدة بنجاح.
35 استثناء تعذر تعيين ملف تعريف الارتباط لا يستطيع السائق تعيين ملف تعريف ارتباط.
36 استثناء اسم الوسم غير المتوقع لم تحصل فئة الدعم على عنصر ويب كما هو متوقع.
37 استثناء تنبيه غير معالج يوجد تنبيه، لكن برنامج WebDriver غير قادر على تنفيذ عملية التنبيه.
38 استثناء عرض تنبيه غير متوقع يظهر تنبيه غير متوقع.
39 استثناء طريقة غير معروفة الأمر المطلوب يطابق أمراً معروفاً URL لكن ليس هناك طريقة لذلك تحديداً URL.
40 استثناء المتصفح غير القابل للوصول لا يمكن فتح المتصفح، أو أنه تعطل لسبب ما.
41 استثناء الأمر غير المدعوم لا يرسل برنامج تشغيل الويب البعيد أوامر صحيحة كما هو متوقع.

ثلاثة عوامل تهيمن على عملية تصحيح الأخطاء اليومية: NoSuchElementException تعني خطأً كسباث أو عنصر لم يتم عرضه، يعني TimeoutException أن فترة الانتظار قصيرة جدًا بالنسبة لـ AJAX استجابة، ويتبع ذلك استثناء StaleElementReferenceException ديناميكي إعادة العرض.

كيفية التعامل مع الاستثناءات في Selenium

فيما يلي البنى القياسية للتعامل مع الاستثناءات في Selenium WebDriver. كل منها بسيط Javaلذا فهو يعمل في أي نص WebDriver بدون مكتبات إضافية.

الخطوة 1) حاول الالتقاط

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

try
{
// Code
} catch (Exception e) {
// Code for Handling exception
}

الخطوة 2) كتل الصيد المتعددة

توجد أنواع مختلفة من الاستثناءات، ويمكن لكتلة برمجية واحدة أن تُثير أكثر من استثناء. تتيح لك كتل catch المتعددة معالجة كل نوع على حدة باستخدام كود خاص به. يمكنك استخدام أكثر من كتلتين catch، ولا يوجد حد أقصى لعدد الكتل التي يمكنك إضافتها.

try
{
//Code
} catch (ExceptionType1 e1) {
//Code for Handling Exception 1
} catch (ExceptionType2 e2) {
//Code for Handling Exception 2
}

الخطوة 3) رمي

عند الرغبة في توليد استثناء، تُستخدم الكلمة المفتاحية `throw` لتمريره ليتم التعامل معه أثناء التشغيل. استخدم `throw` عند تمرير استثناء إلى جهة أخرى بدلاً من حله في الدالة الحالية.

public static void anyFunction() throws Exception{

try {
// write your code here
} catch (Exception b) {
// Do whatever you want to perform 
// Throw the Exception back to the system
throw(b);
}
}

الخطوة 4) استثناءات متعددة

يمكنك ذكر استثناءات مختلفة في عبارة throws.

public static void anyFunction() throws ExceptionType1, ExceptionType2{

try {
// write your code here
} catch (ExceptionType1 e1) {
// Code to handle exception 1
} catch (ExceptionType2 e2) {
// Code to handle exception 2
}

الخطوة 5) وأخيرا

تُنشئ الكلمة المفتاحية finally كتلةً برمجيةً أسفل كتلة try. ويتم تنفيذها بغض النظر عما إذا حدث استثناء أم لا، مما يجعلها المكان المناسب لإغلاق برنامج تشغيل أو تحرير مؤشر ملف.

try {
//Code
} catch (ExceptionType1 e1) {
//Catch block
} catch (ExceptionType2 e2) {
//Catch block
} catch (ExceptionType3 e3) {
//Catch block
} finally {
//The finally block always executes.
}

طرق عرض معلومات الاستثناء

بمجرد اكتشاف استثناء، يحمل الكائن نفسه تفاصيل التشخيص. يمكنك استخدام الطرق التالية لعرضها:

الأسلوب ما يُبلغه
printStackTracه () يطبع المكدس tracهـ، اسم الاستثناء ووصف مفيد آخر.
إلى سلسلة() يُعيد رسالة نصية تصف اسم الاستثناء ووصفه.
getMessage () يعرض وصف الاستثناء بشكل منفصل.

قم بإقران هذه مع لقطة شاشة تم التقاطها داخل كتلة catch، وسيظهر التشغيل الفاشل كل من ما تعطل وكيف بدت الصفحة.

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

جميع استثناءات WebDriver غير مُدققة، لأنها جميعًا ترث من RuntimeException عبر WebDriverException. لذلك، لا يطلب المُصرّف أبدًا استخدام try-catch، وهو أمر مُريح، ولكنه يعني أيضًا أن فشل مُحدد الموقع غير المُحمي لا يظهر إلا عند تشغيل الاختبار فعليًا.

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

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

Selenium يحافظ الإصدار 4 على نفس التسلسل الهرمي، ولكن دوال إنشاء الانتظار تأخذ الآن مدة زمنية بدلاً من مهلة زمنية عددية، ويعني التحقق الأكثر صرامة من صحة وسيطات W3C ظهور استثناء InvalidArgumentException للقيم التي Selenium تم قبول 3 بدون شكوى.

محركات تحديد المواقع ذاتية الإصلاح track التي تتعطل المحددات وتستبدلها ببديل يعمل، مما يقلل من نسبة كبيرة من حالات فشل NoSuchElementException. نماذج مماثلة تجمع المكدس المتكرر tracلذا فإن العيب الجديد الحقيقي لا يُدفن بين عمليات إعادة التشغيل المتقطعة.

يتميز Copilot بقوة في استخدام التعليمات البرمجية الجاهزة - هيكل try-catch، وسلسلة catch بالترتيب الصحيح، وكتلة finally التي تُنهي عمل برنامج التشغيل. لا يمكنه معرفة الاستثناءات التي يُطلقها تطبيقك، لذا راجع كل استثناء تم إنشاؤه.

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

قم بتحويل نوع برنامج التشغيل إلى TakesScreenshot داخل كتلة catch أو finally، واكتب الملف قبل إغلاق الجلسة. تسمية الصورة باسم طريقة الاختبار تجعل تشغيل التكامل المستمر الفاشل قابلاً للقراءة دون الحاجة إلى إعادة إنتاج الخطأ محليًا.

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