كيفية استخدام JavaScriptExecutor في Selenium

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

ومع ذلك، هناك سيناريوهات يحدث فيها أن الأوامر الفعلية لـ مشغل سيلينيوم لا تعمل كما هو متوقع، حيث لا يمكن لـ سيلينيوم التفاعل مباشرة مع عناصر الويب. هنا يأتي دور JavaScriptExecutor.

في هذه المدونة، سنناقش JavaScriptExecutor في سيلينيوم وكيفية البدء مع حالات الاستخدام العملية والأمثلة.

ما هو JavaScriptExecutor في سيلينيوم؟

JavaScriptExecutor هو واجهة توفرها سيلينيوم تساعد في تنفيذ أوامر JavaScript. توفر هذه الواجهة طرق لتشغيل JavaScript على النافذة المحددة أو الصفحة الويب الحالية. وهي متاحة لجميع ربطات اللغة المدعومة بواسطة سيلينيوم.

يمكن استخدام JavaScriptExecutor في سيلينيوم مباشرة عن طريق استيراد الحزمة التالية في نصوص اختبار الأتمتة:

Java

 

JavaScriptExecutor في سيلينيوم يوفر طريقتين للتفاعل مع عناصر الويب:

  • executeScript() – تنفيذ JavaScript في سياق النافذة أو الإطار المحدد حاليًا في سيلينيوم. سيتم تنفيذ النص كجسم لدالة مجهولة.
  • executeAsyncScript()  هذا الأسلوب ينفذ مقطعًا من JavaScript بشكل غير متزامن في سياق النافذة أو الإطار المُحدد حاليًا في Selenium. سيتم تنفيذ السكربت كجسم لدالة مجهولة.

ملاحظة: الفرق الرئيسي بين الأساليب executeScript() و executeAsyncScript() هو أن السكربت الذي يتم استدعاؤه باستخدام executeAsyncScript() يجب أن يُشير عن انتهاء التنفيذ باستخدام دالة callback().

يتم استخدام استدعاء الأساليب باستخدام executeAsyncScript() بشكل رئيسي عندما يجب أن يتم تنفيذ تأخير في المتصفح تحت الاختبار أو عندما يجب تزامن الاختبارات داخل تطبيق AJAX.

لماذا استخدام JavaScriptExecutor في Selenium؟

هناك سيناريوهات حيث لا تعمل بعض أوامر WebDriver كما هو متوقع بسبب أسباب متعددة، كما يلي:

  1. عدم تفاعل Selenium مع عناصر الويب مباشرة
  2. القيام بإجراءات مثل التمرير إلى العرض، النقر على عناصر الويب التي تكون مخفية وراء الضبابية، أو تعيين قيم في حقول القراءة فقط
  3. القيام بسلوكيات تخصصية للمتصفح مثل تعديل DOM بشكل ديناميكي

في هذه الحالات، نلجأ إلى JavaScriptExecutor في Selenium.

تقليديًا، نستخدم محددات سيلينيوم مثل الهوية، الاسم، محدد CSS، XPath، إلخ، لتحديد عنصر ويب. إذا لم تعمل هذه المحددات، أو كنت تتعامل مع XPath صعب، في مثل هذه الحالات، يساعد JavaScriptExecutor في تحديد عنصر ويب المطلوب.

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

كما نعلم، تحتوي المتصفحات على تنفيذ JavaScript بداخلها ويمكنها فهم أوامر JavaScript. لذلك، فهم JavaScriptExecutor في سيلينيوم سيمكننا من أداء مجموعة من العمليات بشكل أكثر كفاءة.

أساسيات JavaScriptExecutor في سيلينيوم

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

دعونا نلقي نظرة على الخطوات الرئيسية.

1. استيراد الحزمة المرتبطة بـ JavaScriptExecutor:

Java

 

2. استخدام JavaScriptExecutor، إنشاء مرجع للواجهة، وتعيينه لمثيل WebDriver عن طريق تحويل النوع:

