Selenium quản lý các cửa sổ/tab thông qua Window Handles. Mỗi tab/cửa sổ có một ID duy nhất. Để chuyển tab, ta cần:
- Mở link mới trong tab mới (Ctrl+Click hoặc JavaScript).
- Lấy danh sách window handles.
- Chuyển driver sang handle của tab mục tiêu.
Mở link trong tab mới
// Cách 1: Keys.chord (Ctrl+Enter)
String ctrlEnter = Keys.chord(Keys.CONTROL, Keys.ENTER);
driver.findElement(By.linkText("Terms of Use")).sendKeys(ctrlEnter);
// Cách 2: JavaScript (linh hoạt hơn, không phụ thuộc OS)
((JavascriptExecutor) driver).executeScript("window.open(arguments[0], '_blank');", linkElement);
Chuyển sang tab mới
// Lấy tất cả window handles ArrayListtabs = new ArrayList<>(driver.getWindowHandles()); // Chuyển sang tab mới (thường là tabs.get(1) vì tabs.get(0) là parent) driver.switchTo().window(tabs.get(1)); // Làm việc trên tab mới... System.out.println("Tab mới title: " + driver.getTitle()); // Quay về tab gốc driver.switchTo().window(tabs.get(0)); System.out.println("Tab gốc title: " + driver.getTitle());
Ví dụ hoàn chỉnh
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.ArrayList;
public class SwitchTabsExample {
public static void main(String[] args) {
System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");
WebDriver driver = new ChromeDriver();
try {
driver.get("https://www.example.com");
// Mở link trong tab mới bằng JS
WebElement link = driver.findElement(By.linkText("More info"));
((JavascriptExecutor) driver).executeScript("window.open(arguments[0], '_blank');", link);
// Chờ tab mới load (nên dùng WebDriverWait thay Thread.sleep)
Thread.sleep(1000);
// Chuyển sang tab mới
ArrayList tabs = new ArrayList<>(driver.getWindowHandles());
driver.switchTo().window(tabs.get(1));
System.out.println("Tab mới: " + driver.getTitle());
// Đóng tab mới (tùy chọn)
driver.close();
// BẮT BUỘC chuyển về tab gốc trước khi tiếp tục
driver.switchTo().window(tabs.get(0));
System.out.println("Đã quay về tab gốc: " + driver.getTitle());
} catch (Exception e) {
e.printStackTrace();
} finally {
driver.quit();
}
}
}
Lưu ý quan trọng
- Luôn switch về tab gốc sau khi đóng tab con, nếu không driver sẽ ở trạng thái "no such window".
driver.close()đóng tab/cửa sổ hiện tại.driver.quit()đóng tất cả và kết thúc session.- Dùng
WebDriverWaitchờ số lượng handles tăng lên thay vìThread.sleep:
new WebDriverWait(driver, Duration.ofSeconds(5))
.until(d -> d.getWindowHandles().size() == 2);
Xử lý nhiều tab (generic)
public void switchToTabByTitle(WebDriver driver, String targetTitle) {
for (String handle : driver.getWindowHandles()) {
driver.switchTo().window(handle);
if (driver.getTitle().contains(targetTitle)) return;
}
throw new NoSuchWindowException("Tab with title '" + targetTitle + "' not found");
}