Selenium WebDriver를 사용하면 여러 개의 브라우저 창이 열려 있을 때 특정 창만 골라서 닫을 수 있습니다. 이때 핵심 역할을 하는 것이 getWindowHandles와 getWindowHandle 메서드입니다. 이 두 메서드를 활용하면 부모 창과 자식 창을 효율적으로 제어할 수 있습니다.
창 핸들(Window Handle)의 기본 개념
getWindowHandles() 메서드는 현재 열려 있는 모든 창의 핸들을 Set 자료구조에 저장합니다. 반면 getWindowHandle() 메서드는 현재 포커스가 맞춰져 있는 브라우저 창의 핸들 하나만 반환합니다.
Set 자료구조를 코드에서 사용하려면 다음 import 문을 추가해야 합니다.
import java.util.Set; import java.util.List;
기본적으로 드라이버 객체는 부모 창의 요소에만 접근할 수 있습니다. 따라서 포커스를 부모 창에서 자식 창으로 옮기려면 switchTo().window() 메서드를 사용하고, 인자로 해당 자식 창의 핸들 ID를 전달해야 합니다. 반대로 자식 창에서 다시 부모 창으로 돌아갈 때도 같은 메서드에 부모 창의 핸들 ID를 넘겨주면 됩니다.
특정 창을 닫는 실전 예제 코드
아래 예제는 Indeed 로그인 페이지에서 Google 로그인 버튼을 클릭해 새 창이 열리면, 창 제목을 확인하여 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;
public class CloseSpecificWindow {
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(5, TimeUnit.SECONDS);
// 부모 창의 핸들 저장
String m = driver.getWindowHandle();
driver.findElement(By.id("login-google-button")).click();
// 모든 창 핸들을 Set에 저장
Set w = driver.getWindowHandles();
// 창 핸들 순회
for (String h: w){
// 각 창으로 전환
driver.switchTo().window(h);
String s= driver.getTitle();
// 특정 창 제목 확인
if(s.equalsIgnoreCase("Sign in - Google Accounts")){
System.out.println("닫을 창의 제목: "+ driver.getTitle());
driver.close();
}
}
// 부모 창으로 전환 후 종료
driver.switchTo().window(m);
driver.quit();
}
}코드 실행 흐름 정리
위 코드의 동작 과정을 단계별로 살펴보면 다음과 같습니다.
1. ChromeDriver를 실행하고 Indeed 로그인 페이지에 접속합니다.
2. getWindowHandle()로 부모 창의 핸들을 미리 변수에 저장해 둡니다.
3. Google 로그인 버튼을 클릭하면 새로운 자식 창(Google 계정 로그인 창)이 열립니다.
4. getWindowHandles()로 열린 모든 창의 핸들을 가져온 뒤, for문으로 각 창을 순회하며 전환합니다.
5. 창 제목이 "Sign in - Google Accounts"와 일치하는 경우에만 driver.close()를 호출해 해당 창만 닫습니다.
6. 마지막으로 부모 창으로 포커스를 되돌린 후 driver.quit()으로 전체 세션을 종료합니다.
close()와 quit()의 차이점
여기서 주의할 점은 close()와 quit()의 차이입니다. close()는 현재 포커스가 있는 창 하나만 닫고, quit()는 WebDriver가 연 모든 창을 닫으면서 브라우저 세션 전체를 종료합니다. 따라서 특정 창만 닫으려면 반드시 close()를 사용해야 하며, 작업이 끝난 후 리소스를 정리하려면 quit()를 호출하는 것이 좋습니다.
실행 결과
코드를 실행하면 콘솔에 닫힌 창의 제목이 출력되고, Google 로그인 창만 종료된 것을 확인할 수 있습니다.
