반응형
StaleElementReferenceException은 요소가 더 이상 DOM에 존재하지 않거나 업데이트된 경우에 발생하는 오류입니다. 웹 페이지가 변경되거나 요소가 업데이트될 때 발생할 수 있습니다. 예시 코드와 해결 방법에 대해 설명하겠습니다.
예시 코드:
아래 예시 코드는 페이지를 새로고침하고 나서 기존에 찾았던 요소를 사용하려고 할 때 StaleElementReferenceException이 발생할 수 있습니다.
from selenium import webdriver
driver = webdriver.Chrome('path/to/chromedriver')
# Google 검색 페이지 접속
driver.get('https://www.google.com')
# 검색어 입력
search_box = driver.find_element_by_name('q')
search_box.send_keys('파이썬')
search_box.submit()
# 검색 결과에서 첫 번째 링크 클릭
first_result = driver.find_element_by_css_selector('.rc .r a')
first_result.click()
# 페이지 새로고침
driver.refresh()
# 첫 번째 결과 다시 클릭
try:
first_result.click()
except StaleElementReferenceException as e:
print("요소가 업데이트되어 다시 찾아야 합니다.")
finally:
# 브라우저 종료
driver.quit()
해결 방법:
StaleElementReferenceException이 발생할 때, 다음과 같은 방법으로 해결할 수 있습니다.
요소 다시 찾기:
페이지가 새로고침되거나 업데이트된 경우, 이전에 찾은 요소는 더 이상 사용할 수 없습니다. 따라서 새롭게 요소를 찾아야 합니다.
from selenium import webdriver
driver = webdriver.Chrome('path/to/chromedriver')
# Google 검색 페이지 접속
driver.get('https://www.google.com')
# 검색어 입력
search_box = driver.find_element_by_name('q')
search_box.send_keys('파이썬')
search_box.submit()
# 검색 결과에서 첫 번째 링크 클릭
first_result = driver.find_element_by_css_selector('.rc .r a')
first_result.click()
# 페이지 새로고침
driver.refresh()
# 첫 번째 결과 다시 찾아서 클릭
try:
first_result = driver.find_element_by_css_selector('.rc .r a')
first_result.click()
except StaleElementReferenceException as e:
print("요소가 업데이트되어 다시 찾아야 합니다.")
finally:
# 브라우저 종료
driver.quit()
[Python/Selenium] - Selenium 선택자 사용
implicitly_wait() 메서드 사용:
implicitly_wait() 메서드를 사용하여 요소가 업데이트될 때까지 일정 시간만큼 기다릴 수 있도록 설정할 수 있습니다.
from selenium import webdriver
driver = webdriver.Chrome('path/to/chromedriver')
# implicitly_wait() 메서드로 기다리는 시간 설정
driver.implicitly_wait(10)
# Google 검색 페이지 접속
driver.get('https://www.google.com')
# 검색어 입력
search_box = driver.find_element_by_name('q')
search_box.send_keys('파이썬')
search_box.submit()
# 검색 결과에서 첫 번째 링크 클릭
first_result = driver.find_element_by_css_selector('.rc .r a')
first_result.click()
# 페이지 새로고침
driver.refresh()
# 첫 번째 결과 다시 클릭
try:
first_result.click()
except StaleElementReferenceException as e:
print("요소가 업데이트되어 다시 찾아야 합니다.")
finally:
# 브라우저 종료
driver.quit()
[Python/Selenium] - Selenium 웹 페이지 대기
페이지 다시 로드하기:
페이지를 새로고침하거나 업데이트된 경우, 페이지를 다시 로드하여 새로운 DOM을 가져와서 요소를 다시 찾을 수 있습니다.
from selenium import webdriver
driver = webdriver.Chrome('path/to/chromedriver')
# Google 검색 페이지 접속
driver.get('https://www.google.com')
# 검색어 입력
search_box = driver.find_element_by_name('q')
search_box.send_keys('파이썬')
search_box.submit()
# 검색 결과에서 첫 번째 링크 클릭
first_result = driver.find_element_by_css_selector('.rc .r a')
first_result.click()
# 페이지 새로고침
driver.refresh()
# 페이지 다시 로드
driver.get(driver.current_url)
# 첫 번째 결과 다시 클릭
try:
first_result.click()
except StaleElementReferenceException as e:
print("요소가 업데이트되어 다시 찾아야 합니다.")
finally:
# 브라우저 종료
driver.quit()
StaleElementReferenceException이 발생하는 경우 위의 방법 중 하나를 적절히 선택하여 예외를 처리하고, 프로그램이 안정적으로 동작하도록 합니다. 요소의 상태가 변경될 수 있는 경우, 요소를 다시 찾아서 사용하거나 페이지를 다시 로드하여 업데이트된 DOM을 가져와야 합니다.
반응형
'Python > Selenium' 카테고리의 다른 글
파이썬 Selenium ElementClickInterceptedException 오류 (0) | 2023.08.14 |
---|---|
파이썬 Selenium ElementNotInteractableException 오류 (0) | 2023.08.13 |
파이썬 Selenium TimeoutException (0) | 2023.08.11 |
파이썬 Selenium NoSuchElementException (0) | 2023.08.10 |
Selenium Google 기사 스크래핑 (0) | 2023.08.09 |