본문 바로가기

개인 공부

9/14 수_webdriver_manager, StaleElementReferenceException

728x90

1. webdriver_manager

크롬 vs. 크롬 드라이버 버전 맞춰서 돌리더라도 아래처럼 DeprecationWarning 경고가 뜬다면!!

"DeprecationWarning: executable_path has been deprecated, please pass in a Service object"

이는 셀리니움이 4 버전대로 업데이트되면서,
"왜 더 이상 사용하지 않는 방법으로 실행 경로를 지정하는 건데? Service 객체를 사용하라고, 이 자식!"이라 욕하는 것이다..

pip install webdriver_manager로 모듈을 다운로드하고, 기존에 쓰시던 코드를 조금 수정해주면~~ 
크롬이 업그레이드될 때마다 맞는 버전의 크롬 드라이버 또한 자동으로 업그레이드되기 때문에, 
드라이버를 찾아서.. 다운로드하고.. 경로 지정..(헉헉)을 해줄 필요가 없다!! 🤓

출처

728x90

 

2. StaleElementReferenceException

인스타그램 크롤링을 할 때 버튼 엘리먼트를 XPATH 혹은 Class Name으로 찾았었는데,

로그에 오류가 뜨는 걸 보니 해당 경로의 아주 일부가 조금 바뀌어서 찾지 못한다.. 가만히 있으라고, 인별!! >:(

 

그래서 아주 직관적으로 Tag Name의 인덱스로 찾는 것으로 코드를 바꿨는데,

지정해서 찾는 것보다 시간이 오래 걸리는지 타임 아웃이 되면서 아래 에러 메시지와 함께 크롬 창이 꺼져 버린다!!

"selenium.common.exceptions.StaleElementReferenceException"

 

검색.. 검색.. 검색해보니

DOM에 해당 Element가 존재하지 않거나, 페이지가 완전히 로딩되기 전에 참조하거나, 다른 Webdriver의 Element를 참조할 때 발생하는 에러라고 한다. 따라서 상당 경우 해당 소스가 뜰 때까지 충분한 시간을 주면 문제는 해결할 수 있다는데~

 

기존에는 time.sleep으로 페이지마다 3초씩 일시정지를 주었는데, 이참에 얼핏 보았던 WebDriverWait를 사용해보려 한다.

# 1안
time.sleep(sec)

# 2안
driver.implicitly+wait(sec)

# 3안
WebDriverWait(driver, sec).untill(EC.presence_of_located((by.ID, ID)))

 해보자고!!

해봤더니,

기존에 time.sleep으로 짰던 코드는,

CPU times: user 573 ms, sys: 89.6 ms, total: 662 ms
Wall time: 1min 2s

 

새로 짠 코드는,

CPU times: user 344 ms, sys: 0 ns, total: 344 ms
Wall time: 32.8 s

압도적으로 빠르다!!!!!

 

출처

728x90