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

สลับแท็บ (Switch Tabs) ด้วย Selenium WebDriver ใน Java

การสลับแท็บใน Selenium ต้องทำ 3 ขั้นตอนหลัก:

  1. เปิดลิงก์ในแท็บใหม่ด้วย Keys.chord(Keys.CONTROL, Keys.ENTER)
  2. เก็บ Window Handles ทั้งหมดไว้ใน ArrayList
  3. ใช้ driver.switchTo().window(handle) สลับไปแท็บที่ต้องการ

Syntax

// 1. เปิดลิงก์ในแท็บใหม่ (Ctrl+Click)
String clickLink = Keys.chord(Keys.CONTROL, Keys.ENTER);
driver.findElement(By.linkText("Terms of Use")).sendKeys(clickLink);

// 2. เก็บ window handles
ArrayList tabs = new ArrayList<>(driver.getWindowHandles());

// 3. สลับไปแท็บใหม่ (index 1)
driver.switchTo().window(tabs.get(1));

// 4. สลับกลับแท็บเดิม (index 0)
driver.switchTo().window(tabs.get(0));

ตัวอย่างโค้ดสมบูรณ์

import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;

public class SwitchTabsExample {
    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://www.tutorialspoint.com/about/about_careers.htm");

            // เปิดลิงก์ "Terms of Use" ในแท็บใหม่
            String ctrlClick = Keys.chord(Keys.CONTROL, Keys.ENTER);
            driver.findElement(By.linkText("Terms of Use")).sendKeys(ctrlClick);

            // รอสักครู่ให้แท็บใหม่เปิด
            Thread.sleep(2000);

            // เก็บ window handles ทั้งหมด
            ArrayList tabs = new ArrayList<>(driver.getWindowHandles());
            System.out.println("Total tabs: " + tabs.size());

            // สลับไปแท็บใหม่ (index 1)
            driver.switchTo().window(tabs.get(1));
            System.out.println("New tab title: " + driver.getTitle());
            System.out.println("New tab URL: " + driver.getCurrentUrl());

            // ทำงานบนแท็บใหม่...

            // สลับกลับแท็บเดิม (index 0)
            driver.switchTo().window(tabs.get(0));
            System.out.println("Parent tab title: " + driver.getTitle());

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            driver.quit();
        }
    }
}

การสลับแท็บแบบ Dynamic (ไม่ใช่ index แบบตายตัว)

// หาแท็บที่มี title/URL ตรงตามที่ต้องการ
String parentHandle = driver.getWindowHandle();

for (String handle : driver.getWindowHandles()) {
    driver.switchTo().window(handle);
    if (driver.getTitle().contains("Expected Title")) {
        break; // เจอแท็บที่ต้องการแล้ว
    }
}

// หรือใช้ stream (Java 8+)
driver.getWindowHandles().stream()
    .map(handle -> {
        driver.switchTo().window(handle);
        return driver.getTitle();
    })
    .filter(title -> title.contains("Expected"))
    .findFirst();

ปิดแท็บเฉพาะและกลับไปแท็บเดิม

String parentHandle = driver.getWindowHandle();

// เปิดแท็บใหม่...
// ...

// หาแท็บที่ไม่ใช่ parent แล้วปิด
for (String handle : driver.getWindowHandles()) {
    if (!handle.equals(parentHandle)) {
        driver.switchTo().window(handle);
        driver.close(); // ปิดแท็บนี้
        break;
    }
}

// กลับไป parent
driver.switchTo().window(parentHandle);

⚠️ ข้อควรระวัง

  • driver.close() ปิดแท็บ/หน้าต่างปัจจุบัน | driver.quit() ปิดทั้งหมดและจบ session
  • หลัง close() ต้อง switchTo() ไป window handle ที่ยังอยู่ ไม่งั้นจะได้ NoSuchWindowException
  • Window handle เป็น string แบบสุ่ม ไม่ควรเก็บไว้ใช้ระหว่าง session ต่างกัน

สรุปคำสั่งหลัก

คำสั่งคำอธิบาย
driver.getWindowHandle()ได้ handle ของแท็บปัจจุบัน
driver.getWindowHandles()ได้ Set ของ handle ทั้งหมด
driver.switchTo().window(handle)สลับไปแท็บที่ระบุ
Keys.chord(Keys.CONTROL, Keys.ENTER)กด Ctrl+Click เพื่อเปิดในแท็บใหม่