Tak, jeśli masz problemy ze StaleElementReferenceExceptions, oznacza to, że twoje testy są źle napisane. To stan wyścigu. Rozważ następujący scenariusz:
WebElement element = driver.findElement(By.id("foo"));
// DOM changes - page is refreshed, or element is removed and re-added
element.click();
Teraz w miejscu, w którym klikasz element, odwołanie do elementu nie jest już prawidłowe. Jest prawie niemożliwe, aby WebDriver mógł dobrze odgadnąć wszystkie przypadki, w których może się to zdarzyć - więc podnosi ręce i daje kontrolę Tobie, który jako autor testu / aplikacji powinien dokładnie wiedzieć, co może się wydarzyć, a co nie. To, co chcesz zrobić, to wyraźnie poczekać, aż DOM znajdzie się w stanie, w którym wiesz, że nic się nie zmieni. Na przykład użycie WebDriverWait, aby poczekać, aż zaistnieje określony element:
// 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();
Metoda presentOfElementLocated () wyglądałaby mniej więcej tak:
private static Function<WebDriver,WebElement> presenceOfElementLocated(final By locator) {
return new Function<WebDriver, WebElement>() {
@Override
public WebElement apply(WebDriver driver) {
return driver.findElement(locator);
}
};
}
Masz rację co do tego, że obecny sterownik Chrome jest dość niestabilny i z przyjemnością usłyszysz, że tułów Selenium ma przepisany sterownik Chrome, w którym większość implementacji została wykonana przez programistów Chromium w ramach ich drzewa.
PS. Alternatywnie, zamiast czekać jawnie, jak w powyższym przykładzie, możesz włączyć niejawne oczekiwanie - w ten sposób WebDriver będzie zawsze zapętlał się do określonego limitu czasu oczekiwania na pojawienie się elementu:
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS)
Jednak z mojego doświadczenia wynika, że jawne czekanie jest zawsze bardziej niezawodne.