JavaScriptExecutor ใน Selenium พร้อมตัวอย่าง

ความหมายของ JavaScriptExecutor?

JavaScriptExecutor เป็นอินเทอร์เฟซที่ช่วยในการดำเนินการ Javaสคริปต์ผ่าน Selenium เว็บไดรเวอร์ JavaScriptExecutor มีสองวิธีคือ “executescript” และ “executeAsyncScript” เพื่อเรียกใช้ javascript บนหน้าต่างที่เลือกหรือหน้าปัจจุบัน

JavaScriptExecutor

ทำไมเราถึงต้องการ JavaScriptExecutor?

In Selenium Webdriver ตัวระบุตำแหน่งเช่น XPath, CSS ฯลฯ ใช้ในการระบุและดำเนินการกับหน้าเว็บ

ในกรณีที่ตัวระบุตำแหน่งเหล่านี้ใช้งานไม่ได้คุณสามารถใช้ได้ JavaScriptExecutor คุณสามารถใช้ JavaScriptExecutor เพื่อดำเนินการตามที่ต้องการบนองค์ประกอบบนเว็บ

Selenium รองรับ javaScriptExecutor ไม่จำเป็นต้องมีปลั๊กอินหรือส่วนเสริมเพิ่มเติม คุณเพียงแค่ต้องนำเข้า (org.openqa.selenium องค์กร OpenqaJavascriptผู้ปฏิบัติการ) ในสคริปต์ว่าจะใช้ Javaสคริปต์Executor

Javaวิธีการ ScriptExecutor ใน Selenium

รันสคริปต์

วิธีการนี้ดำเนินการ Javaต้นฉบับ ในบริบทของเฟรมหรือหน้าต่างที่เลือกในปัจจุบัน Selenium- สคริปต์ที่ใช้ในวิธีนี้ทำงานในเนื้อความของฟังก์ชันที่ไม่ระบุชื่อ (ฟังก์ชันที่ไม่มีชื่อ) นอกจากนี้เรายังสามารถส่งข้อโต้แย้งที่ซับซ้อนไปให้ได้ด้วย

สคริปต์สามารถคืนค่าได้ ประเภทข้อมูลที่ส่งคืนคือ

  • บูลีน
  • นาน
  • เชือก
  • รายการ
  • Webองค์ประกอบ

Javascriptไวยากรณ์ของผู้บริหาร:

JavascriptExecutor js = (JavascriptExecutor) driver;  
js.executeScript(Script,Arguments);
  • ต้นฉบับ - นี้เป็น Javaสคริปต์ที่ต้องดำเนินการ
  • ข้อโต้แย้ง – มันเป็นข้อโต้แย้งของสคริปต์ มันเป็นทางเลือก

ดำเนินการ AsyncScript

ด้วยสคริปต์แบบอะซิงโครนัส เพจของคุณจะแสดงผลได้เร็วขึ้น แทนที่จะบังคับให้ผู้ใช้รอให้สคริปต์ดาวน์โหลดก่อนที่เพจจะแสดงผล ฟังก์ชันนี้จะดำเนินการส่วนอะซิงโครนัส Javaสคริปต์ในบริบทของเฟรมหรือหน้าต่างที่เลือกในปัจจุบัน SeleniumJS ที่ดำเนินการดังกล่าวจะเป็นแบบเธรดเดียวโดยมีฟังก์ชันคอลแบ็กหลายแบบที่ทำงานแบบซิงโครนัส

วิธีใช้ JavaScriptExecutor ใน Selenium

นี่คือกระบวนการทีละขั้นตอนเกี่ยวกับวิธีการใช้งาน JavaScriptExecutor ใน Selenium:

ขั้นตอน 1) นำเข้าแพ็คเกจ

import org.openqa.selenium.JavascriptExecutor;

ขั้นตอน 2) สร้างข้อมูลอ้างอิง

JavascriptExecutor js = (JavascriptExecutor) driver;

ขั้นตอน 3) โทร Javascriptวิธีการดำเนินการ

js.executeScript(script, args);

