Selenium WebDriver에서는 테스트 중 새롭게 열린 자식 브라우저 창(팝업 창)을 손쉽게 제어하고 닫을 수 있습니다. 이때 핵심 역할을 하는 것이 getWindowHandles()와 getWindowHandle() 메서드입니다.
핵심 개념 정리
1. getWindowHandles() vs getWindowHandle()
getWindowHandles() 메서드는 현재 열려 있는 모든 브라우저 창의 핸들을 Set 자료구조에 저장합니다. 반면 getWindowHandle() 메서드는 현재 활성화된 브라우저 창의 핸들만 반환합니다.
2. 필요한 import 구문
Set 자료구조와 Iterator를 사용하기 위해 코드 상단에 다음과 같은 import 문을 추가해야 합니다.
import java.util.Set; import java.util.List; import java.util.Iterator;
3. switchTo().window()로 창 전환하기
기본적으로 드라이버 객체는 부모 창의 요소에만 접근할 수 있습니다. 따라서 부모 창에서 자식 창으로 초점을 옮기려면 switchTo().window() 메서드에 자식 창의 핸들 ID를 인자로 전달해야 합니다. 반대로 자식 창에서 다시 부모 창으로 돌아갈 때도 동일한 메서드에 부모 창의 핸들 ID를 넘겨주면 됩니다.
예제 코드
다음은 Indeed 로그인 페이지에서 Google 로그인 버튼을 클릭해 열린 자식 창을 닫고, 다시 부모 창으로 전환하는 전체 코드입니다.
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.concurrent.TimeUnit;
import java.util.List;
import java.util.Set;
import java.util.Iterator;
public class CloseChildWindow {
public static void main(String[] args) {
System.setProperty("webdriver.chrome.driver", "C:\\Users\\ghs6kor\\Desktop\\Java\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.get("https://secure.indeed.com/account/login");
// 암시적 대기 설정
driver.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS);
driver.findElement(By.id("login-google-button")).click();
// 모든 창 핸들 가져오기
Set w = driver.getWindowHandles();
// 창 핸들 순회
Iterator t = w.iterator();
String ch = t.next();
String pw = t.next();
// 자식 창으로 전환
driver.switchTo().window(ch);
System.out.println("자식 창 제목: " + driver.getTitle());
// 자식 브라우저 창 닫기
driver.close();
// 부모 창으로 전환
driver.switchTo().window(pw);
System.out.println("부모 창 제목: " + driver.getTitle());
driver.quit();실행 결과
코드를 실행하면 콘솔에 자식 창과 부모 창의 각각의 제목이 출력되며, 자식 창은 driver.close() 호출 시점에 종료됩니다.

정리
창이 하나만 남았거나 세션 전체를 종료할 때는 quit()을, 특정 창 하나만 닫을 때는 close()를 사용한다는 점을 기억하면 됩니다. 이 두 메서드의 차이를 명확히 이해하면 다중 창 환경에서도 안정적인 자동화 테스트를 작성할 수 있습니다.