파이썬, 셀레니움을 활용 크롤링을 하다 보면 간간히 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 에러는 완벽히 해결됩니다.
'자동포스팅' 카테고리의 다른 글
워드프레스 REST API 를 활용하여 자동포스팅하는 방법 (0) | 2023.06.02 |
---|---|
openai 를 활용하여 포스팅하기 첫번째! (0) | 2023.06.02 |
잘 되던 쥬피터노트북이 안될 때 해결방법 (0) | 2023.03.28 |
자동포스팅을 위한 파이썬-PANDAS 사용 데이터 저장방법 (6) | 2022.11.08 |
python "can only concatenate str (not "TypeError") to str" 해결방법 (0) | 2022.04.07 |
pyautogui 맥(mac)에서 이미지를 못 찾을 때 (locateCenterOnScreen)해결 방법 (2) | 2022.03.29 |
pyautogui "name 'Image' is not defined" 에러 발생 시 해결법 (0) | 2022.03.28 |
셀레니움 브라우저 창 크기 설정 및 위지 조정하는 법 (0) | 2022.03.28 |
댓글