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
- Lưu handle cửa sổ chính:
String mainWindow = driver.getWindowHandle(); - Thao tác mở cửa sổ mới (click link, button...).
- Lấy tất cả handles:
SetallWindows = driver.getWindowHandles(); - Duyệt từng handle,
switchTo().window(handle), kiểm tra tiêu đề/URL. - Nếu khớp cửa sổ cần đóng →
driver.close(); - 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ảodriver.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);