본문 바로가기
코딩/Python

[Python] Selenium 오류 메시지 해결, no such element: unable to locate element (HTML 내 F

by Say_Young 2022. 9. 21.

1. 문제 발생

- 여행 도중, 셔틀버스 예약을 해야 했는데 가려고 한 날짜에 표가 모두 매진이었다. 그러나 가끔 취소표가 나오고 있었다.
- 취소표 확인을 위해 계속 웹사이트를 새로고침하고 있을 수는 없는 일이어서, 1분 간격으로 조회하여 텔레그램 봇을 통해 메시지를 보내주는 자동화 코드를 작성하기로 하였다.
- 이를 위해서는, 페이지 접속 후 캘린더에서 9/24일을 클릭하여 각 시간대별로 남은 자리가 있는지를 확인해야 한다.

- 그런데 목표로 한 날짜인 9/24를 클릭하려고 하는 도중 다음과 같은 에러가 발생하였다.

Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id='ctl00_leftNav_calAvailability']/tbody/tr[6]/td[7]/a"}

- 오류메시지의 내용은 설정한 xpath를 통해 element를 찾을 수 없다는 것이었다.

2. 문제의 원인


HTML 문서 안에 iframe 태그가 포함되어 있는 것이 문제의 원인이었다. iframe은 inline frame을 의미하는데, HTML 페이지의 특정 영역에 액자처럼 별개의 HTML 문서를 불러올 수 있다. 내가 셀레니움을 통해 클릭해야 하는 날짜는 iframe을 통해 로드된 제2의 HTML 문서에서 찾아야 하는데, 일반적인 find_element_by_xpath로는 제2의 HTML 문서 안까지 스크래핑이 되지 않았다.

3. 해결코드

browser.switch_to.frame() 코드를 실행하여 iframe 태그로 불러온 제2의 HTML 문서로 접근할 수 있었다.

from selenium import webdriverons
from selenium.webdriver.common.by import By

#fixed values
url = '목표로_하는_url'
date_set_xpath = '날짜_클릭_xpath'

#scrapping
browser = webdriver.Chrome(service=Service(ChromeDriverManager().install()),options=options)
browser.get(url)
iframe = browser.find_element(By.XPATH,"//iframe[@id='iframeAdventureOffice']")
browser.switch_to.frame(iframe)
elem_date = browser.find_element(By.XPATH, date_set_xpath)
elem_date.send_keys(Keys.ENTER)

댓글