Evet, StaleElementReferenceExceptions ile ilgili sorun yaşıyorsanız, bunun nedeni testlerinizin kötü yazılmış olmasıdır. Bu bir yarış koşulu. Aşağıdaki senaryoyu düşünün:
WebElement element = driver.findElement(By.id("foo"));
// DOM changes - page is refreshed, or element is removed and re-added
element.click();
Şimdi öğeyi tıkladığınız noktada, öğe referansı artık geçerli değil. WebDriver'ın bunun olabileceği tüm durumlar hakkında iyi bir tahmin yapması imkansızdır - bu yüzden testlerini / uygulama yazarı olarak tam olarak ne olacağını veya olmayacağını kimin bilmesi gerektiğini kontrol eder. Yapmak istediğiniz şey, DOM'nin bir şeylerin değişmeyeceğini bildiğiniz bir duruma gelene kadar açıkça beklemektir. Örneğin, belirli bir öğenin var olmasını beklemek için bir WebDriverWait kullanma:
// 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();
PresenceOfElementLocated () yöntemi şuna benzer:
private static Function<WebDriver,WebElement> presenceOfElementLocated(final By locator) {
return new Function<WebDriver, WebElement>() {
@Override
public WebElement apply(WebDriver driver) {
return driver.findElement(locator);
}
};
}
Mevcut Chrome sürücüsünün oldukça kararsız olduğu konusunda oldukça haklısınız ve Selenium bagajının, uygulamanın çoğunun ağaçlarının bir parçası olarak Chromium geliştiricileri tarafından yapıldığı, yeniden yazılmış bir Chrome sürücüsüne sahip olduğunu duymaktan memnuniyet duyacaksınız.
PS. Alternatif olarak, yukarıdaki örnekte olduğu gibi açıkça beklemek yerine, örtülü beklemeleri etkinleştirebilirsiniz - bu şekilde WebDriver, öğenin mevcut olmasını bekleyen belirtilen zaman aşımına kadar her zaman döngü yapar:
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS)
Deneyimlerime göre, açıkça beklemek her zaman daha güvenilirdir.