NỘI DUNG BÀI HỌC

Selenium WebDriver cho phép bạn giao tiếp với các trình duyệt khác nhau để thực hiện các lệnh và xác nhận trên các phần tử DOM.

Tuy nhiên, có những trường hợp mà các lệnh Webdriver thực tế sẽ không hoạt động hiệu quả như mong đợi. Đây là lúc JavaScriptExecutor xuất hiện bổ trợ cho chúng ta.

Trong bài viết này, chúng ta sẽ thảo luận về JavaScriptExecutor trong Selenium WebDriver. Cách khai báo, cách sử dụng JavaScriptExecutor trong Selenium. Chúng ta sẽ đi sâu hơn vào việc triển khai và khám phá các hàm khác nhau trong JavascriptExecutor cùng với các ví dụ thực tế.



JavaScriptExecutor trong Selenium là gì?

JavaScriptExecutor là một giao diện được cung cấp bởi Selenium Webdriver, trình bày cách thực thi JavaScript từ Webdriver. Giao diện này cung cấp các phương pháp để chạy JavaScript trên cửa sổ đã chọn hoặc trang hiện tại. JavaScriptExecutor là một giao diện có sẵn cho tất cả các ngôn ngữ hỗ trợ Selenium Framework .

Vì JavaScriptExecutor là một giao diện Selenium, nên không cần thêm plugin hoặc tiện ích bổ sung. Bạn có thể sử dụng nó trực tiếp bằng cách nhập gói  org.openqa.selenium.JavascriptExecutor.


Tại sao sử dụng JavaScriptExecutor trong Selenium?

Riêng Selenium Webdriver cho phép bạn thực hiện các thao tác trên các phần tử web như gửi dữ liệu, nhấp vào các nút, v.v. Tuy nhiên, như đã nói trước đây, có những trường hợp mà các lệnh của Webdriver sẽ không hoạt động như mong đợi do nhiều lý do khác nhau. Trong những trường hợp này, chúng tôi sẽ nhờ đến sự trợ giúp của JavaScriptExecutor.

Ví dụ: theo truyền thống để xác định vị trí một phần tử web, chúng ta sử dụng các chiến lược định vị web khác nhau như ID, Tên, bộ chọn CSS và XPath, v.v. Nếu các trình định vị này không hoạt động như mong đợi hoặc bạn đang xử lý một XPath phức tạp, bạn có thể sử dụng JavaScriptExecutor để thực hiện thao tác mong muốn trên WebElement.

Trên các dòng tương tự, để nhấp vào WebElement, chúng ta thường sử dụng click() phương pháp được cung cấp bởi Selenium Webdriver.

Đôi khi, phương thức click() có thể không hoạt động trên tất cả các trình duyệt web hoặc các điều khiển web có thể hoạt động khác nhau trên các trình duyệt khác nhau. Để khắc phục những tình huống như vậy, giao diện JavaScriptExecutor được sử dụng.

Như chúng ta đã biết, các trình duyệt có triển khai Javascript bên trong chúng và có thể hiểu các lệnh JavaScript. Do đó, hiểu JavaScriptExecutor trong Selenium sẽ cho phép bạn thực hiện một loạt các hoạt động hiệu quả và thanh lịch hơn.

 

Giới thiệu về các phương thức JavaScriptExecutor

JavaScriptExecutor trong Selenium cung cấp hai phương pháp mà qua đó chúng ta có thể chạy JavaScript trên cửa sổ đã chọn hoặc trang hiện tại.

a) executeScript

Phương thức này thực thi JavaScript trong ngữ cảnh của cửa sổ hoặc khung hiện đang được chọn trong Selenium. Tập lệnh sẽ được thực thi dưới dạng phần thân của một hàm ẩn danh.

b) executeAsyncScript

Phương thức này thực thi một đoạn mã JavaScript không đồng bộ trong ngữ cảnh của cửa sổ hoặc khung hiện đang được chọn trong Selenium. Ở đây, tập lệnh sẽ được thực thi dưới dạng phần thân của một hàm ẩn danh. Sự khác biệt chính giữa executeScript và executeAsyncScript là tập lệnh được gọi bằng thực thi executeAsyncScript phải báo hiệu về việc hoàn thành thực thi bằng cách sử dụng hàm gọi lại.

Các phương thức gọi sử dụng executeAsyncScript chủ yếu được sử dụng khi chế độ ngủ phải được thực hiện trong trình duyệt đang thử nghiệm hoặc khi các thử nghiệm phải được đồng bộ hóa trong ứng dụng AJAX.

Cả hai phương pháp đều cho phép chúng tôi trả về một giá trị bằng cách sử dụng từ khóa return và lưu trữ chúng trong một biến. Các kiểu dữ liệu có thể được trả về là:

  • Long
  • String
  • Boolean
  • List
  • WebElement

Cú pháp cơ bản của JavaScriptExecutor trong Selenium

Mục đích của phần này là cung cấp ý tưởng cấp cao về các bước triển khai của JavaScriptExecutor trong Selenium. Để chứng minh, chúng tôi đã sử dụng Java làm ngôn ngữ lập trình ưa thích.

Chúng ta hãy xem xét các bước chính.

Bước 1: Import package JavascriptExecutor.

Bước 2: Bây giờ để sử dụng JavascriptExecutor, hãy tạo một tham chiếu cho giao diện và gán nó cho cá thể WebDriver với cú pháp:

JavascriptExecutor js = (JavascriptExecutor) driver;

 

Bước 3: Chúng ta đã tạo một tham chiếu JavascriptExecutor. Bây giờ chúng ta gọi các phương thức executeAsyncScript / executeScript. Cú pháp cho executeScript đượcthể hiện dưới đây:

js.executeScript​(java.lang.String script, java.lang.Object... args)

