본문 바로가기
자동포스팅

파이썬 셀레니움 NoSuchElementException 해결 방법

by 마자동 2022. 6. 12.
반응형

파이썬, 셀레니움을 활용 크롤링을 하다 보면 간간히 NoSuchElementException 을 만납니다. 
단순 로딩이 길어 이같은 에러가 발생한다면 로딩 시간을 늘려주면 간단히 해결됩니다만, 그 밖에 팝업창이 뜬다거나 하는 상황에서 발생하는 에러에 대한 해결법을 적어보고자 합니다. 

팝업창이 뜬다는 건 또 다른 프레임이 생성되었다는 것과 같은데요.원룸이었는데 투룸이 된거죠 이와 같은 상황에서 셀레니움은 프레임 변경을 하지 않으면 찾고자 하는 엘리먼트를 찾지 못합니다.

또한 iframe등과 같이 별개의 프레임이 존재하는 웹페이지라면 동일하게 해당 엘리먼트를 찾지 못합니다. 

반응형

NoSuchElementException 해결방법

driver.find_element(By.XPATH, '//*[@id="comN_image1"]').click()
sleep(2)
# 팝업창 프레임 전환
driver.switch_to.frame(driver.find_element(By.ID, 'iframe1'))
sleep(2)
driver.find_element(By.ID, 'P_isinList_0_P_REP_SECN_NM').click()
sleep(2)
# 메인창으로 프레임 전환
driver.switch_to.default_content()
sleep(2)
driver.find_element(By.XPATH, '//*[@id="image2222"]').click()

위 코드는 특정 사이트에서 팝업창이 열리면서 별개의 프레임이 생성된 상황인데요. 생성된 팝업창에서 조회 버튼을 클릭하고자 할때 기본 프레임에서 찾으면 NoSuchElementException 에러가 발생합니다. 한마디로 없단 얘기지요.

프레임 변경이 없다면 아래부분에서 NoSuchElementException 에러가 발생합니다. 

driver.find_element(By.ID, 'P_isinList_0_P_REP_SECN_NM').click()

이때 프레임을 변경해줍니다.

driver.switch_to.frame(driver.find_element(By.ID, 'iframe1'))

생성된 프레임의 ID는 조금씩 다르겠지만 해당 부분에서 찾을 수 있습니다. 

이 정도 정보를 찾는 분이시라면 F12 개발자도구를 모르시는 분은 없으실테고.... 생성된 팝업창 정보를 찾아보시면 <iframe~ 으로 시작되는 부분의 ID값을 넣어주면 해당 프레임으로 이동합니다. 

팝업창에서 액션이 끝나고 기본 프레임으로 자동으로 돌아가지 않습니다. 그래서 기본 프레임(기본 웹페이지)로 돌아가려면 아래의 명령어를 사용하여 이동합니다. 

driver.switch_to.default_content()

어려운 점은 없습니다. 프레임만 잘 변경해주면 NoSuchElementException 에러는 완벽히 해결됩니다. 

반응형

댓글