2017-02-08 91 views
1

我創建了以下方法:等待元素變爲陳舊,爲什麼'ExpectedConditions.stalenessOf'不起作用?

public void waitAndClickElement(WebElement element) throws InterruptedException { 
    try { 
     Boolean elementPresent = this.wait.until(ExpectedConditions.elementToBeClickable(element)).isEnabled(); 
     if (elementPresent == true && element.isDisplayed()) { 
      element.click(); 
      System.out.println("Clicked on the element: " + element.getText()); 
     } 
    } catch (StaleElementReferenceException elementUpdated) { 
     Boolean elementPresent = wait.until(ExpectedConditions.stalenessOf(element)); 
     if (elementPresent == true) { 
      WebElement staleElement = element; 
      staleElement.click(); 
      System.out.println("Clicked on the 'Stale' element: " + element.getText()); 
     } 
    } catch (NoSuchElementException e) { 
     System.out.println("Exception! - Could not click on the element: " + element.getText() + ", Exception: "+ e.toString()); 
     throw (e); 
    } finally { 
    } 
} 

,但我仍然似乎得到以下以下異常:

預期條件失敗:DefaultElementLocator「By.xpath:等待元素(代理元素//A [文本()='Exchange現在»‘]’)成爲陳舊(嘗試了20秒與500毫秒的間隔) enter image description here

但相同的方法將上工作假設18個20的建立,任何想法?

感謝您的幫助

+0

而不是你的'catch(StaleElementReferenceException)'塊中的所有邏輯,爲什麼不只是再次調用'waitAndClickElement(element)'?雖然這取決於你如何創建'WebElement',如果你使用緩存查找,它將永遠是陳舊的,但是如果你使用的方法在使用時會發現它,比如'FindBy' ,它會繼續嘗試點擊,直到它不是陳舊的。 – mrfreester

回答

1

您的問題的直接答案是,您正在等待已陳舊的元素變陳舊。我不確定你有什麼意圖。

您的功能過於複雜,不會按照您的想法工作。

如果一個元素是可點擊的,它也被啓用並顯示,所以你不需要檢查全部三個元素。如果元素拋出一個StaleElementReferenceException,它不會變成「不穩定」。

我會建議你用下面的代替你當前的函數。

public void waitAndClickElement(By locator) 
{ 
    try 
    { 
     this.wait.until(ExpectedConditions.elementToBeClickable(locator)).click(); 
    } 
    catch (TimeoutException e) 
    { 
     System.out.println("Count not click element <" + locator.toString() + ">"); 
    } 
} 

通過定位器而不是元素而不是元素本身,這將簡化很多事情。如果該元素存在且可點擊,則會被點擊。如果它不存在或永遠不可點擊,它會拋出一個你可以捕獲的TimeoutException

此外,編寫element.toString()將爲元素編寫一些ID,這些元素不會是人類可讀或有意義的。您最好寫locator.toString(),它將返回定位器的類型,例如By.cssSelector: #hplogo

+0

感謝這麼多再次你的幫助,你認爲我應該添加一個額外的預防措施,並嘗試再次嘗試點擊對象? – Gbru

+0

號我會盡可能多地等待你認爲有必要的一次。等待兩次並沒有完成任何事情。例如,30秒等待一次等於15秒兩次。它只是更有意義,更清晰,並且更少代碼等待30多次。 – JeffC

+0

再次感謝您的幫助,在try和catch塊中使用'Exception e'會更好嗎? – Gbru

1

如果更改另一個driver.get("http://completely.different.site.com/");網站,該元素將是陳舊的(以DOM沒有更多)。陳舊意味着DOM中的元素無法訪問。

+0

感謝,但我大部分的測試執行的通過使用相同的測試它只是一個奇數時會出現此錯誤,例如3構建將失敗了20 – Gbru

+0

陳舊的元素是永遠存在。所以這裏有一些錯誤:'Boolean elementPresent = wait.until(ExpectedConditions.stalenessOf(element));',這取決於你想要做什麼。 –

+0

它只是奇怪,因爲即使元素似乎仍然是陳舊的上市法 – Gbru

相關問題