JavaScriptExecutor trong Selenium WebDriver

JavaScriptExecutor là gì?

JavaScriptExecutor là một Giao diện giúp thực thi JavaScript thông qua Selenium Webdriver. JavaScriptExecutor cung cấp hai phương thức “executecript” & “executeAsyncScript” để chạy javascript trên cửa sổ đã chọn hoặc trang hiện tại.

Tại sao chúng ta cần JavaScriptExecutor?

Trong Selenium Webdriver, các trình định vị như XPath, CSS, v.v. được sử dụng để xác định và thực hiện các hoạt động trên một trang web.

Trong trường hợp, các trình định vị này không hoạt động, bạn có thể sử dụng JavaScriptExecutor. Bạn có thể sử dụng JavaScriptExecutor để thực hiện một thao tác mong muốn trên một phần tử web.

Selenium hỗ trợ javaScriptExecutor. Không cần thêm plugin hoặc tiện ích bổ sung. Bạn chỉ cần nhập ( org.openqa.selenium.JavascriptExecutor ) trong tập lệnh để sử dụng JavaScriptExecutor.

Phương thức JavaScriptExecutor

  1. executeAsyncScript

Với tập lệnh không đồng bộ, trang của bạn hiển thị nhanh hơn. Thay vì buộc người dùng phải đợi tập lệnh tải xuống trước khi trang hiển thị. Hàm này sẽ thực thi một đoạn JavaScript không đồng bộ trong ngữ cảnh của khung hoặc cửa sổ hiện đang được chọn trong Selenium. JS được thực thi như vậy là đơn luồng với một hàm gọi lại khác nhau chạy đồng bộ.

  1. executeScript

Phương thức này thực thi JavaScript trong ngữ cảnh của khung hoặc cửa sổ hiện đang được chọn trong Selenium. Tập lệnh được sử dụng trong phương thức này chạy trong phần thân của một hàm ẩn danh (một hàm không có tên). Chúng tôi cũng có thể chuyển các đối số phức tạp cho nó.

Tập lệnh có thể trả về giá trị. Các kiểu dữ liệu được trả về là

  • Boolean
  • Long
  • String
  • List
  • WebElement.

Cú pháp cơ bản cho JavascriptExecutor được cung cấp bên dưới:

Syntax : 

JavascriptExecutor js = (JavascriptExecutor) driver;  

js.executeScript(Script,Arguments);

  • Tập lệnh – Đây là JavaScript cần thực thi.
  • Đối số – Đó là các đối số cho tập lệnh. Nó là tùy chọn.

Ví dụ về executeAsyncScript

Sử dụng executeAsyncScript, giúp cải thiện hiệu suất của bài kiểm tra của bạn. Nó cho phép kiểm tra viết giống như một mã hóa bình thường.

ExecutiveSync chặn các hành động khác đang được thực hiện bởi trình duyệt Selenium nhưng thực thi executeAsync không chặn hành động. Nó sẽ gửi một lệnh gọi lại đến bộ Thử nghiệm phía máy chủ sau khi tập lệnh được thực hiện xong. Nó có nghĩa là mọi thứ bên trong script sẽ được thực thi bởi trình duyệt chứ không phải máy chủ.

Ví dụ 1: Thực hiện chế độ sleep trong trình duyệt đang được kiểm tra.

Trong trường hợp này, chúng tôi sẽ sử dụng trang web demo “Guru99” để minh họa executeAsyncScript. Trong ví dụ này, bạn sẽ

  • Khởi chạy trình duyệt.
  • Mở trang web ” http://demo.guru99.com/V4/ “.
  • Ứng dụng chờ 5 giây để thực hiện thêm một hành động.

Bước 1) Ghi lại thời gian bắt đầu trước khi đợi 5 giây (5000 mili giây) bằng cách sử dụng phương thức executeAsyncScript ().

Bước 2) Sau đó, sử dụng executeAsyncScript () để đợi 5 giây.

Bước 3) Sau đó, lấy thời gian hiện tại.

Bước 4) Trừ (thời gian hiện tại – thời gian bắt đầu) = thời gian đã qua.

Bước 5) Xác minh Output mà nó sẽ hiển thị hơn 5000 mili giây

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(“http://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));

    }

}

Kết quả: Hiển thị thành công thời gian đã qua hơn 5 giây (5000 mili giây) như hình dưới đây:

[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

===============================================

Ví dụ về executeScript

Đối với executeScript, chúng ta sẽ thấy lần lượt ba ví dụ khác nhau.

1) Ví dụ: Nhấp vào nút để đăng nhập và tạo cửa sổ Cảnh báo bằng JavaScriptExecutor.

Trong trường hợp này, chúng tôi sẽ sử dụng trang web demo “Guru99” để minh họa JavaScriptExecutor. Trong ví dụ này,

  • Khởi chạy trình duyệt web
  • mở trang web ” http://demo.guru99.com/V4/ ” và
  • đăng nhập bằng thông tin đăng nhập
  • Hiển thị cửa sổ cảnh báo khi đăng nhập thành công.

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(“http://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: Khi mã được thực thi thành công. Bạn sẽ quan sát

  • Nhấp thành công vào nút đăng nhập và
  • Cửa sổ cảnh báo sẽ được hiển thị (xem hình ảnh bên dưới).

2) Ví dụ: Chụp dữ liệu Scrape và Điều hướng đến các trang khác nhau bằng JavaScriptExecutor.

Thực thi tập lệnh selen bên dưới. Trong ví dụ này,

  • Khởi chạy trang web
  • Tìm nạp các chi tiết của trang web như URL của trang web, tên tiêu đề và tên miền của trang web.
  • Sau đó, điều hướng đến một trang khác.

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://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 = ‘http://demo.guru99.com/'”);

    }

}

Output: Khi đoạn mã trên được thực thi thành công, nó sẽ tìm nạp thông tin chi tiết của trang web và điều hướng đến trang khác như hình dưới đây.

[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 = http://demo.guru99.com/V4/

Title of the page = Guru99 Bank Home Page

PASSED: Login

===============================================

    Default test

    Tests run: 1, Failures: 0, Skips: 0

===============================================

3) Ví dụ: Cuộn xuống bằng cách sử dụng JavaScriptExecutor.

Thực thi tập lệnh selen bên dưới. Trong ví dụ này,

  • Khởi chạy trang web
  • Cuộn xuống 600 pixel

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)”);

    }

}

Output : Khi đoạn mã trên được thực thi, nó sẽ cuộn xuống 600 pixel (xem hình ảnh bên dưới).

Bản tóm tắt:

JavaScriptExecutor được sử dụng khi Selenium Webdriver không thể nhấp vào bất kỳ phần tử nào do một số vấn đề.

  • JavaScriptExecutor cung cấp hai phương thức “executecript” & “executeAsyncScript” để xử lý.
  • Đã thực thi JavaScript bằng Selenium Webdriver.
  • Minh họa cách nhấp vào một phần tử thông qua JavaScriptExecutor, nếu selen không nhấp vào phần tử do một số vấn đề.
  • Đã tạo cửa sổ ‘Cảnh báo’ bằng JavaScriptExecutor.
  • Được điều hướng đến trang khác bằng JavaScriptExecutor.
  • Cuộn xuống cửa sổ bằng JavaScriptExecutor.
  • Đã tìm nạp URL, tiêu đề và tên miền bằng JavaScriptExecutor.
Back to top button