NỘI DUNG BÀI HỌC

Cách xử lý Alert, Popup Window và iFrame trong Selenium Java

Alert (cảnh báo) trong Selenium là gì?

Một Alert trong Selenium là một hộp thông báo nhỏ xuất hiện trên màn hình để cung cấp cho người dùng một số thông tin hoặc cảnh báo. Nó thông báo cho người dùng một số thông tin hoặc lỗi cụ thể, yêu cầu quyền để thực hiện các tác vụ nhất định và nó cũng cung cấp các thông báo cảnh báo.

Dưới đây là một số loại cảnh báo:

1) Cảnh báo đơn giản

Lớp cảnh báo đơn giản trong Selenium hiển thị một số thông tin hoặc cảnh báo trên màn hình. Sau đó nhấn Ok là xong.

[Selenium Java] Bài 13: Cách xử lý Alert, Popup Window và iFrame | Anh Tester

2) Cảnh báo nhắc nhở

Thông báo nhắc nhở này yêu cầu một số đầu vào từ người dùng và trình duyệt web Selenium có thể nhập văn bản bằng cách sử dụng các phím gửi ("Yes/No").

[Selenium Java] Bài 13: Cách xử lý Alert, Popup Window và iFrame | Anh Tester

3) Cảnh báo xác nhận

Cảnh báo xác nhận này yêu cầu chọn một trong hai hành động chính là xác nhận hoặc huỷ bỏ.

[Selenium Java] Bài 13: Cách xử lý Alert, Popup Window và iFrame | Anh Tester

 

Cách xử lý Alert trong Selenium Java

Import thư viện:

import org.openqa.selenium.Alert;


Các hàm xử lý:

1) void dismiss() // Để nhấp vào nút 'Cancel' của cảnh báo.

driver.switchTo().alert().dismiss();

2) void accept() // Để nhấp vào nút 'OK' của cảnh báo.

driver.switchTo().alert().accept();

3) String getText() // Để get text trên alert.

driver.switchTo().alert().getText();

4) void sendKeys(String text) // Để nhập dữ liệu vào ô input text trên alert.

driver.switchTo().alert().sendKeys("Text");


Demo xử lí Alert 

Bước 1: Vào website https://www.lambdatest.com/selenium-playground/javascript-alert-box-demo

Bước 2: Click button "Click Me" đầu tiên

Bước 3: Sau đó có một Alert hiện lên và chúng ta nhấn nút Ok
Khi đó dùng hàm accept()


Chạy code demo:

import com.anhtester.common.BaseTest;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.testng.annotations.Test;

public class HandleAlert extends BaseTest {
   @Test
   public void demoHandleAlertAccept() throws InterruptedException {
      driver.get("https://www.lambdatest.com/selenium-playground/javascript-alert-box-demo");
      Thread.sleep(2000);

      //Click vào nút "Click Me" thứ nhất
      driver.findElement(By.xpath("(//button[text()='Click Me'])[1]")).click();
      Thread.sleep(1000);

      //Khởi tạo class Alert
      Alert alert1 = driver.switchTo().alert();
      //Dùng hàm accept() để xác nhận Alert (tương ứng click vào nút OK)
      alert1.accept();

      Thread.sleep(1000);
   }
}


Demo nhấn vào nút Cancel thì các bạn click nút "Click Me" thứ 2 nó sẽ xuất hiện
Dùng hàm dismiss()

@Test
public void demoHandleAlertDismiss() throws InterruptedException {
    driver.get("https://www.lambdatest.com/selenium-playground/javascript-alert-box-demo");
    Thread.sleep(2000);

    //Click vào nút "Click Me" thứ hai
    driver.findElement(By.xpath("(//button[text()='Click Me'])[2]")).click();
    Thread.sleep(1000);

    //Khởi tạo class Alert
    Alert alert2 = driver.switchTo().alert();
    //Dùng hàm dismiss() để từ chối Alert (tương ứng click vào nút Cancel)
    alert2.dismiss();

    Thread.sleep(1000);
}



Ví dụ dùng hàm sendKeys() thì chúng ta click vào nút "Click Me" thứ 3 nó sẽ xuất hiện alert chứa input, sau đó điền text vào input.

