Sim, se você está tendo problemas com o StaleElementReferenceExceptions, é porque seus testes são mal escritos. É uma condição de corrida. Considere o seguinte cenário:
WebElement element = driver.findElement(By.id("foo"));
// DOM changes - page is refreshed, or element is removed and re-added
element.click();
Agora, no ponto em que você está clicando no elemento, a referência do elemento não é mais válida. É quase impossível para o WebDriver adivinhar todos os casos em que isso pode acontecer - por isso, ele levanta as mãos e dá controle a você, que, como autor do teste / aplicativo, deve saber exatamente o que pode ou não acontecer. O que você deseja fazer é esperar explicitamente até que o DOM esteja em um estado em que você saiba que as coisas não vão mudar. Por exemplo, usando um WebDriverWait para aguardar a existência de um elemento específico:
// 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();
O método presenceOfElementLocated () ficaria assim:
private static Function<WebDriver,WebElement> presenceOfElementLocated(final By locator) {
return new Function<WebDriver, WebElement>() {
@Override
public WebElement apply(WebDriver driver) {
return driver.findElement(locator);
}
};
}
Você está certo sobre o atual driver Chrome ser bastante instável e ficará feliz em saber que o tronco do Selenium possui um driver Chrome reescrito, onde a maior parte da implementação foi feita pelos desenvolvedores do Chromium como parte de sua árvore.
PS. Como alternativa, em vez de esperar explicitamente como no exemplo acima, você pode ativar as esperas implícitas - dessa forma, o WebDriver sempre fará um loop até o tempo limite especificado, aguardando a presença do elemento:
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS)
Na minha experiência, porém, esperar explicitamente é sempre mais confiável.