Selenium Simplified — Selenium에서 대기 이해하기 (Implicit vs Explicit Wait)
Source: Dev.to
번역할 텍스트가 제공되지 않았습니다. 번역이 필요한 본문을 알려주시면 도와드리겠습니다.
Source: …
소개
이전 글에서는 Selenium이 페이지에서 요소를 찾기 위해 로케이터를 사용하는 방법을 배웠습니다.
초보자들은 페이지에 요소가 존재함에도 불구하고 NoSuchElementException이나 ElementNotInteractableException과 같은 오류를 자주 마주합니다.
그 원인은 보통 타이밍 문제입니다. 현대 웹 애플리케이션은 요소를 동적으로 로드하기 때문에 Selenium이 요소가 나타나기 전에 상호작용을 시도할 수 있습니다. Selenium은 실제 사용자가 하는 것보다 훨씬 빠르게 스크립트를 실행합니다:
- 페이지 열기
- 요소 찾기
- 버튼 클릭
페이지가 아직 백그라운드에서 콘텐츠를 로드 중이라면, Selenium은 아직 나타나지 않은 요소를 찾으려 시도하게 되고, 이로 인해 테스트가 실패합니다.
대기(Wait) 를 사용하면 특정 조건이 충족될 때까지 Selenium이 일시 정지하도록 할 수 있습니다(예: 요소가 보이게 되거나 클릭 가능해지거나 페이지 로딩이 완료될 때). 조건이 만족되면 Selenium은 스크립트 실행을 계속합니다.
Selenium은 두 가지 주요 대기 방식을 제공합니다:
- 암시적 대기(Implicit Wait)
- 명시적 대기(Explicit Wait)
Source: …
암시적 대기
암시적 대기는 Selenium에게 요소를 검색할 때 지정된 시간만큼 대기하도록 지시합니다. 요소를 즉시 찾지 못하면 Selenium은 타임아웃에 도달할 때까지 계속 시도합니다.
// Set implicit wait to 10 seconds
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
이 의미는
- Selenium은 요소를 찾으려 할 때 최대 10초까지 대기합니다.
- 요소가 더 일찍 나타나면 Selenium은 즉시 다음 단계로 진행합니다.
driver.findElement(By.id("loginButton")).click(); // waits up to 10 s if needed
요소가 로드되는 데 3초가 걸리면 Selenium은 그 3초를 기다린 뒤 클릭합니다.
Source:
명시적 대기
명시적 대기는 더 유연합니다. Selenium이 가시성, 클릭 가능 여부, 텍스트 존재와 같은 특정 조건을 기다리도록 할 수 있습니다.
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
WebElement element = wait.until(
ExpectedConditions.visibilityOfElementLocated(By.id("loginButton"))
);
여기서 Selenium은 요소가 페이지에 표시될 때까지 기다립니다.
일반적인 Expected Conditions
visibilityOfElementLocatedelementToBeClickablepresenceOfElementLocatedtitleContains
예시
wait.until(ExpectedConditions.elementToBeClickable(By.id("submit")));
이 코드는 요소와 상호 작용하기 전에 해당 요소가 클릭 가능하도록 보장합니다.
비교: 암시적 대 명시적 대기
| 특징 | 암시적 대기 | 명시적 대기 |
|---|---|---|
| 범위 | 전역적으로 적용 | 특정 요소에 적용 |
| 유연성 | 제한적 | 매우 유연함 |
| 사용법 | 간단함 | 더 많은 제어 |
| 복잡한 시나리오에 권장 | 아니오 | 예 |
대부분의 최신 자동화 프레임워크에서는 명시적 대기가 선호됩니다. 이는 테스트 동작에 대한 더 나은 제어를 제공하기 때문입니다.
Thread.sleep()을 사용하지 말아야 하는 이유
일부 초보자는 테스트를 일시 정지하기 위해 Thread.sleep()을 사용합니다:
Thread.sleep(5000); // 정확히 5초 동안 일시 정지
이 접근 방식의 문제점
- 테스트가 느려집니다
- 신뢰성이 떨어집니다 (요소가 나중에 로드되면 실패)
- 유지 보수가 어렵습니다
Selenium이 제공하는 내장 대기 기능을 사용하는 것이 훨씬 더 좋은 해결책입니다.
대기와 함께하는 일반적인 Selenium 테스트 흐름
Open Page
↓
Find Element
↓
Wait Until Element Is Ready
↓
Perform Action
대기(Wait)를 포함하면 자동화 스크립트가 더 안정적이고 신뢰할 수 있게 됩니다. 타이밍 문제는 Selenium 테스트 실패의 가장 흔한 원인 중 하나입니다. 적절한 대기 사용은 Selenium이 요소가 준비된 경우에만 상호작용하도록 보장하여, 테스트가 다음과 같은 특징을 갖게 합니다:
- 더 신뢰성 있음
- 덜 불안정함
- 유지보수가 쉬움
Series Recap & What’s Next
So far in this series we have covered:
- Selenium architecture
- Locators
- Waits
Next article: Selenium Simplified — Handling Alerts, Frames, and Multiple Windows
These features are common in modern web applications and require Selenium to switch control between different contexts.