조금씩 꾸준히 완성을 향해

[Python] selenium click 에러 (ElementClickInterceptedException) 본문

Python/Web Scraping

[Python] selenium click 에러 (ElementClickInterceptedException)

all_sound 2022. 9. 14. 22:38

한국관광공사 홈페이지에서 여행정보를 가져오는 와중에 예기치 못한 에러를 마주했다. 

selenium 사용 중에 click() 함수가 작동을 하지 않는 것이었다. 

 

 

 

원래 이렇게 사이트에 봄여행을 검색해서 특정 페이지까지 텍스트 정보를 긁어오는 게 목적이었다.

 

여기 보이는 이 버튼을 클릭해서 이동하는 코드를 짜고 있는데, 

 

driver.find_element_by_xpath(f'//*[@class="page_box"]/*[@id={i}]').click()

이 코드에서 자꾸 에러가 떴다. ElementClickInterceptedException 이라고 한다.

 

 

분명 id 값을 제대로 가져온 게 맞고, 다른 버튼들은 또 잘 작동하니 어리둥절....

 

 


 

구글링 해서 결국 해결책을 알아냈다. 

 

element가 HTML 상에는 존재하지만 선언되지 않았거나 상호작용에 실패할 경우 저런 에러가 뜬다는 것이었다. 

driver.find_element_by_xpath(f'//*[@class="page_box"]/*[@id={i}]').click() #error
driver.find_element_by_xpath(f'//*[@class="page_box"]/*[@id={i}]').send_keys(Keys.ENTER) #OK

element를 직접적으로 클릭을 하는 대신에 send_keys() 에 ENTER를 보내주니 잘 작동이 되었다. 

 

아래 코드를 쓰기 위해서는 

from selenium.webdriver.common.keys import Keys

요렇게 import를 해주어야 한다. 

 

 

우여곡절 끝에 무사히 완성한 코드를 공유한다.

from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

driver = webdriver.Chrome()
url = "https://korean.visitkorea.or.kr/search/search_list.do?keyword=%EB%B4%84%EC%97%AC%ED%96%89"
driver.get(url)
time.sleep(3)

cnt = 0 #총 게시물 수
page_num = 6 #긁어 올 페이지수
for i in range(1, page_num+1): #페이지를 돌면서 제목, 지역, 해시태그 긁어오기
    driver.find_element_by_xpath(f'//*[@class="page_box"]/*[@id={i}]').send_keys(Keys.ENTER) #페이지 이동버튼 클릭
    time.sleep(3)
    soup = BeautifulSoup(driver.page_source, 'html.parser') #현재 위치한 페이지 정보를 soup 객체에 저장
    titles = soup.select('div[class="tit"] > a')
    locations = soup.select('div[class="service"]>p')
    hashtags = soup.select('p[class="tag_type"]')
    print(f'페이지 번호: {i}') #페이지 번호 출력
    for t, l, h in zip(titles, locations, hashtags):        
        print('제목:', t.get_text())
        print('지역:', l.get_text())
        print('해쉬태그:', h.get_text())
        cnt += 1   
print(f'{page_num}페이지까지 게시글 수: {cnt}')

 

 

결과도 의도한 대로 잘 출력이 된다!! 뿌듯-