Thông số:

script - JavaScript để thực thi
args - Các đối số của script. Có thể trống.

Trả lại giá trị

Boolean / Long / Double/ String/ List / Map / WebElement / Null.

 

Các tình huống sử dụng JavaScriptExecutor trong Selenium

Một số tình huống chúng ta có thể xử lý bằng cách sử dụng Giao diện JavaScriptExecutor

1. Nhấp vào một Element

js.executeScript("document.getElementById('id_of_element').click();");
//hoặc
js.executeScript("arguments[0].click();", buttonLogin);

 


2. Để nhập văn bản vào hộp văn bản mà không sử dụng phương thức sendKeys ()

js.executeScript("document.getElementById('id').value='AnhTester';");
js.executeScript("document.getElementById('Email').value='Automation Testing';");


3. Để xử lý Checkbox bằng cách chuyển giá trị là true hoặc false

js.executeScript("document.getElementById('id_of_element').checked=false;");
//hoặc
js.executeScript("document.getElementById('id_of_element').checked=true;");


4. Để tạo Alert trong Selenium Webdriver

js.executeScript("alert('Welcome To Anh Tester - Automation Testing');");


5. Để làm mới cửa sổ trình duyệt bằng Javascript

js.executeScript("history.go(0)");


6. Để lấy nội dung của toàn bộ trang web trong Selenium

String innerText = js.executeScript("return document.documentElement.innerText;").toString();
System.out.println(innerText);


7. Để lấy Tiêu đề của trang web

String titleText = js.executeScript("return document.title;").toString();
System.out.println(titleText);


8. Để lấy tên miền

String domainName= js.executeScript("return document.domain;").toString();
System.out.println(domainName);


9. Để lấy URL của một trang web

String url= js.executeScript("return document.URL;").toString();
System.out.println(url);


10. Để lấy Chiều cao và Chiều rộng của một trang web

js.executeScript("return window.innerHeight;").toString();
js.executeScript("return window.innerWidth;").toString();


11. Để tìm một phần tử ẩn (bị khuất) trong Selenium bằng JavaScriptExecutor

js.executeScript("arguments[0].click();", element);


12. Để điều hướng đến một trang khác bằng Javascript

js.executeScript("window.location = 'https://anhtester.com'");


13. Để thực hiện Cuộn chuột

a) Để cuộn trang theo chiều dọc 500px

js.executeScript("window.scrollBy(0,500)");


b) Để cuộn trang theo chiều dọc cho đến hết (cuối trang)

js.executeScript("window.scrollBy(0,document.body.scrollHeight)");


c) Để cuộn tới 1 phần tử trong trang (này dùng nhiều)

WebElement element = driver.findElement(By.id("id_of_element"));

js.executeScript("arguments[0].scrollIntoView(true);", element);



14. Thêm một phần tử trong DOM

Chúng ta cũng có thể thêm một phần tử trong DOM nếu được yêu cầu. Tuy nhiên, vì chỉ liên quan đến việc bắt chước các tương tác của người dùng trong trình duyệt, tùy chọn này có thể không được sử dụng.

js.executeScript("var btn=document.createElement('newButton');" + "document.body.appendChild(btn);");


Chú ý:

Chúng ta có các hàm document.getElementBy* sau:

[Selenium Java] Bài 14: Cách dùng Javascript Executor để hành động | Anh TesterNó không có Xpath đâu nhen =))

Code demo JavascriptExecutor

package anhtester.JavascriptExecutor;

import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebElement;
import org.testng.annotations.Test;

import Initiation.Init;

public class jsExecutor extends Init {

	@Test
	public void jsExecutorDemo() throws InterruptedException {
		// Creating the JavascriptExecutor interface object
		JavascriptExecutor js = (JavascriptExecutor) driver;

		driver.get("https://anhtester.com/");
		Thread.sleep(1000);
		
		// Click on "Website Testing" module using JavascriptExecutor
		WebElement button = driver.findElement(By.xpath("//h3[normalize-space()='Website Testing']"));
		js.executeScript("arguments[0].click();", button);
		Thread.sleep(1000);
		
		// Get page title and Domain using JavascriptExecutor
		String titleText = js.executeScript("return document.title;").toString();
		System.out.println("Page Title is: " + titleText);

		String domainName = js.executeScript("return document.domain;").toString();
		System.out.println("Domain is: " + domainName);

		// Add Alert window using JavascriptExecutor
		js.executeScript("alert('Successfully Logged In');");
	}

}


Cái Init là class viết riêng chứa SetupTearDown chương trình.

package Initiation;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;

public class Init {
	
	public WebDriver driver;
	
	@BeforeTest
	public void Setup()
	{
		System.setProperty("webdriver.chrome.driver", "D:\\TESTER\\ChromeDriver\\chromedriver.exe");
		driver = new ChromeDriver();
		driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
		driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
		driver.manage().window().maximize();
	}
	
	@AfterTest
	public void TearDown() throws Exception
	{
		Thread.sleep(2000);
		driver.quit();
	}
}

 

 

Teacher

Teacher

Anh Tester

Tester

Đường dẫu khó chân vẫn cần bước đi
Đời dẫu khổ tâm vẫn cần nghĩ thấu

Cộng đồng Automation Testing Việt Nam:


🌱 Zalo
Automation Testing:   https://zalo.me/g/lsxswc560
🌱 Facebook Group: Cộng đồng Automation Testing Việt Nam (Website, Desktop, Mobile)
🌱 Facebook Fanpage: Cộng đồng Automation Testing Việt Nam - Selenium

Chia sẻ khóa học lên trang

Bạn có thể đăng khóa học của chính bạn lên trang Anh Tester để kiếm tiền

Dan sách bài học