반응형
소개
Selenium을 사용해 웹 자동화를 수행하다 보면 'StaleElementReferenceException'이라는 오류에 종종 마주치게 됩니다. 이 오류는 주로 웹 페이지의 DOM이 업데이트되어 이전에 가지고 있던 웹 요소가 더 이상 유효하지 않게 되었을 때 발생합니다. 오늘은 이 오류의 원인과 해결 방법에 대해 자세히 알아보도록 하겠습니다.
에러 발생 예시 코드
먼저, 'StaleElementReferenceException' 오류를 발생시킬 수 있는 간단한 예시 코드를 살펴보겠습니다.
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
# 웹 드라이버 초기화
driver = webdriver.Chrome()
# 웹 페이지 열기
driver.get('http://example.com')
# 특정 요소 찾기
element = driver.find_element(By.TAG_NAME, 'h1')
# 페이지를 새로고침
driver.refresh()
# 이전에 찾은 요소에 접근
print(element.text) # 이 부분에서 오류가 발생합니다.
에러 해결 방법
1. 요소 다시 찾기
가장 간단한 해결책은 필요할 때마다 요소를 다시 찾는 것입니다. 웹 페이지의 DOM이 변경될 때마다 해당 요소를 새롭게 가져오는 방법을 사용해보세요.
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
driver = webdriver.Chrome()
driver.get('http://example.com')
# 특정 요소 찾기
element = driver.find_element(By.TAG_NAME, 'h1')
# 페이지를 새로고침
driver.refresh()
# 요소 다시 찾기
element = driver.find_element(By.TAG_NAME, 'h1')
print(element.text)
2. WebDriverWait 사용하기
또한, WebDriverWait을 사용하여 원하는 요소가 웹 페이지에 나타날 때까지 대기하는 방법도 좋은 대안입니다. 이 방식은 DOM이 완전히 로드된 후 작업을 수행할 수 있도록 해줍니다.
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get('http://example.com')
# 특정 요소 찾기
element = driver.find_element(By.TAG_NAME, 'h1')
# 페이지를 새로고침
driver.refresh()
# 요소가 다시 로드되기를 대기
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.TAG_NAME, 'h1'))
)
print(element.text)
마무리
이 블로그 글에서는 Selenium에서 발생하는 'StaleElementReferenceException' 오류에 대해 알아보았습니다. 페이지가 새로고침되거나 DOM이 변경될 때 이전에 참조하던 요소가 더 이상 존재하지 않게 되는 이 문제는 요소를 다시 찾아 주거나, WebDriverWait을 사용하여 DOM의 완전한 로드를 기다림으로써 해결할 수 있습니다. 웹 자동화를 할 때 이러한 오류를 염두에 두고 적절한 방법을 선택하여 효율적인 코드를 작성하시길 바랍니다.
반응형
'Python > Selenium' 카테고리의 다른 글
selenium.set_script_timeout으로 스크립트 타임아웃 설정하기 (0) | 2025.02.21 |
---|---|
selenium TimeoutException: message 오류 해결하기 (0) | 2025.02.20 |
selenium SessionNotCreatedException: Message 오류 해결하기 (0) | 2025.02.20 |
selenium.set_page_load_timeout으로 페이지 로드 타임아웃 설정하기 (0) | 2025.02.20 |
selenium.select로 드롭다운 목록에서 값 선택하기 (0) | 2025.02.20 |