выбрасывается StaleElementReferenceException при работе со списками
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.WebDriverWait;
import java.time.Duration;
import java.util.*;
public class NotebookListPage {
private static NotebookListPage instance;
private ChromeDriver chromeDriver;
private WebDriverWait wait;
private Actions actions;
public Dictionary<String, List<PageItem>> onePageCatalog = new Hashtable<>();
private int currentPage = 0;
private NotebookListPage(ChromeDriver chromeDriver) {
this.chromeDriver = chromeDriver;
this.wait = new WebDriverWait(chromeDriver, 22);
wait.pollingEvery(Duration.ofSeconds(4));
wait.ignoring(NoSuchElementException.class);
this.actions = new Actions(chromeDriver);
}
public static synchronized NotebookListPage getInstance(ChromeDriver chromeDriver) {
if (instance == null) {
instance = new NotebookListPage(chromeDriver);
}
return instance;
}
private WebElement getLowPriceField() {
return chromeDriver.findElement(By.xpath("//div[@data-auto='filter-range-glprice']/descendant::span[@data-auto='filter-range-min']/descendant::input[@type='text']"));
}
private WebElement getHighPriceField() {
return chromeDriver.findElement(By.xpath("//div[@data-auto='filter-range-glprice']/descendant::span[@data-auto='filter-range-max']/descendant::input[@type='text']"));
}
private WebElement getLenovoButton() {
return chromeDriver.findElement(By.xpath("//label[@data-auto='filter-list-item-152981']/descendant::span[@class='_1Mp5C']"));
}
private WebElement getHPButton(){
return chromeDriver.findElement(By.xpath("//label[@data-auto='filter-list-item-152722']/descendant::span[@class='_1Mp5C']"));
}
private WebElement getRecommendation() {
return chromeDriver.findElement(By.xpath("//div[@data-grabber = 'SearchRecommendations']"));
}
private List<WebElement> getItems() {
return chromeDriver.findElements(By.xpath("//div[@data-apiary-widget-name = '@light/Organic']"));
}
private List<WebElement> getForward() {
return chromeDriver.findElements(By.xpath("//span[@class='_3e9Bd']"));
}
private WebElement getCurrentPage() {
return chromeDriver.findElement(By.xpath("//div/div[@class='Xe4rX _18sEx _3-NJO']"));
}
public void initFilters(String lowPrice, String highPrice) throws InterruptedException {
getLowPriceField().click();
getLowPriceField().sendKeys(lowPrice);
getHighPriceField().click();
getHighPriceField().sendKeys(highPrice);
getLenovoButton().click();
getHPButton().click();
}
public void Parsing() {
currentPage = currentPage + 1;
onePageCatalog.put(Integer.toString(currentPage), new ArrayList<>());
actions.moveToElement(getRecommendation()).perform();
for (int i = 0; i < getItems().size(); ++i) {
String name = getItems().get(i).findElement(By.xpath("//h3[@data-auto='snippet-title']")).getText();
String stringPrice = getItems().get(i).findElement(By.xpath("//span[@class='_3MgRl']")).getText().replaceAll("[^0-9]", "");
int price = Integer.parseInt(stringPrice);
onePageCatalog.get(Integer.toString(currentPage)).add(new PageItem(name, price));
}
if (!getForward().isEmpty()) {
getForward().get(0).click();
wait.until(d -> Integer.parseInt(getCurrentPage().getText()) != currentPage);
Parsing();
}
}
}
Проблема заключается в том, что при преобразовании элементов списка с веб-элементами в String выбрасывается исключение StaleElementReferenceException. Ошибка возникает в строке:
String stringPrice = getItems().get(i).findElement(By.xpath("//span[@class='_3MgRl']")).getText().replaceAll("[^0-9]", "");
Примечательно, что в этой строке происходит поиск элемента, но несмотря на это, элемент всё равно умудряется "стухнуть". Пожалуйста, объясните, как так получается и что можно сделать, чтобы решить данную проблему?