@Test
public void demoHandleAlertInputText() throws InterruptedException {
    driver.get("https://www.lambdatest.com/selenium-playground/javascript-alert-box-demo");
    Thread.sleep(2000);

    //Mở Alert Input text, click nút Click Me thứ ba
    driver.findElement(By.xpath("(//button[text()='Click Me'])[3]")).click();
    Thread.sleep(1000);

    //Khởi tạo class Alert
    Alert alert3 = driver.switchTo().alert();
    alert3.sendKeys("Anh Tester Demo Alert");
    alert3.accept();

    Thread.sleep(1000);
    Assert.assertEquals(driver.findElement(By.xpath("//p[@id='prompt-demo']")).getText(),
        "You have entered 'Anh Tester Demo Alert' !",
        "Chưa điền được text");

    Thread.sleep(1000);
}


Ví dụ khác xử lý Alert có input từ trang Demo QA:

@Test
public void demoHandleAlertInputTextOther() throws InterruptedException {
    driver.get("https://demoqa.com/alerts");
    Thread.sleep(1000);
    driver.findElement(By.xpath("//button[@id='promtButton']")).click();
    Thread.sleep(1000);
    //Nhấn sendKeys vào ô text
    driver.switchTo().alert().sendKeys("Anh Tester");
    Thread.sleep(1000);
    //Nhấn Ok button
    driver.switchTo().alert().accept();
    Thread.sleep(1000);
    //Kiểm tra giá trị sendKeys
    String value = driver.findElement(By.xpath("//span[@id='promptResult']")).getText();
    System.out.println(value);
    Assert.assertTrue(value.contains("Anh Tester"), "Không chứa Text sendKeys");
    Thread.sleep(1000);
}

 

Cách xử lý Popup Window trong Selenium Java

Popup Window là cái gì ??


[Selenium Java] Lesson 13: Cách xử lý Alert, Popup Window và iFrame | Anh Tester
[Selenium Java] Lesson 13: Cách xử lý Alert, Popup Window và iFrame | Anh Tester

 

🔆 Các phương thức hỗ trợ xử lý Popup Window:

  • getWindowHandle(): Phương thức này giúp lấy cửa sổ điều khiển của cửa sổ hiện tại (dùng cho mainWindow)
  • getWindowHandles(): Phương thức này giúp lấy tất cả các cửa sổ đang mở
  • driver.switchTo.window(String window): Phương pháp này giúp chuyển đổi giữa các cửa sổ
  • Kiểu dữ liệu Set: Set giúp lưu trữ nhiều mã số của window khi dùng hàm getWindowHandles
    Set<String> windowHandles = driver.getWindowHandles();

 

+ Mở tab mới trong trình duyệt:
driver.get("https://anhtester.com");

driver.switchTo().newWindow(WindowType.TAB);

driver.get("https://google.com");​

+ Mở cửa sổ mới trong trình duyệt:

 driver.get("https://anhtester.com");

driver.switchTo().newWindow(WindowType.WINDOW);

driver.get("https://google.com");


✳️ Xử lý các Tab hoặc Window Popup:


Bước 1:
Dùng hàm getWindowHandle để lấy mã số của cửa sổ chính hiện tại (mainWindow). Để sau khi chuyển hướng đến các cửa sổ khác thì quay về lại của sổ chính dễ dàng thông qua mã số.

String mainWindow = driver.getWindowHandle();​

Hàm getWindowHandle dùng để lấy mã số của cửa sổ hiện tại, trả về String. Chúng ta có thể lấy khi bắt đầu khởi tạo driver tại BaseTest và lưu vào một biến toàn cục nào đó.

Bước 2: mở các cửa sổ mới tuỳ ý

Bước 3: Dùng hàm getWindowHandles để lấy hết tất cả các cửa sổ đang mở

Khi chúng ta lick vào 1 đường link ở page hiện tại, nó open 1 cửa sổ mới. Mỗi browser này sẽ có 1 mã số để phân biệt chúng với nhau. Và chúng ta dùng kiểu dữ liệu Set trong Java để lưu trữ tất cả các mã số lại.

Set<String> windows = driver.getWindowHandles();​
  • Lấy toàn bộ các “mã số” của các cửa sổ đang chạy mà có sử dụng instance driver (tự động của Selenium). Ví dụ nếu 1 cái browser mở lên do mình tự mở mà không phải Selenium mở thì sẽ ko lấy đc “mã số”.
  • java.util.Set<java.lang.String>: nó sẽ return lại 1 Set các giá trị kiểu String, Set có ý nghĩa là sẽ không lưu dữ liệu bị trùng lặp. Vì mỗi Tab hoặc Window đều có mã số riêng.


Bước 4: Dùng hàm driver.switchTo.window(window) để chuyển hướng đến từng cửa sổ mong muốn

Set<String> windows = driver.getWindowHandles();

