본문으로 건너뛰기
SDETRole
SDETRole

용어집 · UI 자동화

명시적 대기(Explicit Wait)

영어: Explicit wait

다른 이름: 명시적 대기, WebDriverWait, FluentWait, 익스플리싯 웨이트

정의

요소가 클릭 가능해지는 것처럼 특정 조건 하나를 타임아웃까지 폴링하며 기다리는 대기 방식으로, Selenium에서는 WebDriverWait로 작성합니다.

명시적 대기(Explicit wait)는 특정 조건이 참이 될 때까지 테스트를 멈추고, 반복해서 확인하다가 조건이 끝내 충족되지 않으면 타임아웃으로 실패합니다. 테스트가 기다려야 하는 정확한 지점에 직접 작성하고 무엇을 기다릴지 명시하기 때문에 “명시적”이라고 부릅니다. Selenium 4에서는 WebDriverWait를 ExpectedConditions의 조건이나 람다와 함께 사용합니다.

예시 (Selenium 4, Java)

import java.time.Duration;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));

WebElement save = wait.until(
    ExpectedConditions.elementToBeClickable(By.id("save")));
save.click();

wait.until(ExpectedConditions.textToBePresentInElementLocated(
    By.cssSelector("[role='status']"), "Saved"));

// Any condition can be a lambda that returns a non-null or true value
wait.until(d -> d.findElements(By.cssSelector(".result-row")).size() == 20);

WebDriverWait는 기본적으로 500ms마다 폴링하며, 폴링 중에는 NotFoundException을 무시합니다. 다른 간격이나 추가로 무시할 예외가 필요하면 FluentWait(withTimeout, pollingEvery, ignoring)를 사용하세요.

암시적 대기와의 차이

암시적 대기(implicit wait)는 모든 findElement 호출이 요소가 존재할 때까지 폴링하게 만드는 단일 전역 설정입니다. 가시성, 클릭 가능 여부, 텍스트에 대해서는 아무것도 모릅니다. 명시적 대기는 테스트의 한 지점에서 하나의 조건을 겨냥하므로, 스피너가 사라지거나 버튼이 활성화되는 것처럼 필요한 상태를 정확히 기다릴 수 있습니다.

Selenium 공식 문서는 두 방식을 섞어 쓰지 말라고 경고합니다. 타임아웃이 겹치면 대기 시간을 예측할 수 없게 되기 때문입니다. 대부분의 팀은 암시적 대기를 0으로 두고 모든 곳에서 명시적 대기를 씁니다.

흔한 실수

  • 대기 대신 Thread.sleep 사용. 고정 sleep은 머신에 따라 너무 짧거나(플래키) 너무 길고(느림), 대개는 둘 다입니다.
  • 가시성이 필요한데 존재 여부를 기다리기. presenceOfElementLocated는 노드가 DOM에 들어오는 즉시 통과하며, 숨겨져 있어도 마찬가지입니다.
  • 다시 렌더링되는 동안 WebElement를 붙잡고 있기. By 로케이터로 기다려서 DOM이 바뀐 후 요소를 다시 찾게 하세요.
  • 헬퍼마다 거대한 타임아웃으로 새 대기 객체 만들기. 합리적인 기본값 하나를 프레임워크에서 중앙 관리하세요.

SDETRole 전체에서 검색할 내용을 입력하세요.

Pagefind 전문 검색 · 브라우저에서 실행됩니다 검색 페이지 열기 →