JavaScriptExecutor ใน Selenium พร้อมตัวอย่าง
ความหมายของ JavaScriptExecutor?
JavaScriptExecutor เป็นอินเทอร์เฟซที่ช่วยในการดำเนินการ Javaสคริปต์ผ่าน Selenium เว็บไดรเวอร์ JavaScriptExecutor มีสองวิธีคือ “executescript” และ “executeAsyncScript” เพื่อเรียกใช้ javascript บนหน้าต่างที่เลือกหรือหน้าปัจจุบัน
ทำไมเราถึงต้องการ 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/ และ
- เข้าสู่ระบบด้วยข้อมูลประจำตัว
- แสดงหน้าต่างแจ้งเตือนเมื่อเข้าสู่ระบบสำเร็จ
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: เมื่อรันโค้ดสำเร็จ คุณจะสังเกต
- คลิกที่ปุ่มเข้าสู่ระบบสำเร็จและ
- หน้าต่างการแจ้งเตือนจะปรากฏขึ้น (ดูภาพด้านล่าง)
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: เมื่อดำเนินการโค้ดด้านบนสำเร็จแล้ว ระบบจะดึงรายละเอียดของไซต์และนำทางไปยังหน้าอื่นดังแสดงด้านล่าง
[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 ===============================================
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 พิกเซล (ดูภาพด้านล่าง)
ตัวอย่างของ 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