Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Chuyển tab (Switch Tabs) với Selenium WebDriver Java

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:

  1. Mở link mới trong tab mới (Ctrl+Click hoặc JavaScript).
  2. Lấy danh sách window handles.
  3. 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
ArrayList tabs = 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 WebDriverWait chờ 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");
}