Python/Debugging

셀레니움 오류 raise NoSuchElementException: Message: no such element: Unable to locate element 원인 및 해결법

jimmy_AI 2023. 9. 25. 00:37
반응형

파이썬의 selenium 모듈로 버튼 클릭이나 텍스트 입력 등 과정을 수행하기 위하여

필요한 객체를 찾는 과정에서 NoSuchElementException 에러가 자주 발생할 수 있습니다.

 

이번 글에서는 해당 오류의 대표 케이스들을 정리해보고 원인 및 해결 방법을

케이스별로 정리해보도록 하겠습니다.

 

셀레니움에서 일반적으로 name이나 id 등 속성으로 element를 찾는 방법은 아래와 같습니다.

from selenium.webdriver.common.by import By

a = driver.find_element(By.NAME, 'name_00') # name 속성 기준 탐색
b = driver.find_element(By.ID, 'id_01') # id 속성 기준 탐색

 

위 형태의 코드를 실행하는 과정에서 NoSuchElementException가 자주 발생 가능한데,

흔한 원인 케이스들을 하나씩 분석해보도록 하겠습니다.

 

 

Case 1: 이름 철자에 오타 or 속성 타입을 착각

먼저, 속성 이름에 오타(0과 o 등 혼동 주의)가 포함되어 있거나,

id 속성을 기준으로 찾아야 하는데, By.NAME 등으로 찾는 경우 등을 의심해볼 수 있습니다.

 

이 경우는 틀린 부분을 정정해주면 쉽게 해결이 가능할 것입니다.

 

 

Case 2: 로딩이 온전하게 되지 않은 페이지에서 시도

다른 링크 주소로 페이지가 넘어가 로드되는 중에 element를 찾는다면

객체 인식에 실패하는 경우가 생길 수 있습니다.

 

이 케이스라면 아래와 같이 객체가 인식 가능할 때 까지 대기를 하는

WebDriverWait 기능을 사용하면 해당 문제를 해결할 수 있습니다.

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

a = WebDriverWait(driver, 10).until(
    EC.visibility_of_element_located((By.NAME, 'name_00')))

 

위 코드는 최대 10초까지 기다리도록 해당 기능을 적용한 예시이며,

페이지의 예상 최대 로딩 시간에 따라 최대 대기 시간은 조정을 해주어 사용해주시면 됩니다.

 

반응형

 

Case 3: iframe 내부에 속한 element를 찾을 때

iframe 내부에 속한 오브젝트라면 find_element 함수 한 번으로 바로 찾는 것이 어렵습니다.

 

이 경우에서는 해당 객체가 속한 iframe 내부로 먼저 들어간 뒤,

다시 fine_element를 시도하는 방식으로 접근해야 합니다.

 

iframe 내부로 들어간 뒤, 객체를 찾는 예시 코드는 아래와 같습니다.

# iframe 내로 들어가기
iframe = driver.find_element(By.NAME, 'iframe_0')
driver.switch_to.frame(iframe)

# iframe 내에서 fine_element 시도
a = driver.find_element(By.NAME, 'name_00')

# iframe 밖으로 다시 나오기
driver.switch_to.default_content()

 

객체를 찾은 뒤에는 iframe 밖의 기존 위치로 돌아와야

다음 객체를 찾을 때, 드라이버가 위치를 혼동하는 것을 방지할 수 있습니다.

 

 

Case 4: element가 visible이 아닐 때

visible 객체가 아닌 경우에는 selenium driver로 접근하는 것이 어려울 수 있습니다.

이 경우라면 By.XPATH 등 속성으로 탐색을 진행해보는 것이 도움이 될 수도 있습니다.