Да, если у вас есть проблемы с StaleElementReferenceExceptions, это потому, что ваши тесты плохо написаны. Это состояние гонки. Рассмотрим следующий сценарий:
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)
Однако, по моему опыту, явное ожидание всегда более надежно.