JavaScriptExecutor في Selenium برنامج تشغيل الويب (مثال)

⚡ ملخص ذكي

JavaScriptExecutor في Selenium يقوم WebDriver بتشغيل Javaيتم تنفيذ البرنامج النصي داخل المتصفح عندما تفشل محددات المواقع. Lessتغطي هذه المقالة أمثلة على تنفيذ البرامج النصية، وتنفيذ البرامج النصية غير المتزامنة، والتمرير، والنقر، والتنبيهات، وإدخال النماذج.

  • ⚙️ حل النهايات: يتجاوز العناصر المخفية و Javaصفحات مليئة بالنصوص.
  • 🧩 طريقتان: يُنفذ executeScript العمليات المتزامنة؛ بينما يُنفذ executeAsyncScript العمليات غير المتزامنة عبر رد الاتصال.
  • 📜 التمرير: قم بتمرير النافذة، أو الانتقال إلى إحداثيات معينة، أو تمرير عنصر لعرضه.
  • 🖱️ نقرات مخفية: قم بتشغيل وظيفة النقر () على العناصر التي لا يستطيع WebDriver الوصول إليها.
  • 📝 التحكم في النموذج: قم بإدخال القيم وقراءة النصوص من العناصر المعقدة.
  • 🤖 مقتطفات الذكاء الاصطناعي: أدوات الذكاء الاصطناعي تولد Javaكتابة كود ScriptExecutor وإصلاح المحددات غير المستقرة.

JavaScriptExecutor في Selenium

ما هي تفاصيل JavaScriptExecutor؟

JavaScriptExecutor هي واجهة تساعد على التنفيذ Javaالنص من خلال Selenium برنامج تشغيل الويب. Javaيوفر ScriptExecutor طريقتين "executescript" و "executeAsyncScript" لتشغيل javascript على النافذة المحددة أو الصفحة الحالية.

JavaScriptExecutor

لماذا نحتاج JavaScriptExecutor؟

In Selenium يتم استخدام Webdriver، والمحددات مثل XPath، وCSS، وما إلى ذلك لتحديد العمليات على صفحة الويب وإجراءها عليها.

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

Selenium يدعم جافا سكريبت إكسيكتور. ليست هناك حاجة لمكون إضافي أو وظيفة إضافية. تحتاج فقط إلى الاستيراد (org.openqa.selenium.Javascriptالمنفذ) في البرنامج النصي للاستخدام JavaScriptExecutor.

Javaطرق ScriptExecutor في Selenium

تنفيذ سكريبت

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

يمكن للبرنامج النصي إرجاع القيم. أنواع البيانات التي تم إرجاعها هي

  • منطقية
  • طويل
  • خيط
  • قائمة
  • WebElement.

Javascriptبناء جملة المنفذ:

JavascriptExecutor js = (JavascriptExecutor) driver;  
js.executeScript(Script,Arguments);
  • سيناريو - هذا ال Javaنص يحتاج إلى التنفيذ.
  • الحجج - ومن الحجج للبرنامج النصي. إنه اختياري.

تنفيذ غير متزامن

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

طريقة الاستخدام JavaScriptExecutor في Selenium

فيما يلي عملية خطوة بخطوة حول كيفية الاستخدام JavaScriptExecutor في Selenium:

الخطوة 1) قم باستيراد الحزمة.

import org.openqa.selenium.JavascriptExecutor;

الخطوة 2) إنشاء مرجع.

JavascriptExecutor js = (JavascriptExecutor) driver;

الخطوة 3) اتصل ب Javascriptطريقة المنفذ .

js.executeScript(script, args);

مثال على النقر فوق عنصر باستخدام Javaسكريإكسيكتور في Selenium

بالنسبة لـexecuteScript، سنرى ثلاثة أمثلة مختلفة واحدًا تلو الآخر.

1) مثال: انقر فوق زر لتسجيل الدخول وإنشاء نافذة التنبيه باستخدام JavaScriptExecutor.

في هذا السيناريو سنستخدم "Guruموقع تجريبي بطول 99 بوصة للتوضيح JavaScriptExecutor. في هذا المثال،

  • قم بتشغيل متصفح الويب
  • افتح الموقع https://demo.guru99.com/V4/ و
  • تسجيل الدخول بأوراق اعتماد

انقر فوق زر لتسجيل الدخول وإنشاء نافذة تنبيه باستخدام JavaScriptExecutor

  • عرض نافذة التنبيه عند تسجيل الدخول الناجح.
import org.openqa.selenium.By;		
import org.openqa.selenium.JavascriptExecutor;		
import org.openqa.selenium.WebDriver;		
import org.openqa.selenium.WebElement;		
import org.openqa.selenium.firefox.FirefoxDriver;		
import org.testng.annotations.Test;		
    		
public class JavaSE_Test {				


