Post

파이썬으로 시작하는 셀레니움 - 06

파이썬으로 셀레니움을 사용할 수 있다.

파이썬으로 시작하는 셀레니움 - 06

[대기(Wait) 처리]


웹 자동화를 하다 보면 페이지 로딩이나 특정 요소가 나타날 때까지 기다려야 할 때가 많다.
이런 상황에서 대기 처리를 하지 않으면 NoSuchElementException, ElementNotInteractableException 등의 오류가 발생할 수 있다.

Selenium은 다음과 같은 3가지 방식으로 대기 처리를 제공한다.

  1. time.sleep() – 단순한 고정 시간 대기
  2. 명시적 대기 (WebDriverWait)
  3. 암시적 대기 (implicitly_wait)


1. time.sleep()의 한계


  • 가장 간단한 대기 방법으로, 지정한 시간만큼 프로그램 실행을 멈춘다.

    무조건 기다리기 때문에 비효율적이다. 요소가 이미 로딩됐더라도 무조건 대기한다.

1
2
3
4
import time

# 3초 동안 프로그램 실행을 일시 정지 (강제 대기)
time.sleep(3)

✅ 추천: 테스트용으로만 사용하고, 실제 자동화에서는 명시적/암시적 대기를 쓰는 것이 좋다.


2. 명시적 대기

  • 명시적 대기는 특정 조건이 만족될 때까지 기다리는 방식이다.

    예를 들어, 버튼이 나타날 때까지 10초간 기다리되, 그 전에 나타나면 바로 진행한다.

1
2
3
4
5
6
7
8
9
10
11
12
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 최대 10초 동안 특정 조건을 만족할 때까지 대기할 WebDriverWait 객체 생성
wait = WebDriverWait(driver, 10)

# ID가 'submit'인 요소가 DOM에 나타날 때까지 대기
button = wait.until(EC.presence_of_element_located((By.ID, "submit")))

# 요소가 나타나면 클릭 수행
button.click()
조건 함수 예시의미
presence_of_element_located요소가 DOM에 존재하는지 확인
visibility_of_element_located요소가 화면에 보이는지 확인
element_to_be_clickable요소가 클릭 가능한지 확인
text_to_be_present_in_element요소에 특정 텍스트가 포함됐는지 확인

until()은 조건이 충족될 때까지 기다리고, 충족되면 해당 요소를 반환한다.


3. 암시적 대기

  • 암시적 대기는 모든 요소 탐색(find_element) 전에 지정한 시간만큼 대기를 시도하는 방식이다.

  • 한 번 설정하면 WebDriver 전체에 적용된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from selenium import webdriver
from selenium.webdriver.common.by import By

# Chrome 브라우저 실행
driver = webdriver.Chrome()

# 암시적 대기 설정 (요소가 나타날 때까지 최대 5초 대기)
driver.implicitly_wait(5)

# 웹 페이지 열기
driver.get("https://example.com")

# 요소 탐색 (최대 5초간 대기하며 ID가 'username'인 요소를 찾음)
element = driver.find_element(By.ID, "username")

요소가 바로 나타나면 즉시 실행되며, 나타나지 않으면 최대 시간까지 기다린 후 예외 발생.

암시적 대기와 명시적 대기를 동시에 사용하는 것은 권장되지 않는다.
충돌 가능성이 있고, 디버깅이 어려워진다.

Summary

방식코드 예시특징
time.sleep()time.sleep(3)무조건 대기, 비효율적
명시적 대기WebDriverWait(...).until(...)특정 조건 충족 시까지 대기
암시적 대기driver.implicitly_wait(5)find_element 전에 대기 설정

명시적 대기가 가장 유연하고 안정적이기 때문에 가장 자주 사용된다.

This post is licensed under CC BY 4.0 by the author.