for (String window : windows){ 
    driver.switchTo().window(window);
}
Giống tương tự phần findElements() khi lưu trữ một List<WebElement>, để tương tác được với Set thì ta dùng vòng lặp FOR.

Cách khác để chỉ định cửa sổ window thông qua vị trí trong Set

Set<String> AllWindowHandles = driver.getWindowHandles();

String window1 = (String) AllWindowHandles.toArray()[0]; 

System.out.println("Window 1 handle code = "+AllWindowHandles.toArray()[0]); 

String window2 = (String) AllWindowHandles.toArray()[1]; 

System.out.print("Window 2 handle code = "+AllWindowHandles.toArray()[1]);

Code ngắn gọn lại:

Set<String> windows = driver.getWindowHandles();
String firstWindow = (String)windows.toArray()[0]; //Cửa sổ đầu
String secondWindow = (String)windows.toArray()[1]; //Cửa sổ thứ hai

driver.switchTo().window(secondWindow);​

//firstWindow ý nghĩa là main window (cái cần lưu đầu tiên)

Đây là cách mình sẽ thường dùng cho gọn.

🔆 Để chuyển hướng về cửa sổ chính (mainWindow) sau khi đang ở các cửa sổ con khác:

driver.switchTo().window(mainWindow);​

🔆 Để đóng các cửa sổ con khác thì dùng hàm driver.close() khi còn đang ở trong cửa sổ đó

driver.close()


Sau đây là demo sử dụng một số phương pháp để xử lý nhiều cửa sổ Window trong Selenium


Code bình thường chưa chuyển sang Window mới:

@Test
public void demoNotSwitchToTab() throws InterruptedException {
    driver.get("https://demoqa.com/browser-windows");
    Thread.sleep(2000);
    driver.findElement(By.xpath("//button[@id='tabButton']")).click();
    Thread.sleep(1000);
    //Sau khi chuyển hướng sang Tab mới thì getText cái header
    System.out.println(driver.findElement(By.xpath("//h1[@id='sampleHeading']")).getText());
    Thread.sleep(1000);
}


Nó sẽ báo là không tìm thấy Element 😝 

org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"xpath","selector":"//h1[@id='sampleHeading']"}


Code chuyển sang Tab Window mới:

@Test
public void demoHandlePopupTypeTab() throws InterruptedException {
    driver.get("https://demoqa.com/browser-windows");
    Thread.sleep(2000);
    driver.findElement(By.xpath("//button[@id='tabButton']")).click();
    Thread.sleep(1000);
    // Lưu lại lớp window đầu tiên - mã ID hơi dài, in ra sẽ thấy :)
    String MainWindow = driver.getWindowHandle();
    System.out.println(MainWindow);

    // Lấy tất cả các mã định danh Tab Window.
    Set < String > windows = driver.getWindowHandles();

    //Set là một Collection để lưu các phần tử giá trị KHÔNG trùng lặp.
    //Cách duyệt từng phần tử không trùng lặp trong Collection (Set) - Java Basic
    for (String window: windows) {
        System.out.println(window);
        if (!MainWindow.equals(window)) {
            //So sánh nếu thằng nào khác thằng Chính (đầu tiên) thì chuyển hướng qua nó mới thao tác được
            //Chuyển hướng driver đến Tab mới (Tab con)
            driver.switchTo().window(window);
            Thread.sleep(1000);
            System.out.println("Đã chuyển đến Tab Window mới");

            //Một số hàm hỗ trợ
            System.out.println(driver.switchTo().window(window).getTitle());
            System.out.println(driver.switchTo().window(window).getCurrentUrl());

            Thread.sleep(1000);
            //Sau khi chuyển hướng sang Tab mới thì getText cái header
            System.out.println(driver.findElement(By.xpath("//h1[@id='sampleHeading']")).getText());

            // Tắt cái Tab Window mới.
            Thread.sleep(1000);
            driver.close();
        }
    }
    // Chuyển hướng về lại tab chính ban đầu (Main Window)
    driver.switchTo().window(MainWindow);
    System.out.println("Đã chuyển về lớp Window chính: " + driver.getCurrentUrl());

    Thread.sleep(1000);
}


Hoặc chúng ta dùng vị trí để chỉ định khi switchTo

String secondWindow = (String)windows.toArray()[1]; //Cửa sổ thứ hai


Nói thêm về Set chút

Set<String> windows = driver.getWindowHandles();

Duyệt Set với bộ lặp Iterator:

Iterator<String> iterator = windows.iterator();

while(iterator.hasNext()){
      System.out.println((String) iterator.next());
}

 

Duyệt Set với vòng lặp for:
for(String window: windows) {
    System.out.println(window);
}