    @Test		
    public void Login() 					
    {		
        WebDriver driver= new FirefoxDriver();			
        		
        //Creating the JavascriptExecutor interface object by Type casting		
        JavascriptExecutor js = (JavascriptExecutor)driver;		
        		
        //Launching the Site.		
        driver.get("https://demo.guru99.com/V4/");			
        		
        WebElement button =driver.findElement(By.name("btnLogin"));			
        		
        //Login to Guru99 		
        driver.findElement(By.name("uid")).sendKeys("mngr34926");					
        driver.findElement(By.name("password")).sendKeys("amUpenu");					
        		
        //Perform Click on LOGIN button using JavascriptExecutor		
        js.executeScript("arguments[0].click();", button);
                                
        //To generate Alert window using JavascriptExecutor. Display the alert message 			
        js.executeScript("alert('Welcome to Guru99');");   
    		
    }		
}

الإخراج: عندما يتم تنفيذ التعليمات البرمجية بنجاح. سوف تلاحظ

  • انقر بنجاح على زر تسجيل الدخول و
  • سيتم عرض نافذة التنبيه (انظر الصورة أدناه).

انقر فوق زر لتسجيل الدخول وإنشاء نافذة تنبيه باستخدام JavaScriptExecutor

2) مثال: التقاط البيانات والانتقال إلى صفحات مختلفة باستخدام JavaScriptExecutor.

قم بتنفيذ البرنامج النصي Selenium أدناه. في هذا المثال،

  • إطلاق الموقع
  • استخرج تفاصيل الموقع مثل URL اسم الموقع، وعنوانه، واسم نطاقه.
  • ثم انتقل إلى صفحة مختلفة.
import org.openqa.selenium.JavascriptExecutor;		
import org.openqa.selenium.WebDriver;		
import org.openqa.selenium.firefox.FirefoxDriver;		
import org.testng.annotations.Test;		
    		
public class JavaSE_Test {				

    @Test		
    public void Login() 					
    {		
        WebDriver driver= new FirefoxDriver();			
        		
        //Creating the JavascriptExecutor interface object by Type casting		
        JavascriptExecutor js = (JavascriptExecutor)driver;		
        		
        //Launching the Site.		
        driver.get("https://demo.guru99.com/V4/");
			
        //Fetching the Domain Name of the site. Tostring() change object to name.		
        String DomainName = js.executeScript("">return document.domain;").toString();			
        System.out.println("Domain name of the site = "+DomainName);					
          		
        //Fetching the URL of the site. Tostring() change object to name		
        String url = js.executeScript("">return document.URL;").toString();			
        System.out.println("URL of the site = "+url);					
          		
       //Method document.title fetch the Title name of the site. Tostring() change object to name		
       String TitleName = js.executeScript("">return document.title;").toString();			
       System.out.println("Title of the page = "+TitleName);					

        		
      //Navigate to new Page i.e to generate access page. (launch new url)		
      js.executeScript("window.location = 'https://demo.guru99.com/'");			
    }		
}

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

التقط بيانات كشط وانتقل إلى صفحات مختلفة باستخدام JavaScriptExecutor

[TestNG] Running:		
  C:\Users\gauravn\AppData\Local\Temp\testng-eclipse-467151014\testng-customsuite.xml		

log4j:WARN No appenders could be found for logger (org.apache.http.client.protocol.RequestAddCookies).		
log4j:WARN Please initialize the log4j system properly.		
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.		
Domain name of the site = demo.guru99.com		
URL of the site = https://demo.guru99.com/V4/		
Title of the page = Guru99 Bank Home Page		
PASSED: Login		

===============================================		
    Default test		
    Tests run: 1, Failures: 0, Skips: 0
===============================================

التقط بيانات كشط وانتقل إلى صفحات مختلفة باستخدام JavaScriptExecutor

3) مثال: قم بالتمرير لأسفل باستخدام JavaScriptExecutor.

قم بتنفيذ البرنامج النصي Selenium أدناه. في هذا المثال،

  • إطلاق الموقع
  • قم بالتمرير لأسفل بمقدار 600 بكسل
import org.openqa.selenium.JavascriptExecutor;		
import org.openqa.selenium.WebDriver;		
import org.openqa.selenium.firefox.FirefoxDriver;		
import org.testng.annotations.Test;		
    		
public class JavaSE_Test {				

    @Test		
    public void Login() 					
    {		
        WebDriver driver= new FirefoxDriver();			
        		
        //Creating the JavascriptExecutor interface object by Type casting		
        JavascriptExecutor js = (JavascriptExecutor)driver;		
        		
        //Launching the Site.		
        driver.get("http://moneyboats.com/");			
     
        //Maximize window		
        driver.manage().window().maximize();		
        		
        //Vertical scroll down by 600  pixels		
        js.executeScript("window.scrollBy(0,600)");			
    }		
}

الناتج: عند تنفيذ الكود أعلاه، سيتم تمريره لأسفل بمقدار 600 بكسل (انظر الصورة أدناه).

قم بالتمرير لأسفل باستخدام JavaScriptExecutor

مثال على executeAsyncScript في Selenium

يساعد استخدام executeAsyncScript على تحسين أداء الاختبار الخاص بك. فهو يسمح بكتابة الاختبار بشكل يشبه الترميز العادي.

إكسكSync يمنع المزيد من الإجراءات التي يتم تنفيذها بواسطة Selenium المتصفح ولكن execAsync لا يمنع الإجراء. سيرسل استدعاءً إلى جانب الخادم الاختبار جناح بمجرد الانتهاء من البرنامج النصي. وهذا يعني أن كل شيء داخل البرنامج النصي سيتم تنفيذه بواسطة المتصفح وليس الخادم.

مثال 1: تنفيذ وضع السكون في المتصفح قيد الاختبار.

في هذا السيناريو سنستخدم "Guruموقع تجريبي بحجم 99 بوصة لتوضيح وظيفة executeAsyncScript. في هذا المثال، ستتعلم كيفية القيام بذلك.

  • قم بتشغيل المتصفح.
  • افتح الموقع https://demo.guru99.com/V4/.
  • ينتظر التطبيق لمدة 5 ثواني للقيام بإجراء آخر.

الخطوة 1) قم بالتقاط وقت البدء قبل الانتظار لمدة 5 ثوانٍ (5000 مللي ثانية) باستخدام طريقة executeAsyncScript().

الخطوة 2) بعد ذلك، استخدم executeAsyncScript() للانتظار لمدة 5 ثوانٍ.

