본문 바로가기

Python/Error

[Selenium] StaleElementReferenceException 에러 관련

<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