공부/Python

[Python] Selenium 크롤링 - WebDriverWait 사용하기

jimiini 2025. 2. 1. 16:58
반응형

 

Selenium 크롤링 하다가 브라우저의 로딩이 길어지게 되면서 NoSuchElementException, ElementNotVisibleException 에러가 발생된 적이 있을 것입니다.

 

웹 페이지 로딩이 아직 다 안되어서 찾고자 하는 element가 확인되지 않은 경우에 발생됩니다. 이러한 경우에 로딩되기까지 기다려야하며, 로딩되고 난 후 element 를 찾아야 합니다.

 

time.sleep()으로 조건을 시간을 설정할 수 있지만, 정확하게 로딩이 걸리는 시간을 예상하여 설정하기엔 어려움이 있습니다.

 

Selenium Webdriver는 Explicit Waits(명시적 대기) 와 Implicit Waits(암묵적 대기) 의 두가지 Wait 타입을 제공하고 있습니다.

1. Explicit Waits ( 명시적 대기 )

명시적 대기는 코드에서 로딩 시 특정 element가 발견될 때까지 기다리도록 정의하는 코드입니다. 즉, 어떤 조건을 설정 했고 그 조건이 성립할때까지 기다립니다. 조건이 성립하지 않으면 timeout으로 설정된 시간만큼 최대한 기다립니다.

 

다음 코드는 ID가 TEST 인 element 가 발견될 때까지 최대 10초 동안 기다립니다. 그 시간 동안 요소가 발견되지 않으면 TimeoutException이 throw 되고, 요소를 발견하게 되면 즉시 해당 요소를 리턴합니다. 10초를 무조건 기다리지 않고 5초정도에 발견하게 되면 즉시 반환합니다.

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

driver = webdriver.Chrome()
driver.get("http://gogoing.co.kr")

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


2. Implicit Waits ( 암묵적 대기 )

설정은 최초 driver 를 생성할 때 설정해 주며, 전체 웹 브라우저에서 특정 element 를 찾을 때 모두 적용이됩니다.

 

Implicitly wait을 10초로 설정하면 페이지가 로딩되는데 10초까지 대기합니다. 만약 페이지 로딩이 2초에 완료되었다면 더 기다리지 않고 다음 코드를 수행합니다.

 

time.sleep(10)의 경우, 페이지가 로딩되어도 무조건 10초를 기다리는 것인 반면에 driver.implicitly_wait(10)의 경우, 페이지가 2초만에 로딩된다면, 10초를 기다리지않고 바로 다음 코드로 넘어갑니다. 즉, 8초를 세이브하는 동작입니다.

from selenium import webdriver

driver = webdriver.Chrome()
driver.implicitly_wait(10) # seconds
driver.get("https://gogoing.co.kr")
myDynamicElement = driver.find_element_by_class_name("name")
반응형