الخطوة 3) ثم احصل على الوقت الحالي.

الخطوة 4) فرعيةtract (الوقت الحالي - وقت البدء) = الوقت المنقضي.

الخطوة 5) تحقق من الإخراج الذي يجب أن يعرض أكثر من 5000 مللي ثانية

import java.util.concurrent.TimeUnit;		

import org.openqa.selenium.JavascriptExecutor;		
import org.openqa.selenium.WebDriver;		
import org.openqa.selenium.firefox.FirefoxDriver;		
import org.testng.annotations.Test;		
    		
public class JavaSE_Test {				

    @Test		
    public void Login() 					
    {		
        		
        WebDriver driver= new FirefoxDriver();			

        //Creating the JavascriptExecutor interface object by Type casting		
        JavascriptExecutor js = (JavascriptExecutor)driver;		
        		
        //Launching the Site.		
        driver.get("https://demo.guru99.com/V4/");			
     
          //Maximize window		
          driver.manage().window().maximize();		
        		
          //Set the Script Timeout to 20 seconds		
          driver.manage().timeouts().setScriptTimeout(20, TimeUnit.SECONDS);			
             
          //Declare and set the start time		
          long start_time = System.currentTimeMillis();			
                   
          //Call executeAsyncScript() method to wait for 5 seconds		
          js.executeAsyncScript("window.setTimeout(arguments[arguments.length - 1], 5000);");			
          		
         //Get the difference (currentTime - startTime)  of times.		
         System.out.println("Passed time: " + (System.currentTimeMillis() - start_time));					
                    		
    }		
}			

الإخراج: تم بنجاح عرض الوقت المنقضي أكثر من 5 ثوانٍ (5000 مللي ثانية) كما هو موضح أدناه:

[TestNG] Running:		
C:\Users\gauravn\AppData\Local\Temp\testng-eclipse-387352559\testng-customsuite.xml		
log4j:WARN No appenders could be found for logger (org.apache.http.client.protocol.RequestAddCookies).		
log4j:WARN Please initialize the log4j system properly.		
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.		
Passed time: 5022		
PASSED: Login		

===============================================		
    Default test		
    Tests run: 1, Failures: 0, Skips: 0		
===============================================

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

عندما تفشل محددات المواقع، بالنسبة للعناصر المخفية، أو التمرير، أو الوصول إلى DOM، فإن WebDriver لا يعرضها.

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

نعم. Testim وإضافة محددات الإصلاح التلقائي من مابل Javaخيارات احتياطية للبرامج النصية.

يتم تنفيذ executeScript بشكل متزامن. أما executeAsyncScript فيتم تنفيذه عبر رد نداء للتعليمات البرمجية غير المتزامنة.

استدعاء js.executeScript(“arguments[0].scrollIntoView(true);”, element).

استخدمه فقط عندما تفشل أوامر WebDriver أو عندما تكون هناك حاجة إلى معالجة DOM.

لا. يمكنه تجاوز وظيفة window.alert قبل تفعيلها. استخدم واجهة برمجة تطبيقات التنبيه (Alert API) للحوارات الأصلية.

قم بتحويل نتيجة executeScript، على سبيل المثال String t = (String) js.executeScript(“return document.title;”);.

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