이슈
셀레니움을 이용해서 웹사이트 스크래핑(밑에서는 크롤링, 크롤러라는 단어를 종종 사용했으나 정확히는 스크래핑을 진행했습니다!)을 진행하고 있던 도중, 특정 element에 대해 클릭이 되지 않는 이슈가 발생했다. selenium.common.exceptions.ElementNotInteractableException 에러인데, 말 그대로 상호작용이 불가능하다는 에러이다.
그래서 스크래핑 중이던 웹사이트의 버튼을 클릭해보니까 너무나 잘 클릭이 된다! 그렇다면 세울 수 있는 가설은 웹사이트 로딩 때문에 해당 버튼이 활성화가 되지 않았다는 점이다. 즉, 웹사이트 로딩이 아직 덜 되었기 때문에 버튼이 클릭이 안되던, 해당 버튼을 찾을 수 없던 뭔가의 문제로 인해 클릭이 되지 않는 것이다.
해결법 1) time 모듈 이용하기
웹사이트 로딩때까지 기다려주면 위의 이슈는 금방 해결이 된다. 따라서 time 모듈을 임포트 해서 click 함수를 실행하기 전에 time.sleep(0.1)을 해보았다. 하지만 여전히 같은 이슈를 마주하게 되었다. 그래서 0.3초 sleep 하게 만드니까 클릭이 되었다! (0.1초만 쉬더라도 cpu는 많이 쉬니까 괜찮지 않을까 생각했는데, 네트워크라 짧았던 것 같다ㅠㅠ)
해결법 2) WebDriverWait 함수 이용하기
그렇다면 매번 개발할 때마다, 얼마나 걸리는지 확인해서 sleep을 해줘야할까? 크롤러가 작동하는 네트워크 상황은 항상 같을까? 만약 1초를 대기했으나, 크롤링하는 웹사이트가 가벼워져서 더 빨리 로딩이 된다면? 반대로 무거워져서 더 오래 걸리게 된다면? 매번 크롤러를 수정할 수 없다. (매번 수정하는 나 자신을 떠올리면 눈물만 난다...) 그렇다고 느긋하게 10분 기다리라고 할수도 없는 노릇이다.
그래서 구글링을 해보니 해결방법이 있었다! 바로 WebDriverWait(공식 홈페이지)함수였다. 밑의 코드처럼 인자로 셀레니움 드라이브와 기다릴 max time을 인자로 받는다. 그리고 until을 이용해서 언제까지 기다릴지 조건을 덧붙일 수 있다. 필자의 경우에는 클릭이 가능해야 했으므로 EC.element_to_be_clickable을 인자로 넣었다.
아래의 코드는 logo라는 class 이름을 가진 element가 클릭 가능할 때까지 최대 10초간 대기후 해당 selenium 객체를 반환한다. 만약 10초가 넘어서도 해당 element가 불러와지지 않는다면 click() 함수를 호출할 때 에러가 발생할 것이므로 혹시 몰라 try 구문을 이용해서 감싸주었다.
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
try:
click_but = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CLASS_NAME, 'logo')))
click_but.click()
except Exception as e:
print("error: ", e)
위처럼 구현하자 제대로 클릭이 되어 스크래핑 작업을 진행할 수 있었다.
그 외에 click하기 전에 해당 element의 존재 여부를 찾거나, By.XPATH를 이용해서 Xpath를 기준으로 클릭 가능한 element를 지정할 수 있다. 보다 자세한 WeDriverWait 함수 및 사용법은 공식 문서(링크)를 참고하길 바란다.
'일상 공부' 카테고리의 다른 글
Virtualbox Ubuntu 설치하기 (feat.모든 오류 총집합) (3) | 2021.12.28 |
---|---|
파이참 가상환경 사용하기(How to use Pycharm venv) (0) | 2021.11.03 |
Git : 깃허브에 프로젝트 업로드(Feat. Github Access Token) (0) | 2021.10.15 |
[TroubleShooting] Git: (Un)Merge Conflict (0) | 2021.10.06 |
Virtual Box 가상 하드 디스크 용량 조절 (4) | 2020.07.24 |