SORU
18 NİSAN 2011, PAZARTESİ


Rastgele "Öğesi artık DOM" bağlı; StaleElementReferenceException

Ben umuyorum, ama Selenyum Webdriver tam bir kabus gibi görünüyor. Chrome webdriver şu anda kullanılamaz durumda, ve diğer sürücüler görünüyor ki oldukça güvenilmez ya. Birçok sorunla mücadele ediyorum, ama burada biridir.

Rastgele, benim testler başarısız olur

"org.openqa.selenium.StaleElementReferenceException: Element is no longer attached 
to the DOM    
System info: os.name: 'Windows 7', os.arch: 'amd64',
 os.version: '6.1', java.version: '1.6.0_23'"

Webdriver sürüm 2 kullanıyorum.0b3. Bu FF ve IE sürücüleri ile gördüm. Bunu önlemek için tek çare özel durum oluşmadan önce Thread.sleep gerçek bir çağrı ekleyin. Birisi bu işi düzeltecek olan benim bir hataya işaret edebilir umuyorum zayıf bir geçici çözüm.

CEVAP
18 NİSAN 2011, PAZARTESİ


Eğer StaleElementReferenceExceptions ile ilgili sorunlar yaşıyorsanız Evet, testleriniz kötü yazılmış olduğu için. Bir yarış durumu. 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();

Öğe tıklayarak olduğun noktada artık, eleman başvuru artık geçerli değil. Yakın bir zaman imkansız WebDriver yapmak iyi bir tahmin ile ilgili tüm durumlarda bu olabileceğini - yani Yukarı atar onun eline verir ve kontrol etmek, kim (test/uygulama yazar lazım tam olarak ne olabilir ya da olmayabilir. Ne yapmak istediğini DOM şey değişmeyecek biliyorsun, bir halde bekleyin açıkça. Örneğin, bir WebDriverWait var belirli bir öğe için beklemek:

// 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öntem bu gibi bir şey olacaktır:

private static Function<WebDriver,WebElement> presenceOfElementLocated(final By locator) {
    return new Function<WebDriver, WebElement>() {
        @Override
        public WebElement apply(WebDriver driver) {
            return driver.findElement(locator);
        }
    };
}

Kesinlikle haklısın hakkındaki güncel Chrome sürücüsü olmak oldukça kararsız ve mutlu olacaksın bunu duyduğuma Selenyum gövde vardır bir yeniden Krom sürücüsü, nerede en çok uygulaması yapılan Krom geliştiriciler bir parçası olarak onların ağaç.

PS. Alternatif olarak, açıkça örnekte olduğu gibi yukarıdaki beklemek yerine, örtülü bekler - bu şekilde WebDriver her zaman belirtilen zaman aşımı öğe var olmak için bekleyen kadar döngü etkinleştirebilirsiniz:

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS)

Benim tecrübeme rağmen, açıkça bekleyen her zaman daha güvenilir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • listedabive

    listedabive

    30 Ocak 2007
  • MandMEvangelists

    MandMEvangel

    28 Ocak 2008
  • Stanislav Petrov

    Stanislav Pe

    7 ŞUBAT 2009