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

Chèn thư viện cái:

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


Bắt đầu nào 

Bước 1) Vào website http://demo.seleniumeasy.com/javascript-alert-box-demo.html

Bước 2) Click button "Click me!" đầu tiên

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

Bước 3) Sau đó có một Alert hiện lên và chúng ta nhấn nút Ok

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

Chạy code thực hành luôn cho nóng:

package com.anhtester.HandleAlert;

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() {
        driver.get("http://demo.seleniumeasy.com/javascript-alert-box-demo.html");
        sleep(2);

        //Mở Alert Message, click vào nút "Click me!" thứ nhất
        driver.findElement(By.xpath("(//button[text()='Click me!'])[1]")).click();
        sleep(1);

        //Khởi tạo class Alert thứ nhất
        Alert alert1 = driver.switchTo().alert();
        alert1.accept();

        sleep(1);
    }
}


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

    @Test
    public void demoHandleAlertDismiss() {
        driver.get("http://demo.seleniumeasy.com/javascript-alert-box-demo.html");
        sleep(2);

        //Mở Alert Dismiss, click vào nút "Click me!" thứ 2
        driver.findElement(By.xpath("(//button[text()='Click me!'])[2]")).click();
        sleep(1);

        //Khởi tạo class Alert
        Alert alert2 = driver.switchTo().alert();
        alert2.dismiss();

        Assert.assertTrue(driver.findElement(By.xpath("//p[@id='confirm-demo']")).isDisplayed(),
                "Chưa nhấn được nút Cancel");

        sleep(1);
    }




Ví dụ dùng sendKeys thì chúng ta click vào nút thứ 3 nó sẽ xuất hiện sau đó điền text vào

    @Test
    public void demoHandleAlertInputText() {
        driver.get("http://demo.seleniumeasy.com/javascript-alert-box-demo.html");
        sleep(2);

        //Mở Alert Input text, click nút thứ 3
        driver.findElement(By.xpath("//button[normalize-space()='Click for Prompt Box']")).click();
        sleep(1);

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

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

        sleep(1);
    }


Ví dụ xử lý Alert có input khác:

    @Test
    public void demoHandleAlertInputTextOther(){
        driver.get("https://demoqa.com/alerts");
        sleep(1);
        driver.findElement(By.xpath("//button[@id='promtButton']")).click();
        sleep(1);
        //Nhấn sendKeys vào ô text
        driver.switchTo().alert().sendKeys("Anh Tester");
        sleep(1);
        //Nhấn Ok button
        driver.switchTo().alert().accept();
        sleep(1);
        //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");
        sleep(1);
    }

 

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:

  • get.windowhandle (): 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
  • get.windowhandles (): Phương thức này giúp lấy các xử lý của tất cả các cửa sổ đã mở
  • set: Phương thức này giúp thiết lập các chốt cửa sổ dưới dạng một chuỗi. set <string> set = driver.get.windowhandles ()
  • switchTo: Phương pháp này giúp chuyển đổi giữa các cửa sổ
  • action: Phương pháp này giúp thực hiện các hành động nhất định trên cửa sổ
    (getTitle, getCurrentUrl, get,...)


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() {
  driver.get("https://demoqa.com/browser-windows");
  sleep(2);
  driver.findElement(By.xpath("//button[@id='tabButton']")).click();
  sleep(1);
  //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());
  sleep(1);
}


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

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:

package com.anhtester.HandlePopupWindow;

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

import java.util.Set;

public class HandlePopupWindow extends BaseTest {
    @Test
    public void demoPopupTypeTab() {
        driver.get("https://demoqa.com/browser-windows");
        sleep(2);
        driver.findElement(By.xpath("//button[@id='tabButton']")).click();
        sleep(1);
        // 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);
                sleep(1);
                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());

                sleep(1);
                //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.
                sleep(1);
                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());

        sleep(1);
    }
}


Nói thêm về Set chút
Ví dụ có:  Set<String> setA = driver.getWindowHandles();


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

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

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

 

Duyệt Set với vòng lặp for-each:

for (String element : setA) {
    System.out.println(element);
}


Cách xử lý iFrames 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ố iframe bằng cách sử dụng đoạn mã sau:

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


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

Chuyển sang khung theo Chỉ mục (thứ tự):
Giả sử nếu có 100 khung trong trang, chúng ta có thể chuyển sang khung trong Selenium bằng cách sử dụng chỉ mục.

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

 

Chuyển sang khung theo Tên hoặc ID:

Tên và ID là các thuộc tính để xử lý các khung trong Selenium mà qua đó chúng ta có thể chuyển sang iframe.

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

Chiến nào code code code

package anhtester.com.bai13_alertpopupiframe;

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

public class TestIFrame extends SetupBrowser {

    @Test
    public void iFrame01() throws InterruptedException {

        driver.navigate().to("https://anhtester.com/contact");
        Thread.sleep(3000);
        System.out.println("iframe total: " + driver.findElements(By.tagName("iframe")).size());
        Thread.sleep(1000);
        //----Switch to content of Messenger--------
        driver.switchTo().frame(0);
        System.out.println(driver.findElement(By.tagName("strong")).getText());

        //----Switch to icon of Messenger---------

        //1. Switch to Parent WindowHandle
        driver.switchTo().parentFrame();

        //2. Switch to iframe icon of Messenger
        driver.switchTo().frame(1);
        driver.findElement(By.tagName("svg")).click(); //Nhấn icon để ẩn messenger chat đi

        Thread.sleep(2000);
    }

}


==> Kết thúc bài 13 tèn tén ten


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

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

  • Anh 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:

🌱 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ẻ kiến thức lên trang

Bạn có thể đăng bài để chia sẻ kiến thức, bài viết của chính bạn lên trang Anh Tester Blog

Danh sách bài học