Window handle trong Selenium webDriver là gì?
WebDriver không phân biệt giữa windows và tabs. Nếu trang web của bạn mở một tab mới hoặc cửa sổ (window) mới , Selenium sẽ cho bạn làm việc với nó qua window handle. Mỗi cửa sổ (window) là một mã định danh duy nhất trong một phiên duy nhất. Về cơ bản, đây là một con trỏ tới một cửa sổ, trả về giá trị chuỗi (string).

Chúng ta có thể lấy mã đinh danh ID của từng window bằng cách sử dụng các phương thức do Selenium Webdriver cung cấp và sau đó sử dụng ID để chuyển sang các cửa sổ được chỉ định.
Đây là các phương thức khác nhau được cung cấp bởi Selenium WebDriver để xử lý các cửa sổ (windows)
Get window handle
Lấy window handle của cửa sổ hiện tại.
driver.getWindowHandle();
Di chuyển giữa các window và các tab với nhau
Khi bạn nhấp vào liên kết (link) mở ra cửa sổ mới hoặc tab mới trên màn hình, lúc này WebDriver sẽ không biết được cửa sổ nào mà Hệ điều hành cho là đang hoạt động. Để làm việc với cửa sổ mới, bạn sẽ cần chuyển sang cửa sổ đó.
Ví dụ:
Nếu bạn chỉ có hai tab hoặc cửa sổ đang mở và bạn biết mình bắt đầu với cửa sổ nào, bằng quá trình loại bỏ, bạn có thể lặp qua cả hai cửa sổ hoặc tab mà WebDriver có thể nhìn thấy và chuyển sang cửa sổ hoặc tab không phải là bản gốc.
- Xác định cửa sổ hiện tại xem như là bản gốc – originalWindow
- Kiểm tra và đảm bảo chỉ có một cửa sổ đang được mở
- Nhấp vào link liên kết để mở cửa sổ mới/ tab mới
- Di chuyển qua cửa sổ mới bằng cách:
- Lấy danh sách các cửa sổ (windowHandles) đang mở
- Sử dụng vòng lặp qua các window Handles đó, nếu cửa sổ/tab đó không phải là cửa sổ gốc (originalWindow) thì sử dụng lệnh swithTo() để di chuyển webDriver đến cửa sổ đó.
//Store the ID of the original window
String originalWindow = driver.getWindowHandle();
//Check we don't have other windows open already
assert driver.getWindowHandles().size() == 1;
//Click the link which opens in a new window
driver.findElement(By.linkText("new window")).click();
//Wait for the new window or tab
wait.until(numberOfWindowsToBe(2));
//Loop through until we find a new window handle
for (String windowHandle : driver.getWindowHandles()) {
if(!originalWindow.contentEquals(windowHandle)) {
driver.switchTo().window(windowHandle);
break;
}
}
Tạo mới một window hoặc một tab
Khác với việc người dùng nhấp vào link liên kết để mở một cửa sổ hoặc 1 tab mới mà webDriver không tự chuyển qua cửa sổ mới đó. Thì Selenium version 4 cung cấp API newWindow() cho phép tạo mới một cửa sổ hoặc tab và webDriver sẽ được chuyển qua cửa sổ mới đó một cách tư động.
// Opens a new tab and switches to new tab
driver.switchTo().newWindow(WindowType.TAB);
// Opens a new window and switches to new window
driver.switchTo().newWindow(WindowType.WINDOW);
Đóng window hoặc tab
Khi bạn xong trên một cửa sổ hoặc tab và nó không phải là cửa sổ hoặc tab cuối cùng được mở trong trình duyệt của bạn, bạn nên đóng nó và chuyển về cửa sổ bạn đang sử dụng trước đó.
Việc quên chuyển về cửa sổ đang mở khác sau khi đóng cửa sổ hiện tại sẽ làm cho WebDriver thực thi trên cửa sổ hiện đã bị đóng, do đó webDriver sẽ không tìm thấy window cần làm và sẽ trả về “No Such Window Exception“. Do đó, bạn phải chuyển về cửa sổ hợp lệ để tiếp tục thực hiện kiểm thử
//Close the tab or window
driver.close();
//Switch back to the old tab or window
driver.switchTo().window(originalWindow);
Thoát khỏi trình duyệt sau mỗi phiên làm việc
Khi bạn kết thúc phiên trình duyệt, bạn nên gọi hàm driver.quit(), thay vì driver.close()
driver.quit();
Window management
WebDriver có các phương thức sau hỗ trợ việc quản lý cửa sổ trong quá trình làm việc.
Lấy kích thước của cửa sổ (get window size)
Tìm nạp kích thước của cửa sổ trình duyệt bằng pixel.
//Access each dimension individually
int width = driver.manage().window().getSize().getWidth();
int height = driver.manage().window().getSize().getHeight();
//Or store the dimensions and query them later
Dimension size = driver.manage().window().getSize();
int width1 = size.getWidth();
int height1 = size.getHeight();
Thiết lập kích thước cho cửa sổ (Set window size)
Khôi phục và thiết lập kích thước cửa sổ.
driver.manage().window().setSize(new Dimension(1024, 768));
Lấy vị trí của cửa sổ (get window position)
Tìm tọa độ của tọa độ trên cùng bên trái của cửa sổ trình duyệt.
// Access each dimension individually
int x = driver.manage().window().getPosition().getX();
int y = driver.manage().window().getPosition().getY();
// Or store the dimensions and query them later
Point position = driver.manage().window().getPosition();
int x1 = position.getX();
int y1 = position.getY();
Thiết lập vị trí cho cửa sổ (Set window position)
Di chuyển cửa sổ đến vị trí đã chọn.
driver.manage().window().setPosition(new Point(0, 0));
Phóng to cửa sổ (Maximize window)
Phóng to cửa sổ. Đối với hầu hết các hệ điều hành, cửa sổ sẽ lấp đầy màn hình mà không chặn các menu và thanh công cụ của hệ điều hành
driver.manage().window().maximize();
Thu nhỏ cửa sổ (Minimize window )
Thu nhỏ cửa sổ hiện tại. Hành vi chính xác của lệnh này dành riêng cho từng window. Minimize Window thường ẩn cửa sổ trong khay hệ thống.
Lưu ý: Tính năng này hoạt động từ Selenium version 4
driver.manage().window().minimize();
Fullscreen window
Khác với Maximize window, tính năng này lấp đầy toàn bộ màn hình, tương tự như khi bạn nhấn F11 trong trình duyệt.
driver.manage().window().fullscreen();
Code Example
package SeleniumWebDriverTutorial; import io.github.bonigarcia.wdm.WebDriverManager; import org.openqa.selenium.Dimension; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WindowType; import org.openqa.selenium.chrome.ChromeDriver; public class WindowHandleExample { public static void main(String[] args) throws Exception { WebDriverManager.chromedriver().setup(); WebDriver driver = new ChromeDriver(); driver.manage().window().maximize(); driver.get("https://devopsify.co"); Thread.sleep(3000); //get current Window String originalWindow = driver.getWindowHandle(); System.out.println("originalWindow -> " + originalWindow); assert driver.getWindowHandles().size() == 1; // Opens a new tab and switches to new tab driver.switchTo().newWindow(WindowType.TAB); String theSecondWindow = driver.getWindowHandle(); driver.navigate().to("https://devopsify.co/tao-selenium-automation-test-voi-maven-intellij/"); System.out.println("theSecondWindow -> " + theSecondWindow); // Opens a new window and switches to new window driver.switchTo().newWindow(WindowType.WINDOW); String theThirdWindow = driver.getWindowHandle(); driver.navigate().to ("https://devopsify.co/test/automation-test/"); driver.manage().window().fullscreen(); Thread.sleep(3000); driver.manage().window().minimize(); //set window size driver.manage().window().setSize(new Dimension(1024, 768)); System.out.println("theThirdWindow -> " + theThirdWindow); //get window size System.out.println("width = "+ driver.manage().window().getSize().width); System.out.println("heigh = "+ driver.manage().window().getSize().height); //get window position System.out.println("x = "+ driver.manage().window().getPosition().getX()); System.out.println("y = "+ driver.manage().window().getPosition().getY()); //Loop through three windows and tab for (String windowHandle : driver.getWindowHandles()) { driver.switchTo().window(windowHandle); System.out.println(driver.getTitle()); Thread.sleep(3000); } driver.switchTo().window(originalWindow); driver.close(); System.out.println("After closing original window"); //Loop through three windows and tab for (String windowHandle : driver.getWindowHandles()) { driver.switchTo().window(windowHandle); System.out.println(windowHandle); Thread.sleep(3000); } driver.switchTo().window(theSecondWindow); driver.quit(); } }
Các bạn thử chạy chương trình trên để xem kết quả Selenium WebDriver xử lý các cửa sổ của trình duyệt thế nào nhé!
Cheer! 🙂