У меня есть набор тестов Selenium, в котором выполняются интеграционные тесты Selenium для ряда веб-приложений, некоторые из которых написаны на Angular 2+, а некоторые — на AngularJS.
Мы используем пользовательский ExpectedCondition
с WebDriverWait
, который мы используем, чтобы тестовые примеры ждали, пока приложения AngularJS не закончат загрузку, чтобы избежать ожидания произвольного периода времени:
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";
}
};
}
Однако return typeof angular;
всегда будет возвращать undefined
для приложения Angular 2+. Есть ли способ, аналогичный notifyWhenNoOutstandingRequests в AngularJS, который вы можете использовать, чтобы определить, когда приложение Angular 2+ закончило загрузку?
В этом вопросе упоминается использование NgZone
как возможного решение, но как бы вы справились с этим с помощью скрипта, выполняемого через JavascriptExecutor
?
document.readyState
. Вы не можете полагаться на него для автоматизации Angular. 22.03.2019