2017-08-01 200 views
0

我正在爲基於角度的應用程序創建測試,我需要幫助。 我必須創建一個等待,等待所有掛起的請求將被處理。 基本上在我的情況下,我想標記一個複選框,但它僅在GET請求完成時可用,如果我使用簡單的Thread.sleep(2000)一切正常,但我知道這不是可靠的方法來解決這個問題。 我嘗試了兩種方法:Selenium WebDriver - 等待角度請求(Java)

第一:

AdditionalConditions wait = new AdditionalConditions(); 
     wait.untilAngularFinishHttpCalls(); 



public void untilAngularFinishHttpCalls() { 
     final String javaScriptToLoadAngular = 
       "var injector = window.angular.element('app-root').injector();" + 
         "var $http = injector.get('$http');" + 
         "return ($http.pendingRequests.length === 0)"; 

     ExpectedCondition<Boolean> pendingHttpCallsCondition = new ExpectedCondition<Boolean>() { 
      public Boolean apply(WebDriver driver) { 
       return ((JavascriptExecutor) driver).executeScript(javaScriptToLoadAngular).equals(true); 
      } 
     }; 
     WebDriverWait wait = new WebDriverWait(SharedDriver.getDriver(), 20); // timeout = 20 secs 
     wait.until(pendingHttpCallsCondition); 
    } 

在這裏,我得到以下錯誤:

org.openqa.selenium.WebDriverException: unknown error: Cannot read property 'element' of undefined (Session info: chrome=59.0.3071.115)
(Driver info: chromedriver=2.31.488763 (092de99f48a300323ecf8c2a4e2e7cab51de5ba8),platform=Windows NT 10.0.15063 x86_64) (WARNING: The server did not provide any stacktrace information) Command duration or timeout: 5 milliseconds Build info: version: '2.31.0', revision: '1bd294d185a80fa4206dfeab80ba773c04ac33c0', time: '2013-02-27 13:51:26' System info: os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '1.8.0_121' Driver info: org.openqa.selenium.chrome.ChromeDriver Capabilities [{applicationCacheEnabled=false, rotatable=false, mobileEmulationEnabled=false, networkConnectionEnabled=false, chrome={chromedriverVersion=2.31.488763 (092de99f48a300323ecf8c2a4e2e7cab51de5ba8), userDataDir=C:\Users\lpaczek\AppData\Local\Temp\scoped_dir13872_15975}, takesHeapSnapshot=true, pageLoadStrategy=normal, databaseEnabled=false, handlesAlerts=true, hasTouchScreen=false, version=59.0.3071.115, platform=XP, browserConnectionEnabled=false, nativeEvents=true, acceptSslCerts=true, locationContextEnabled=true, webStorageEnabled=true, browserName=chrome, takesScreenshot=true, javascriptEnabled=true, cssSelectorsEnabled=true, setWindowRect=true, unexpectedAlertBehaviour=}]

我試着也:

WebDriverWait wait = new WebDriverWait(SharedDriver.getDriver(), 15, 500); 
     wait.until(AdditionalConditions.angularHasFinishedProcessing()); 


public class AdditionalConditions { 
    public static ExpectedCondition<Boolean> angularHasFinishedProcessing() { 
     return new ExpectedCondition<Boolean>() { 
      @Override 
      public Boolean apply(WebDriver driver) { 
       return Boolean.valueOf(((JavascriptExecutor) 
         driver).executeScript("return (window.angular !== undefined) && (angular.element(document).injector() !== undefined) && (angular.element(document).injector(). get('$http').pendingRequests.length === 0)").toString()); 
      } 
     }; 
    } 

,在這裏我得到超時15秒後,它似乎不起作用。 請儘可能幫助,據我所知我需要執行JavaScript代碼,我是新手。

+0

而不是增加明確的等待每一個角的電話,我們就可以處理所有那些隱單獨等待? –

回答

0

你可以等待的角度來完成它的工作

ngwebDriver包會給你的能力

var driver = new NgWebDriver(driver); 

driver.waitForAngularRequestsToFinish(); 
+0

我已將它添加到我的代碼中,並得到「org.openqa.selenium.ScriptTimeoutException:異步腳本超時:未在15秒內收到結果」 爲什麼?當我手動測試它的請求後約6秒處理 –

+0

這是特定於應用程序...不能告訴從問題 –

相關問題