<Selenium 에러>
셀레니움을 이용한 크롤링을 진행하는 중에 맞닿뜨린 [StaleElementReference] 관련 에러
크롤러를 만들면서 테스트를 하는 도중에 마주쳤다.
에러 메시지 상으로 파악하자면 아마 웹 페이지 파싱 중에 html 요소가 부실한 상태인데 참조하려고 해서 에러를 띄운다!! 라는 의미인 것으로 보인다.
내가 마주친 구체적인 에러 메시지는 아래와 같다. (에러 메시지 캡처를 못한...)
StaleElementReferenceException: Message: stale element reference: element is not attached to the page document
파싱한 웹 페이지에 내가 수집하려고 하는 요소가 불러와지기 전에 수집을 하려고 해서 그런 것 같아서 웹 페이지를 우선 파싱 시도할 때 시간 간격을 두고자 했다. (불러오는 시간을 넉넉히 주면 에러 발생이 없어질 듯!!)
1) driver.implicitly_wait() 사용
: 셀레니움에서 흔히 쓰이는 webdriver 자체에 대기 시간을 주는 셀레니움에 내장된 메서드를 사용했다.
: 2초 ~ 5초까지 여유있게 주었으나 제대로 작동이 안하는 탓인지 여전히 동일한 오류를 내뱉었다. 다음!!
2) WebDriverWait() 사용
: WebDriverWait() 메서드도 셀레니움 내장된 메서드인데 무작정 기다리는게 아니라 조건을 부여해서 조건이 충족될 때까지만 대기시간을 줄 수 있다.
from selenium.webdriver.support.ui import WebDriverWait
# html 태그 중 class명이 "image_typeAll"인 elements가 다 파싱될 때까지 기다리기
WebDriverWait(
chrome, # 웹드라이버
5, # 최대 대기시간(초)
poll_frequency=0.5, # 대기시간 동안 파싱 다 됐는지 확인할 시간 간격(초)
ignored_exceptions=None
).until(EC.presence_of_all_elements_located((By.CLASS_NAME, "image_typeAll")))
: .until() 문을 사용해서 조건을 추가할 수 있다.
: 셀레니움 내장이 세트로 이상한지 이 방법도 통하지 않았다... 동일한 오류.. 마지막 방법으로 패스!!
3) time.sleep() 사용
: time.sleep()을 이용해서 아예 강제로 대기시간을 줘버렸다.
import time
# ...중략
# 대기시간 필요한 부분에 sleep 부여하기
time.sleep(2)
: 셀레니움 내장이 아니라 그런가?? 대기시간을 잘 지켜주는 모습을 셀레니움이 보여줬고 다행히도 해당 에러를 잘 처리할 수 있었다!!
: 해결 성공~
<결론>
무적의 time.sleep(초)을 이용한다면 기다려달라는 그 어떤 오류 메시지도 없앨 수 있는 것!!
'Python > Error' 카테고리의 다른 글
[youtube_dl] unable to download video data 에러 관련 (0) | 2021.06.19 |
---|