Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python Selenium WebDriver 명시적 대기(Explicit Wait) 완벽 가이드

명시적 대기(Explicit Wait)란?

웹 자동화 테스트를 작성하다 보면 페이지 로딩 지연이나 동적 콘텐츠 렌더링 때문에 대상 요소가 즉시 나타나지 않는 경우가 자주 발생합니다. 이럴 때 명시적 대기(Explicit Wait)를 사용하면, 자동화 스크립트가 다음 단계로 넘어가기 전에 특정 조건이 충족될 때까지 웹드라이버가 기다리도록 지시할 수 있습니다.

Python Selenium에서 명시적 대기는 WebDriverWait 클래스와 expected_conditions 모듈을 함께 사용하여 구현합니다. expected_conditions에는 다양한 상황에서 활용할 수 있는 사전 정의된 조건들이 포함되어 있습니다.

expected_conditions의 주요 조건 목록

  • alert_is_present – 경고창(Alert)이 화면에 나타날 때까지 대기
  • title_is – 페이지 제목이 지정한 문자열과 정확히 일치할 때까지 대기
  • title_contains – 페이지 제목에 지정한 문자열이 포함될 때까지 대기
  • presence_of_element_located – 요소가 DOM에 존재할 때까지 대기
  • presence_of_all_elements_located – 일치하는 모든 요소가 DOM에 존재할 때까지 대기
  • visibility_of_element_located – 요소가 화면에 표시될 때까지 대기
  • visibility_of – 이미 찾은 요소가 화면에 표시될 때까지 대기
  • invisibility_of_element_located – 요소가 화면에서 사라지거나 숨겨질 때까지 대기
  • element_to_be_clickable – 요소가 클릭 가능한 상태가 될 때까지 대기
  • element_to_be_selected – 요소가 선택된 상태가 될 때까지 대기
  • element_located_to_be_selected – 특정 위치의 요소가 선택될 때까지 대기
  • element_selection_state_to_be – 요소의 선택 상태가 지정한 값과 일치할 때까지 대기
  • staleness_of – 요소가 DOM에서 분리될 때까지 대기
  • text_to_be_present_in_element – 요소 안에 특정 텍스트가 나타날 때까지 대기
  • text_to_be_present_in_element_value – 요소의 value 속성에 특정 텍스트가 나타날 때까지 대기
  • frame_to_be_available_and_switch_to_it – 프레임이 사용 가능해지면 해당 프레임으로 전환

실습 시나리오

예제 페이지에는 'Team'이라는 링크가 있습니다. 이 링크를 클릭하면 화면에 'Team @ Tutorials Point'라는 텍스트(h1 태그)가 나타납니다. 링크 클릭 후 새로운 콘텐츠가 로딩되기까지 시간이 걸릴 수 있으므로, 명시적 대기를 활용해 h1 요소가 나타날 때까지 기다린 뒤 텍스트를 추출해 보겠습니다.

코드 구현

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

# 드라이버 실행 (Selenium 4부터는 드라이버 경로 자동 관리)
driver = webdriver.Chrome()

# URL 접속
driver.get('https://www.tutorialspoint.com/about/about_careers.htm')

# 'Team' 링크 요소 식별 후 클릭
l = driver.find_element(By.LINK_TEXT, 'Team')
l.click()

# 명시적 대기: 최대 5초 동안 h1 태그가 DOM에 나타날 때까지 대기
w = WebDriverWait(driver, 5)
w.until(EC.presence_of_element_located((By.TAG_NAME, 'h1')))

# h1 요소에서 텍스트 추출
s = driver.find_element(By.TAG_NAME, 'h1')
t = s.text
print('텍스트: ' + t)

# 드라이버 종료
driver.quit()

참고: Selenium 4부터는 find_element_by_link_text(), find_element_by_tag_name()과 같은 개별 메서드가 제거되고 find_element(By.XXX, ...) 형태로 통합되었습니다. 또한 webdriver.Chrome()은 Selenium Manager가 드라이버를 자동으로 관리하므로 executable_path를 직접 지정할 필요가 없습니다.

실행 결과

위 코드를 실행하면 'Team' 링크를 클릭한 후 최대 5초간 h1 요소의 등장을 기다리고, 요소가 나타나는 즉시 해당 텍스트를 콘솔에 출력합니다.

텍스트: Team @ Tutorials Point

마무리

명시적 대기는 특정 조건에만 정밀하게 적용할 수 있어 불필요한 지연을 줄이면서도 안정적인 테스트 자동화를 가능하게 합니다. 고정 시간 대기인 time.sleep()보다 효율적이며, WebDriverWaitexpected_conditions의 조합은 동적으로 변하는 웹 페이지를 테스트할 때 반드시 알아두어야 할 핵심 패턴입니다.