Python/Selenium

Selenium ElementStaleException 해결하기

PySun 2025. 2. 14. 08:14
반응형

소개

Selenium을 사용하여 웹 자동화를 진행하다 보면 'ElementStaleException'이라는 에러를 자주 만날 수 있습니다. 이 오류는 참조하고 있는 웹 요소가 더 이상 유효하지 않을 때 발생합니다. 즉, 해당 요소가 DOM에서 제거되거나 변경된 경우 발생합니다. 이번 포스트에서는 이 에러에 대한 원인과 해결 방법을 살펴보겠습니다.

에러 발생 예시 코드

아래는 'ElementStaleException'이 발생할 수 있는 간단한 예시 코드입니다. 웹 페이지에서 버튼을 클릭한 후 그 버튼을 다시 클릭하려고 할 때 이 에러를 만나게 될 수 있습니다.

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

# 웹 드라이버 초기화
driver = webdriver.Chrome()

# 특정 페이지 열기
driver.get('https://example.com')

# 버튼 클릭
button = driver.find_element(By.ID, 'myButton')
button.click()

# 버튼을 다시 클릭하려고 시도
time.sleep(2)  # 버튼 클릭 후 약간의 대기
button.click()  # ElementStaleException 발생 가능

에러 해결 방법

1. 새로 요소를 찾기

주로 'ElementStaleException'이 발생하는 경우, 참조하고 있는 웹 요소가 더 이상 유효하지 않으므로 다시 요소를 찾아야 합니다. 다음 코드는 버튼을 클릭하기 전에 처음부터 요소를 찾아줍니다.

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

# 웹 드라이버 초기화
driver = webdriver.Chrome()

# 특정 페이지 열기
driver.get('https://example.com')

# 버튼 클릭
button = driver.find_element(By.ID, 'myButton')
button.click()

# 버튼을 클릭하려 하기 전에 다시 찾기
time.sleep(2)  # 버튼 클릭 후 약간의 대기
button = driver.find_element(By.ID, 'myButton')  # 다시 찾기
button.click()  # 이제 클릭 가능

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('https://example.com')

# 버튼 클릭
button = driver.find_element(By.ID, 'myButton')
button.click()

# 특정 요소가 안정될 때까지 기다림
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, 'myButton')))
button.click()  # 안정된 요소를 클릭

마무리

이번 포스트에서는 Selenium에서 발생할 수 있는 'ElementStaleException'의 원인과 이를 해결하기 위한 방법들을 살펴보았습니다. 올바른 방법으로 요소를 다시 찾거나, WebDriverWait를 사용하여 안정성을 높이는 것이 중요합니다. Selenium을 사용할 때는 이러한 다양한 상황을 고려하여 항상 유연하게 대처하는 것이 필요합니다.

반응형