Java

 

3. استدعاء طرق executeAsyncScript() أو executeScript() . على سبيل المثال، الصيغة لـ executeScript() معروضة أدناه:

Java

 

عرض توضيحي: استخدام JavaScriptExecutor في سيلينيوم

قبل أن ننظر إلى كيفية استخدام JavaScriptExecutor في سيلينيوم، اتبع هذه الشروط المسبقة:

  • إنشاء مشروع Maven جديد باستخدام بيئة IntelliJ IDE
  • إضافة تبعية أحدث لمكتبة Selenium WebDriver في ملف pom.xml
  • إضافة تبعية أحدث لمكتبة TestNG في ملف pom.xml

سنستخدم موقع LambdaTest eCommerce Playground لعرض عمل JavaScriptExecutor في سيلينيوم من خلال تشغيل الاختبارات على متصفح Chrome المحلي.

سيناريو الاختبار 1

هدفنا هو كتابة كود بسيط لتوضيح مثال باستخدام طريقة executeScript() باستخدام السيناريو الاختباري التالي.

  1. الانتقال إلى صفحة تسجيل الدخول للحساب على موقع LambdaTest eCommerce Playground.
  2. إدخال بيانات تسجيل الدخول الصحيحة والنقر على زر تسجيل الدخول عن طريق تحديد الحقل بحدود حمراء.
  3. طباعة عنوان الصفحة واسم النطاق.
  4. التأكد من أن عنوان الصفحة “حسابي” يتم عرضه عند تسجيل الدخول بنجاح.

التنفيذ

أنشئ فئة TestJavaScriptExecutor جديدة لتنفيذ سيناريو الاختبار. سنقوم أولاً بإنشاء طريقتين في هذه الفئة الاختبارية تسمح لنا بإعداد وإنهاء جلسات Selenium WebDriver بشكل لائق.

لنعلن عن WebDriver على مستوى الفئة حيث سنحتاج إليه في كلتا الطريقتين، أي الطريقة setup() لبدء جلسة السائق والطريقة tearDown() لإنهاء الجلسة بشكل لائق.

Java

 

لننشئ طريقة setup() جديدة ستنشئ نسخة من فئة WebDriver وتعين التكوين وفقًا لتشغيل الاختبارات على متصفح Chrome المحلي.

Java

 

سيقوم هذا الطريقة بفتح متصفح Chrome، وتكبير نافذته، وتطبيق انتظار ضمني لمدة 30 ثانية. سيسمح هذا الانتظار الضمني بتحميل جميع محتويات الموقع بنجاح قبل بدء تنفيذ الاختبار.


Java

 

أخيرًا، عند تنفيذ الاختبار، سيتم استدعاء الطريقة tearDown() التي ستغلق جلسة RemoteWebDriver بشكل لائق.

لنضيف الآن طريقة testJavaScriptExecutorCommand()  في نفس فئة الاختبار لتنفيذ السيناريو الذي ناقشناه.

Java

 

الكود يتصفح صفحة تسجيل الدخول إلى موقع LambdaTest eCommerce Playground. السطر التالي يقوم بتحويل نسخة WebDriver إلى JavascriptExecutor بحيث يمكن تنفيذ أوامر JavaScript في المتصفح.

Java

 

بعد ذلك، يحدد الحقل emailAddressField باستخدام استراتيجية تحديد الـ id. ثم، يستخدم أمر JavascriptExecutor لتمييز حدود حقل عنوان البريد الإلكتروني بلون أحمر.

Java

 

ثم يتم تحديد حقل كلمة المرور وتمييزه بحدود حمراء. يساعد هذا التمييز في معرفة الخطوات التي يتم تنفيذها أثناء تنفيذ اختبار الأتمتة.

Java

 

بالمثل، يتم تحديد زر تسجيل الدخول باستخدام استراتيجية محدد CSS ويتم تمييزه أيضًا.

