Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

ปิดหน้าต่างเฉพาะ (Specific Window) ด้วย Selenium WebDriver ใน Java

เมื่อมีหลายหน้าต่าง/แท็บ ใช้ 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();
Set handles = 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