Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Đóng cửa sổ cụ thể (Close Specific Window) với Selenium WebDriver Java

Khi test mở nhiều cửa sổ/tab, cần đóng cửa sổ cụ thể (ví dụ: popup đăng nhập, quảng cáo) mà giữ lại cửa sổ chính. Selenium dùng getWindowHandles() và switchTo().window() để quản lý.

Logic cốt lõi

  1. Lưu handle cửa sổ chính: String mainWindow = driver.getWindowHandle();
  2. Thao tác mở cửa sổ mới (click link, button...).
  3. Lấy tất cả handles: Set allWindows = driver.getWindowHandles();
  4. Duyệt từng handle, switchTo().window(handle), kiểm tra tiêu đề/URL.
  5. Nếu khớp cửa sổ cần đóng → driver.close();
  6. Bắt buộc switch về cửa sổ chính sau khi đóng.

Ví dụ: Đóng popup "Sign in with Google"

import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.Set;

public class CloseSpecificWindow {
    public static void main(String[] args) {
        System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");
        WebDriver driver = new ChromeDriver();
        
        try {
            driver.get("https://secure.example.com/login");
            
            // 1. Lưu handle cửa sổ chính
            String mainWindow = driver.getWindowHandle();
            
            // 2. Click mở popup
            driver.findElement(By.id("login-google-button")).click();
            
            // 3. Chờ popup xuất hiện (nên dùng WebDriverWait)
            Thread.sleep(2000);
            
            // 4. Lấy tất cả handles
            Set allWindows = driver.getWindowHandles();
            
            // 5. Duyệt và đóng popup cụ thể
            for (String handle : allWindows) {
                driver.switchTo().window(handle);
                String title = driver.getTitle();
                System.out.println("Window title: " + title);
                
                if (title.contains("Sign in") || title.contains("Google Accounts")) {
                    System.out.println("Đang đóng popup: " + title);
                    driver.close(); // Đóng tab/cửa sổ hiện tại
                    break; // Thoát loop sau khi đóng
                }
            }
            
            // 6. QUAN TRỌNG: Switch về cửa sổ chính
            driver.switchTo().window(mainWindow);
            System.out.println("Đã quay về cửa sổ chính: " + driver.getTitle());
            
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            driver.quit();
        }
    }
}

Lưu ý quan trọng

  • driver.close() đóng cửa sổ/tab đang được focus (đã switchTo).
  • Sau close(), handle đó trở nên vô hiệu. Không thể tiếp tục dùng handle đó.
  • Nếu đóng cửa sổ chính nhầm → session bị kết thúc, các cửa sổ khác cũng đóng theo.
  • Luôn dùng try-finally đảm bảo driver.quit() được gọi.

Pattern an toàn: Helper method

public void closeWindowByTitle(WebDriver driver, String titleKeyword) {
    String main = driver.getWindowHandle();
    for (String handle : driver.getWindowHandles()) {
        driver.switchTo().window(handle);
        if (driver.getTitle().contains(titleKeyword)) {
            driver.close();
            break;
        }
    }
    driver.switchTo().window(main); // Luôn quay về main
}

Đóng tất cả trừ cửa sổ chính

String main = driver.getWindowHandle();
for (String handle : driver.getWindowHandles()) {
    if (!handle.equals(main)) {
        driver.switchTo().window(handle);
        driver.close();
    }
}
driver.switchTo().window(main);