Selenium WebDriver에서는 웹페이지가 완전히 로드될 때까지 기다려야 하는 상황이 자주 발생합니다. 이때 활용할 수 있는 것이 바로 동기화(Synchronization) 개념입니다. Selenium의 동기화는 암시적 대기(Implicit Wait)와 명시적 대기(Explicit Wait) 두 가지 방식으로 나뉘며, 페이지 로딩 여부를 확인하려면 명시적 대기를 사용하는 것이 가장 효과적입니다.
명시적 대기(Explicit Wait)란?
명시적 대기는 특정 요소가 예상한 상태(condition)에 도달할 때까지 지정된 시간만큼 대기하도록 설계된 방식입니다. 페이지 로딩 완료를 판단하려면 presence_of_element_located라는 예상 조건(Expected Condition)을 사용하여 특정 요소가 DOM에 존재하는지 확인하면 됩니다.
만약 지정한 대기 시간 내에 조건이 충족되지 않으면 TimeoutException 오류가 발생합니다.
구현 방법
명시적 대기를 구현하려면 WebDriverWait 클래스와 expected_conditions 모듈을 함께 사용해야 합니다. 아래 예제에서는 페이지 내 h1 태그 요소의 존재 여부를 확인하여 페이지가 정상적으로 로드되었는지 검증합니다.
예제 코드
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
driver = webdriver.Chrome(executable_path="C:\\chromedriver.exe")
driver.get("https://www.tutorialspoint.com/about/about_careers.htm")
# h1 태그 요소가 나타날 때까지 최대 8초간 대기
try:
w = WebDriverWait(driver, 8)
w.until(EC.presence_of_element_located((By.TAG_NAME, "h1")))
print("Page load happened")
except TimeoutException:
print("Timeout happened no page load")
driver.close()실행 결과
위 코드를 실행하면 다음과 같은 결과를 확인할 수 있습니다.
- 8초 이내에 h1 요소가 발견되면
Page load happened메시지가 출력됩니다. - 대기 시간이 초과되면
Timeout happened no page load메시지와 함께TimeoutException이 처리됩니다.
핵심 포인트 정리
- WebDriverWait(driver, timeout): 드라이버 인스턴스와 최대 대기 시간(초)을 인자로 받습니다.
- EC.presence_of_element_located(): 지정한 로케이터(By.ID, By.TAG_NAME 등)에 해당하는 요소가 DOM에 존재하는지 확인합니다.
- TimeoutException 처리: try-except 블록으로 감싸 대기 시간 초과 상황을 안전하게 처리할 수 있습니다.
이처럼 명시적 대기를 활용하면 고정된 시간(sleep)을 기다리는 비효율적인 방식 대신, 실제 조건이 충족되는 순간 즉시 다음 단계로 진행할 수 있어 테스트의 안정성과 속도를 모두 향상시킬 수 있습니다.