ตัวอย่างของการคลิกองค์ประกอบโดยใช้ JavaScriptExecutor ใน Selenium

สำหรับExecuteScript เราจะเห็นสามตัวอย่างที่แตกต่างกันทีละตัวอย่าง

1) ตัวอย่าง: คลิกปุ่มเพื่อเข้าสู่ระบบและสร้างหน้าต่างแจ้งเตือนโดยใช้ Javaสคริปต์Executor

ในสถานการณ์นี้ เราจะใช้ไซต์สาธิต “Guru99” เพื่อแสดงตัวอย่าง 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');");   
    		
    }		
}

Output: เมื่อรันโค้ดสำเร็จ คุณจะสังเกต

  • คลิกที่ปุ่มเข้าสู่ระบบสำเร็จและ
  • หน้าต่างการแจ้งเตือนจะปรากฏขึ้น (ดูภาพด้านล่าง)

คลิกปุ่มเพื่อเข้าสู่ระบบและสร้างหน้าต่างการแจ้งเตือนโดยใช้ JavaScriptExecutor

2) ตัวอย่าง: บันทึกข้อมูลขูดและนำทางไปยังหน้าต่างๆ โดยใช้ Javaสคริปต์Executor

ดำเนินการสคริปต์ 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/'");			
    }		
}

Output: เมื่อดำเนินการโค้ดด้านบนสำเร็จแล้ว ระบบจะดึงรายละเอียดของไซต์และนำทางไปยังหน้าอื่นดังแสดงด้านล่าง

บันทึกข้อมูลการขูดและนำทางไปยังหน้าต่างๆ โดยใช้ 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) ตัวอย่าง: เลื่อนลงโดยใช้ Javaสคริปต์Executor

ดำเนินการสคริปต์ 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: การดำเนินการสลีปในเบราว์เซอร์ที่กำลังทดสอบ

ในสถานการณ์จำลองนี้ เราจะใช้ไซต์สาธิต “Guru99” เพื่อแสดงตัวอย่างการดำเนินการ AsyncScript ในตัวอย่างนี้ คุณจะ

  • เปิดเบราว์เซอร์
  • เปิดเว็บไซต์ https://demo.guru99.com/V4/.
  • แอปพลิเคชันรอเป็นเวลา 5 วินาทีเพื่อดำเนินการต่อไป

ขั้นตอน 1) จับเวลาเริ่มต้นก่อนที่จะรอ 5 วินาที (5000 มิลลิวินาที) โดยใช้เมธอด implementAsyncScript()

ขั้นตอน 2) จากนั้นใช้executeAsyncScript() รอ 5 วินาที

ขั้นตอน 3) จากนั้นรับเวลาปัจจุบัน

ขั้นตอน 4) ลบ (เวลาปัจจุบัน – เวลาเริ่มต้น) = เวลาที่ผ่านไป

ขั้นตอน 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));					
                    		
    }		
}			

Output: แสดงเวลาที่ผ่านไปมากกว่า 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		
===============================================

สรุป

JavaScriptExecutor ถูกใช้เมื่อ Selenium Webdriver ไม่สามารถคลิกที่องค์ประกอบใดๆ เนื่องจากปัญหาบางอย่าง

  • JavaScriptExecutor มีสองวิธีคือ “executescript” และ “executeAsyncScript” สำหรับจัดการ
  • ดำเนินการ Javaสคริปต์ที่ใช้ Selenium เว็บไดรเวอร์
  • ภาพประกอบวิธีการคลิกองค์ประกอบผ่าน JavaScriptExecutor หาก Selenium ไม่สามารถคลิกที่องค์ประกอบได้เนื่องจากปัญหาบางประการ
  • สร้างหน้าต่าง 'แจ้งเตือน' โดยใช้ Javaสคริปต์Executor
  • นำทางไปยังหน้าต่างๆโดยใช้ Javaสคริปต์Executor
  • เลื่อนหน้าต่างลงมาโดยใช้ Javaสคริปต์Executor
  • ดึงข้อมูล URL ชื่อ และชื่อโดเมนโดยใช้ Javaสคริปต์Executor