본문 바로가기
카테고리 없음

요즘 개발자들 셀레니움 대기 방식 (WebDriverWait, 페이지 로딩 대기, 자동화 안정성)

by 가치정보인 2025. 4. 3.
반응형

웹 자동화에서 가장 흔한 문제 중 하나는 ‘페이지가 다 뜨기도 전에 요소를 찾으려는 시도’입니다. 특히 파이썬 셀레니움(Selenium)으로 웹 크롤링이나 테스트 자동화를 할 때, 페이지 로딩이 완료되기 전 명령이 실행되면 NoSuchElementException 오류가 자주 발생하죠. 이 글에서는 요즘 개발자들이 가장 많이 사용하는 셀레니움의 대기 전략을 중심으로 WebDriverWait, expected_conditions, 암묵적 대기와의 차이까지 실제 예제와 함께 정리합니다.

기본 중의 기본 - 암묵적 대기 vs 명시적 대기

셀레니움에는 크게 두 가지 대기 방식이 존재합니다. 하나는 암묵적 대기(Implicit Wait), 다른 하나는 명시적 대기(Explicit Wait) 입니다. 암묵적 대기는 드라이버를 생성한 후 한번만 설정해두면 모든 요소 탐색 시 일정 시간 기다려주는 방식입니다. 예시는 아래와 같습니다:

from selenium import webdriver

driver = webdriver.Chrome()
driver.implicitly_wait(5)
driver.get("https://example.com")
element = driver.find_element("id", "username")

하지만 암묵적 대기는 모든 find_element()에 동일한 시간이 적용되어 정밀한 제어가 어렵다는 단점이 있습니다.
그래서 요즘 개발자들은 특정 요소가 특정 조건을 만족할 때까지 기다릴 수 있는 명시적 대기(WebDriverWait)를 선호합니다. 명시적 대기는 요소 단위로 조건을 지정할 수 있어 더욱 유연하고, 빠르게 로딩되는 페이지에서도 불필요한 대기를 줄일 수 있다는 장점이 있습니다.

WebDriverWait과 expected_conditions 사용법

WebDriverWait은 셀레니움에서 명시적 대기를 구현하는 핵심 도구입니다. expected_conditions 모듈과 함께 쓰이며, 특정 요소가 존재하거나 클릭 가능해질 때까지 기다릴 수 있습니다. 아래는 대표적인 사용 예입니다:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

wait = WebDriverWait(driver, 10)
element = wait.until(EC.presence_of_element_located((By.ID, "username")))

여기서 presence_of_element_located는 요소가 DOM에 존재하기만 하면 OK인 조건입니다. 만약 사용자가 클릭 가능한 상태를 기다린다면 element_to_be_clickable을 사용할 수 있습니다. 다른 조건으로는 visibility_of_element_located, title_contains, url_contains 등도 있으며, 복잡한 조건을 커스터마이징하여 조합할 수도 있습니다.
2024년 기준으로는 WebDriverWait(driver, timeout).until() 패턴이 거의 표준처럼 사용되고 있고, 안정성 높은 자동화 스크립트를 만들기 위해서는 필수적인 구성 요소로 자리잡고 있습니다.

안정적인 자동화를 위한 실전 팁

실무에서는 단순히 대기 시간을 길게 주는 것보다는 조건 기반의 짧고 정확한 대기가 중요합니다. 예를 들어, 다음과 같은 팁이 있습니다:

  • time.sleep()은 지양하고 WebDriverWait을 기본으로 쓴다.
  • 동일 요소를 여러 번 참조할 경우, 변수로 저장해 사용한다.
  • 로딩 애니메이션이 끝나는 시점을 visibility_of_element_located로 감지한다.
  • 자바스크립트 렌더링이 많은 페이지는 document.readyState == "complete" 체크로 병행 대기를 구현한다.
from selenium.webdriver.support.ui import WebDriverWait

WebDriverWait(driver, 10).until(lambda d: d.execute_script("return document.readyState") == "complete")

이런 방식은 특히 SPA(Single Page Application)나 React 기반 페이지에서 효과적입니다. 또한 try-except를 사용하여 예외 처리를 함께 구현하면 자동화 중단을 최소화할 수 있습니다. 요즘 개발자들은 이러한 전략을 조합해 정확하면서도 효율적인 자동화를 구현하고 있습니다.

셀레니움 자동화에서 대기는 단순한 옵션이 아닌 성공의 열쇠입니다. WebDriverWait과 expected_conditions을 제대로 활용하면 페이지 로딩 문제 없이 안정적인 자동화가 가능해집니다. 지금 여러분의 셀레니움 코드에도 대기 전략을 도입해보세요. 훨씬 더 매끄러운 자동화를 경험하게 될 것입니다.

반응형