Да, если у вас возникают проблемы с исключениями StaleElementReferenceException, это потому, что ваши тесты плохо написаны.Это состояние гонки.Рассмотрим следующий сценарий:
WebElement element = driver.findElement(By.id("foo"));
// DOM changes - page is refreshed, or element is removed and re-added
element.click();
Теперь в точке, где вы щелкаете элемент, ссылка на элемент больше не действительна.Для WebDriver практически невозможно сделать правильное предположение обо всех случаях, когда это может произойти - поэтому он поднимает руки и дает вам контроль, кто как автор теста / приложения должен точно знать, что может или не может произойти.Что вы хотите сделать, так это явно подождать, пока DOM не окажется в состоянии, когда вы знаете, что все не изменится.Например, использование WebDriverWait для ожидания существования определенного элемента:
// times out after 5 seconds
WebDriverWait wait = new WebDriverWait(driver, 5);
// while the following loop runs, the DOM changes -
// page is refreshed, or element is removed and re-added
wait.until(presenceOfElementLocated(By.id("container-element")));
// now we're good - let's click the element
driver.findElement(By.id("foo")).click();
МетодsenceOfElementLocated () будет выглядеть примерно так:
private static Function<WebDriver,WebElement> presenceOfElementLocated(final By locator) {
return new Function<WebDriver, WebElement>() {
@Override
public WebElement apply(WebDriver driver) {
return driver.findElement(locator);
}
};
}
Вы совершенно правытекущий драйвер Chrome довольно нестабилен, и вы будете рады услышать, что магистраль Selenium имеет переписанный драйвер Chrome, где большая часть реализации была сделана разработчиками Chromium как часть их дерева.
PS,В качестве альтернативы, вместо явного ожидания, как в примере выше, вы можете включить неявное ожидание - таким образом WebDriver всегда будет зацикливаться до указанного времени ожидания ожидания появления элемента:
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS)
По моему опытуЯвное ожидание всегда более надежно.