Selenium WebDriver에서 자주 사용되는 close()와 quit() 메서드는 이름이 비슷하지만 동작 방식에 중요한 차이가 있습니다. 두 메서드 모두 브라우저를 종료하는 기능을 수행하며, 별도의 매개변수를 필요로 하지 않는다는 공통점이 있습니다.
close()와 quit()의 주요 차이점
| 번호 | close() | quit() |
|---|---|---|
| 1 | 현재 포커스가 있는 브라우저(창)만 종료합니다. | 열려 있는 모든 브라우저를 종료합니다. |
| 2 | 활성화된 WebDriver 인스턴스 하나만 닫습니다. | 모든 활성 WebDriver 인스턴스를 종료합니다. |
즉, 여러 개의 창이나 탭이 열려 있는 상황에서 close()를 호출하면 현재 작업 중인 창만 닫히고 나머지 창은 그대로 유지됩니다. 반면 quit()을 호출하면 해당 드라이버 세션과 관련된 모든 창이 한꺼번에 종료되며, 브라우저 세션 자체도 완전히 해제됩니다.
예제 코드
다음은 자식 창을 close()로 닫고, 마지막에 quit()으로 남은 부모 창까지 종료하는 Java 예제입니다.
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.concurrent.TimeUnit;
import java.util.Set;
import java.util.Iterator;
import org.testng.annotations.Test;
public class WindowHandles {
@Test
public void browserCloseQuit() throws Exception {
System.setProperty("webdriver.chrome.driver", "C:\\Selenium\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("https://www.tutorialspoint.com/index.htm");
// 현재(부모) 창의 핸들을 가져옵니다
String currentWindow = driver.getWindowHandle();
Set<String> allWindows = driver.getWindowHandles();
Iterator<String> i = allWindows.iterator();
while (i.hasNext()) {
String childWindow = i.next();
if (!childWindow.equalsIgnoreCase(currentWindow)) {
driver.switchTo().window(childWindow);
System.out.println("자식 창 핸들: " + childWindow);
// close() 메서드는 현재 포커스가 있는 자식 창만 닫습니다.
// 따라서 부모 창은 여전히 열려 있게 됩니다.
driver.close();
} else {
System.out.println("자식 창이 없습니다.");
}
}
// quit()은 모든 활성 WebDriver 인스턴스를 종료하므로,
// 이 시점에 남아 있는 부모 창도 함께 닫힙니다.
driver.quit();
}
}코드 설명
getWindowHandles()로 열려 있는 모든 창의 핸들을 조회한 뒤, 현재 창과 다른 핸들(자식 창)로 전환하여 close()를 호출합니다. 이 과정에서 자식 창만 닫히고 부모 창은 유지되며, 반복문이 끝난 후 quit()을 호출하면 남아 있던 부모 창까지 모두 종료됩니다.
언제 어떤 메서드를 사용해야 할까?
테스트 중 특정 탭이나 팝업 창만 닫고 싶다면 close()를, 테스트 케이스가 끝난 후 브라우저 세션을 깔끔하게 정리하고 싶다면 quit()을 사용하는 것이 좋습니다. 특히 quit()은 세션 리소스를 완전히 해제하기 때문에 테스트 종료 시점(afterMethod, afterTest 등)에서 호출하는 것이 일반적인 모범 사례입니다.