파이썬으로 시작하는 셀레니움 - 06
파이썬으로 셀레니움을 사용할 수 있다.
파이썬으로 시작하는 셀레니움 - 06
[대기(Wait) 처리]
웹 자동화를 하다 보면 페이지 로딩이나 특정 요소가 나타날 때까지 기다려야 할 때가 많다.
이런 상황에서 대기 처리를 하지 않으면 NoSuchElementException
, ElementNotInteractableException
등의 오류가 발생할 수 있다.
Selenium은 다음과 같은 3가지 방식으로 대기 처리를 제공한다.
time.sleep()
– 단순한 고정 시간 대기- 명시적 대기 (
WebDriverWait
) - 암시적 대기 (
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.