2017-05-15 57 views
-1

當使用Selenium和Java時,我經常遇到關於陳舊的元素引用的錯誤。我正在測試的應用程序使用AngularJS 2.0。有時候明確的等待會解決問題,但大多數情況下不會。我可以在我的測試中忽略這些錯誤嗎?我如何實現這個?使用Selenium和Java忽略陳舊的元素引用

+1

請閱讀[問]和[預計會有多少研究工作?](https://meta.stackoverflow.com/questions/261592/how-much-research-effort-is-expected-of-stack-overflow -users)請提供您已經嘗試過的代碼和執行結果,包括任何錯誤消息等。還提供一個指向頁面和/或相關HTML的鏈接。 – JeffC

+0

感謝您的評論,但不幸的是我的問題沒有解決一段代碼。正如你將通過研究這個話題所發現的那樣,它很模糊,記錄不完整。從我在AngularJS頁面上使用Java的陳舊元素的研究來看,你會得到很多答案,但不幸的是,其中大多數都很糟糕。我的問題再次與一段代碼無關,而是一段話題。 –

+0

當然是代碼。您正在嘗試編寫代碼來自動化您的應用程序,並避免過時的元素異常等。您提到顯式等待,但是您沒有提供您嘗試過的代碼,也沒有提供我的評論所針對的特定結果(包括錯誤消息)。 – JeffC

回答

0

阿夫拉姆,

由於應用程序採用了棱角分明的JS,所以這是我們將獲得陳舊元素引用異常在某些情況下,理性的應用程序將加載每次。即使我在使用Angular JS的應用程序自動化時遇到同樣的問題。量角器工具是此類應用的最佳工具,因爲量角器內置等待,因此我們不需要故意等待。解決這個問題的唯一方法是,地點線程每次都會發現異常。在流利的等待代碼中保持忽略Stale元素引用類。

new FluentWait<WebDriver>(driver) 
        .withTimeout(Time, TimeUnit.SECONDS) 
        .pollingEvery(
          Time, 
          TimeUnit.SECONDS) 
        .ignoring(NoSuchElementException.class) 
        .ignoring(StaleElementReferenceException.class) 
        .until(new ExpectedCondition<WebElement>() { 
        public WebElement apply(WebDriver driver) { 
         return driver.findElement(locator); 
1

Angular porting與JAVA可能更適合您的情況。忽略頁面狀態和AJAX就緒事件並不是一個穩定的解決方案。你甚至可以通過JavascriptExecutor interfrace自己實現角度特定的等待。它允許你在代碼中注入自定義JS,所以操縱瀏覽器。使用這樣的:

long start = System.currentTimeMillis(); 
    ((JavascriptExecutor) driver).executeScript(
     "// your JS code here"); 

我用those slides時,我不得不這樣做在Python,但JS代碼保持不變。我們對這個解決方案非常滿意。

1

自動化單頁面應用程序(SPA)是一個新的挑戰,它將推動Selenium WebDriver和相關框架的進一步改進。

在這種情況下,我從SerenityBDD借用的方法waitForAngularRequestsToFinish()

 
    public void waitForAngularRequestsToFinish() { 
     if ((boolean) getJavascriptExecutorFacade().executeScript("return (typeof angular !== 'undefined')? true : false;")) { 
       getJavascriptExecutorFacade().executeAsyncScript("var callback = arguments[arguments.length - 1];" + "angular.element(document.body).injector().get('$browser').notifyWhenNoOutstandingRequests(callback);"); 
     } 
    } 

什麼它使用JavascriptExecutor執行其通知或僅當存在正在處理沒有未決角請求返回異步腳本基本上一樣。

相關問題