Cách xử lý iFrame trong Selenium Java

 

iFrame là gì?

iFrame là một trang web hoặc một khung nội tuyến được nhúng trong một trang web khác hoặc một tài liệu HTML được nhúng bên trong một tài liệu HTML khác. Khung nội tuyến thường được sử dụng để thêm nội dung từ các nguồn khác như quảng cáo vào một trang web.

Khung nội tuyến được xác định bằng thẻ <iframe>

Cách xác định iframe trên trang

[Selenium Java] Lesson 13: Cách xử lý Alert, Popup Window và iFrame | Anh Tester

Nếu dùng Chrome thì right click vào cái Messenger trang Anh Tester menu Contact sẽ thấy như hình

Hoặc dạng quảng cáo chèn vào các trang báo

[Selenium Java] Lesson 13: Cách xử lý Alert, Popup Window và iFrame | Anh Tester

Chúng ta có thể xác định tổng số thẻ iframe bằng cách sử dụng đoạn mã sau:

int sizeIFrame = driver.findElements(By.tagName("iframe")).Size();

Để kiểm tra xem trang hiện tại có bao nhiêu thẻ iframe thôi.


✳️ Cách chuyển đến iFrame cụ thể

+ Cách 1: Chuyển sang iframe theo Chỉ mục (thứ tự):
Thực tế trong hệ thống phần mềm testing thì nó cũng chỉ tầm 2 3 cái thẻ iframe thôi chứ không nhiều nên chúng ta đếm cũng rất dễ dàng. Chạy lần lượt thử xem thứ tự nào đúng 😁

driver.switchTo().frame(0);
driver.switchTo().frame(1);​

+ Cách 2: Chuyển sang iframe theo Tên hoặc ID của chính thẻ iframe:

Tên và ID là cách dễ nhất rồi, nếu có thì copy dùng ngay thôi. Lưu ý ID động hay tĩnh đó nhe. Nếu ID động thì thôi bỏ qua đi 😜

driver.switchTo().frame("iframe1");
driver.switchTo().frame("id của phần tử");​

+ Cách 3: Chuyển sang iframe theo chính thẻ iframe nhưng phải thông qua dạng WebElement:

Ví dụ: driver.findElement(By.xpath("//div[@class='fb_dialog_content']/iframe)[1]"))

driver.switchTo().frame(driver.findElement(By.xpath("//div[@class='fb_dialog_content']/iframe)[1]")));

Hàm .frame() nó sẽ chuyển hướng đến thẻ iframe mà mình lấy được thông qua element dạng locator (xpath, cssSelector, id, name,...)


+ Chuyển hướng về nội dung chính không thuộc thẻ iframe nào

driver.switchTo().parentFrame();​


Code mẫu xử lý trên trang https://www.lambdatest.com/selenium-playground/iframe-demo/



import com.anhtester.common.BaseTest;
import org.openqa.selenium.By;
import org.testng.annotations.Test;

public class HandleIFrame extends BaseTest {
   @Test
   public void demoHandleIFrame() throws InterruptedException {

      driver.navigate().to("https://www.lambdatest.com/selenium-playground/iframe-demo/");
      Thread.sleep(3000);
      System.out.println("IFrame total: " + driver.findElements(By.tagName("iframe")).size());

      //----Switch to content of iframe (Editor)--------
      driver.switchTo().frame(0); //Thẻ iframe thứ nhất
      Thread.sleep(1000);
      System.out.println(driver.findElement(By.xpath("//div[@class='rsw-ce']")).getText());

      //1. Switch to Parent WindowHandle
      driver.switchTo().parentFrame(); //Chuyển về nội dung chính không thuộc iframe nào
      Thread.sleep(1000);
      //2. Switch to iframe icon of Messenger
      driver.switchTo().frame(1); //Thẻ iframe thứ hai
      driver.findElement(By.xpath("//a[normalize-space()='API Reference']")).click(); //Nhấn icon để ẩn messenger chat đi

      Thread.sleep(2000);
   }

}

Teacher

Teacher

Anh Tester

Software Quality Engineer

Đườ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:

🌱 Telegram Automation Testing:   Cộng đồng Automation Testing
🌱 
Facebook Group Automation: Cộng đồng Automation Testing Việt Nam
🌱 
Facebook Fanpage: Cộng đồng Automation Testing Việt Nam - Selenium
🌱 Telegram
Manual Testing:   Cộng đồng Manual Testing
🌱 
Facebook Group Manual: Cộng đồng Manual Testing Việt Nam

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

Danh sách bài học