เมื่อมีหลายหน้าต่าง/แท็บ ใช้ getWindowHandles() และ getWindowHandle() จัดการปิดหน้าต่างที่ต้องการ
Concepts
getWindowHandle()- ได้ handle ของหน้าต่างปัจจุบัน (String)getWindowHandles()- ได้ Set ของ handle ทั้งหมดswitchTo().window(handle)- สลับไปหน้าต่างที่ระบุdriver.close()- ปิดหน้าต่างปัจจุบันdriver.quit()- ปิดทั้งหมดและจบ session
ตัวอย่าง: ปิดหน้าต่างที่มี Title "Sign in - Google Accounts"
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.Set;
import java.util.concurrent.TimeUnit;
public class CloseSpecificWindow {
public static void main(String[] args) {
System.setProperty("webdriver.chrome.driver",
"C:\\Users\\ghs6kor\\Desktop\\Java\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.manage().window().maximize();
try {
driver.get("https://secure.indeed.com/account/login");
// เก็บ parent window handle
String parentHandle = driver.getWindowHandle();
System.out.println("Parent handle: " + parentHandle);
// คลิกปุ่มที่เปิด popup/hindow ใหม่ (Google login)
driver.findElement(By.id("login-google-button")).click();
// รอ popup เปิด
Thread.sleep(3000);
// ได้ handles ทั้งหมด
Set allHandles = driver.getWindowHandles();
System.out.println("Total windows: " + allHandles.size());
// วนลูปหาและปิดหน้าต่างที่ต้องการ
for (String handle : allHandles) {
driver.switchTo().window(handle);
String title = driver.getTitle();
System.out.println("Window title: " + title);
if (title.equalsIgnoreCase("Sign in - Google Accounts")) {
System.out.println("Closing window: " + title);
driver.close(); // ปิดหน้าต่างนี้
break;
}
}
// สลับกลับ parent (สำคัญ! หลัง close ต้อง switch กลับ)
driver.switchTo().window(parentHandle);
System.out.println("Back to parent: " + driver.getTitle());
} catch (Exception e) {
e.printStackTrace();
} finally {
driver.quit();
}
}
}
จุดสำคัญ: หลัง close() ต้อง Switch กลับ
// ผิด - จะได้ NoSuchWindowException
driver.close();
driver.findElement(By.id("something")).click(); // ERROR!
// ถูกต้อง
driver.close();
driver.switchTo().window(parentHandle); // switch กลับก่อน
driver.findElement(By.id("something")).click(); // OK
รูปแบบการใช้งานทั่วไป
1. ปิด popup ทั้งหมดยกเว้น parent
String parent = driver.getWindowHandle(); Sethandles = driver.getWindowHandles(); for (String handle : handles) { if (!handle.equals(parent)) { driver.switchTo().window(handle); driver.close(); } } driver.switchTo().window(parent);
2. ปิดหน้าต่างตาม URL
for (String handle : driver.getWindowHandles()) {
driver.switchTo().window(handle);
if (driver.getCurrentUrl().contains("unwanted-domain.com")) {
driver.close();
break;
}
}
driver.switchTo().window(parentHandle);
3. ใช้ Stream API (Java 8+)
String parent = driver.getWindowHandle();
driver.getWindowHandles().stream()
.filter(h -> !h.equals(parent))
.findFirst()
.ifPresent(handle -> {
driver.switchTo().window(handle);
driver.close();
driver.switchTo().window(parent);
});
สรุปคำสั่งหลัก
| เมธอด | คำอธิบาย |
|---|---|
getWindowHandle() | Handle ของหน้าต่างปัจจุบัน |
getWindowHandles() | Set ของ handles ทั้งหมด |
switchTo().window(handle) | สลับ context ไปหน้าต่างอื่น |
close() | ปิดหน้าต่าง/แท็บปัจจุบัน |
quit() | ปิดทั้งหมด จบ session |