การสลับแท็บใน Selenium ต้องทำ 3 ขั้นตอนหลัก:
- เปิดลิงก์ในแท็บใหม่ด้วย
Keys.chord(Keys.CONTROL, Keys.ENTER) - เก็บ Window Handles ทั้งหมดไว้ใน ArrayList
- ใช้
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 เพื่อเปิดในแท็บใหม่ |