Selenium-确定网页是否已在Angular 2+中完成加载 [英] Selenium - Determine whether web page is finished loading in Angular 2+
问题描述
我有一个Selenium测试套件,它针对许多Web应用程序运行Selenium集成测试,其中一些是用Angular 2+编写的,而另一些是用AngularJS编写的.
I have a Selenium test suite that is running Selenium integration tests against a number of web applications, some that are written in Angular 2+, and some that are written in AngularJS.
我们使用带有WebDriverWait
的自定义ExpectedCondition
和WebDriverWait
,用于使测试用例等待AngularJS应用程序完成加载,以避免等待任意时间:
We use a custom ExpectedCondition
with WebDriverWait
that we use to make test cases wait until AngularJS apps have finished loading, in order to avoid waiting an arbitrary amount of time:
private static ExpectedCondition<Boolean> angularIsFinished() {
return new ExpectedCondition<Boolean>() {
public Boolean apply(final WebDriver driver) {
Object result = null;
while(result == null || result.toString().equals("undefined")) {
result = ((JavascriptExecutor)driver).executeScript("return typeof angular;");
try {
Thread.sleep(200L);
} catch (final InterruptedException ex) {
logger.error("Error while trying to sleep", ex);
}
}
final String script = " var el = document.querySelector(\"body\");\n" +
" var callback = arguments[arguments.length - 1];\n" +
" angular.element(el).injector().get('$browser').notifyWhenNoOutstandingRequests(callback);";
((JavascriptExecutor)driver).executeAsyncScript(script);
return true;
}
public String toString() {
return "Wait for AngularJS";
}
};
}
但是,对于Angular 2+应用程序,return typeof angular;
将始终返回undefined
.有没有类似于AngularJS的 notifyWhenNoOutstandingRequests 可用于确定Angular 2+应用何时完成加载?
However, return typeof angular;
will always return undefined
for an Angular 2+ app. Is there a similar way to AngularJS's notifyWhenNoOutstandingRequests that you can use to determine when an Angular 2+ app has finished loading?
此问题提到使用NgZone
作为一种可能的解决方案,但是您如何通过JavascriptExecutor
执行的脚本来处理呢?
This question mentions using NgZone
as a possible solution, but how would you get a handle on that via a script executed via JavascriptExecutor
?
推荐答案
感谢 @Ardesco的回答,我能够使用window.getAllAngularTestabilities
函数执行类似于量角器的操作.这是我用来确定Angular 2+页面是否加载的脚本:
Thanks to @Ardesco's answer, I was able to do something similar to what Protractor does, using the window.getAllAngularTestabilities
function. Here is the script that I run to determine if the Angular 2+ page loads:
var testability = window.getAllAngularTestabilities()[0];
var callback = arguments[arguments.length - 1];
testability.whenStable(callback);
这是完整的ExpectedCondition
看起来对AngularJS和Angular 2+都适用的样子:
And here is what the complete ExpectedCondition
looks like that works for both AngularJS and Angular 2+:
private static ExpectedCondition<Boolean> angularIsFinished() {
return new ExpectedCondition<Boolean>() {
public Boolean apply(final WebDriver driver) {
Object result = null;
boolean isAngular2Plus = false;
while(result == null || result.toString().equals("undefined")) {
result = ((JavascriptExecutor)driver).executeScript("return typeof angular;");
if (result == null || result.toString().equals("undefined")) {
result = ((JavascriptExecutor)driver).executeScript("return typeof window.getAngularTestability;");
if (result != null && !result.toString().equals("undefined")) {
isAngular2Plus = true;
}
}
try {
Thread.sleep(200L);
} catch (final InterruptedException ex) {
logger.error("Error while trying to sleep", ex);
}
}
final String script;
if (isAngular2Plus) {
script =" var testability = window.getAllAngularTestabilities()[0];\n" +
" var callback = arguments[arguments.length - 1];\n" +
" testability.whenStable(callback);";
} else {
script =" var el = document.querySelector(\"body\");\n" +
" var callback = arguments[arguments.length - 1];\n" +
" angular.element(el).injector().get('$browser').notifyWhenNoOutstandingRequests(callback);";
}
((JavascriptExecutor) driver).executeAsyncScript(script);
return true;
}
public String toString() {
return "Wait for AngularJS";
}
};
}
这篇关于Selenium-确定网页是否已在Angular 2+中完成加载的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!