Java

 

يتم تحديد عنوان الصفحة واسم النطاق بعد ذلك باستخدام JavaScriptExecutor ويتم طباعتهما على وحدة التحكم.

Java

 

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

فيما يلي الكود الكامل من فئة TestJavaScriptExecutor:

Java

 

تنفيذ الاختبار

تظهر اللقطة الشاشية التالية من بيئة IntelliJ IDE أن الاختبار تم تنفيذه بنجاح.

سيناريو الاختبار 2

هدفنا هو كتابة كود بسيط لتوضيح مثال باستخدام طريقة executeAsyncScript() باستخدام السيناريو الاختباري التالي.

  1. انتقل إلى موقع LambdaTest eCommerce Playground.
  2. انتقل لأسفل إلى أسفل الصفحة الرئيسية.
  3. قم بالتأكد من أن النص “FROM THE BLOG” معروض في الجزء السفلي من الصفحة.

التنفيذ:

أنشئ طريقة testExecuteAsyncScript() جديدة في فئة النص الحالية TestJavaScriptExecutor.

Java

 

سيتم تصفح الكود إلى الصفحة الرئيسية لموقع لامبدا-تيست للتجارة الإلكترونية. سيتم استدعاء الطريقة executeAsyncScript() من JavaScriptExecutor بعد ذلك، حيث ستقوم بتنفيذ الإجراء للتمرير في النافذة.

في طريقة executeAsyncScript()، يجب أن توضح النصوص المُنفّذة أنها انتهت من خلال استدعاء الطريقة المُقدمة callback().

Java

 

بعد التمرير إلى أسفل النافذة، سيتم تحديد نص “FROM THE BLOG”، وسيتم إجراء تأكيد عليه.

Java

 

تنفيذ الاختبار

اللقطة الشاشة التالية تظهر أن الاختبار تم تنفيذه بنجاح.

أوامر لاستخدام JavaScriptExecutor في سيلينيوم

لنفحص بعض السيناريوهات التي يمكننا التعامل معها باستخدام واجهة JavaScriptExecutor لأتمتة اختبار سيلينيوم.

للنقر على زر:

Java

 

لكتابة نص في مربع نص دون استخدام الطريقة sendKeys() :

Java

 

للتعامل مع خانة الاختيار عن طريق تمرير القيمة كصحيحة أو خاطئة:

Java

 

لإنشاء نافذة تنبيه بوب فيب في مشغل سيلينيوم:

Java

 

لتحديث نافذة المتصفح باستخدام JavaScript:

Java

 

للحصول على النص الداخلي لصفحة الويب بأكملها في سيلينيوم:

Java

 

للحصول على عنوان صفحة الويب:

Java

 

للحصول على اسم النطاق:

Java

 

للحصول على عنوان URL لصفحة الويب:

Java

 

للحصول على ارتفاع وعرض صفحة الويب:

Java

 

للانتقال إلى صفحة مختلفة باستخدام JavaScript:

Java

 

  • للتمرير الصفحة عموديًا بمقدار 500 بكسل:
    جافا

     

  • للتمرير عموديا حتى النهاية:
    جافا

إضافة عنصر في نموذج الكائنات في الوثيقة (DOM):

Java

 

للحصول على جذر الظل في DOM:

Java

 

الاستنتاج

لدى Selenium واجهة تسمى JavaScriptExecutor تُستخدم عندما لا تعمل أوامر WebDriver كما هو مقصود. بمساعدة JavaScriptExecutor، يمكننا استخدام WebDriver لتنفيذ رمز JavaScript على الموقع الإلكتروني، مما يسمح لنا بمعالجة مجموعة متنوعة من المهام بطريقة أنيقة وفعالة لا يمكن تحقيقها بالاعتماد فقط على Java.

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

Source:
https://dzone.com/articles/how-to-use-javascriptexecutor-in-selenium