【发布时间】:2018-01-07 20:58:03
【问题描述】:
我正在为基于 Angular 的应用程序创建测试,我需要帮助。
我必须创建一个等待,直到所有待处理的请求都被处理。
基本上在我的场景中,我想标记一个复选框,但它仅在 GET 请求完成时可用,如果我使用简单的Thread.sleep(2000) 一切正常,但我知道这不是解决这个问题的可靠方法。
我尝试了两种方法:
第一:
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:未知错误:无法读取 未定义的属性“元素”(会话信息:chrome=59.0.3071.115)
(驱动信息:chromedriver=2.31.488763 (092de99f48a300323ecf8c2a4e2e7cab51de5ba8),平台=Windows NT 10.0.15063 x86_64)(警告:服务器未提供任何堆栈跟踪信息)命令持续时间或超时:5 毫秒构建信息: 版本:'2.31.0',修订: '1bd294d185a80fa4206dfeab80ba773c04ac33c0',时间:'2013-02-27 13:51:26' 系统信息:os.name:'Windows 10',os.arch:'amd64', os.version: '10.0', java.version: '1.8.0_121' 驱动信息: org.openqa.selenium.chrome.ChromeDriver 功能 [{applicationCacheEnabled=false, 可旋转=false, mobileEmulationEnabled=false,networkConnectionEnabled=false, 铬={铬驱动程序版本=2.31.488763 (092de99f48a300323ecf8c2a4e2e7cab51de5ba8), userDataDir=C:\Users\lpaczek\AppData\Local\Temp\scoped_dir13872_15975}, 需要HeapSnapshot=true,pageLoadStrategy=正常, databaseEnabled=false,handlesAlerts=true,hasTouchScreen=false, 版本=59.0.3071.115,平台=XP,browserConnectionEnabled=false, nativeEvents=true,acceptSslCerts=true,locationContextEnabled=true, webStorageEnabled=true,browserName=chrome,takeScreenshot=true, javascriptEnabled=true, cssSelectorsEnabled=true, setWindowRect=true, 意外警报行为=}]
我也试过了:
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 代码,而且我是新手。
【问题讨论】:
-
我们可以单独处理所有隐式等待,而不是为每个角度调用添加显式等待吗?
标签: javascript java angularjs selenium automated-tests