Selenium사용중 비동기 처리를 한 사이트에서 크롤링할때 자주 발생하는 오류인
StaleElementReferenceException에 대해 알아보자.
우선 오류가 난 코드를 확인해보자.
List<WebElement> board_list = wait.until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.cssSelector("div.w-full > ul > li > div.postContent.py-0.font-KoPubWorldDotum")));
for (WebElement webElement : board_list) {
webElement.click();
driver.navigate().back();
}
위 코드를 실행하면 StaleElementReferenceException 오류가 발생하는데 이유는
driver.navigate().back() 코드가 실행되면서 페이지가 다시 로드되어 발생한다.
페이지가 뒤로 이동하면 원래 있던 페이지에서 찾은 요소가 유효하지 않게 된다.
이에 Selenium에서는 무효한 요소를 참조하려고 하여 발생한다.
해당 오류를 피하는 방법은 두가지 정도 있다.
1. for문이 돌때 요소를 다시 찾는다.
for (int i = 0; i < board_list.size(); i++) {
List<WebElement> board_list = driver.findElements(By.cssSelector("div.w-full > ul > li > div.postContent.py-0.font-KoPubWorldDotum"));
board_list.get(i).click();
driver.navigate().back();
}
2. try catch 문으로 감싸서 예외가 발생하면 요소를 찾는다.
for (int i = 0; i < board_list.size(); i++) {
try {
WebElement webElement = board_list.get(i);
webElement.click();
} catch (StaleElementReferenceException e) {
board_list = driver.findElements(By.cssSelector("div.w-full > ul > li > div.postContent.py-0.font-KoPubWorldDotum"));
WebElement webElement = board_list.get(i);
webElement.click();
}
}
728x90
'오류 수집' 카테고리의 다른 글
(Spring) factory.UnsatisfiedDependencyException DI(의존성) 모호 에러 (0) | 2024.10.04 |
---|---|
NoSuchBeanDefinitionException 오류 (0) | 2024.10.01 |
JDBC Driver Error (0) | 2024.08.13 |
HTML_JSP_500 ERROR_NullPointerException (0) | 2024.08.06 |
port 중복으로 인한 Apache Tomcat 오류 (0) | 2024.08.06 |