Recentemente, postei uma pergunta sobre um problema que tenho testado em um aplicativo com base angular (ref: aguarde até que o Angular termine de carregar o problema )
Acontece que a verificação feita foi válida para aplicativos angular 1.x, enquanto nosso aplicativo é executado no angular 6.x.
Então descobri aquele post: Detectando que o Angular 2 acabou de ser executado
que explica como fazer uma verificação semelhante, mas para aplicativos angulares 2+. Configurei o cheque de maneira semelhante à explicação de "Michal Filip".
Também tentei usar a solução ngWebdriver proposta mais adiante no post.
Ambos sofrem do mesmo problema: a verificação sempre retornará verdadeiro como no carregamento realizado, o que não é verdadeiro.
tentei inverter a verificação, não ajudou (estado nunca mudou)
// Will check if Angular still has pending http_requests ongoing and wait if required
public void untilAngular2HasFinishedProcessing()
{
until(() ->
{
log.info("Waiting on angular 2+ to finish processing");
final boolean isReady = ((JavascriptExecutor) driver).executeAsyncScript(
"var callback = arguments[arguments.length - 1];" +
"if (document.readyState !== 'complete') {" +
" callback('document not ready');" +
"} else {" +
" try {" +
" var testabilities = window.getAllAngularTestabilities();" +
" var count = testabilities.length;" +
" var decrement = function() {" +
" count--;" +
" if (count === 0) {" +
" callback('complete');" +
" }" +
" };" +
" testabilities.forEach(function(testability) {" +
" testability.whenStable(decrement);" +
" });" +
" } catch (err) {" +
" callback(err.message);" +
" }" +
"}"
).toString().equals("complete");
log.info("Is angular 2+ ready? " + isReady);
return isReady;
}
);
}
// sample call would be
untilAngular2HasFinishedProcessing();
Esperado: o teste esperaria até que o Angular concluísse o carregamento antes de retornar verdadeiro
Real: retorna verdadeiro desde o início, o que eu sei que não é o caso.
Possível duplicado? Não, porque esta é uma questão problemática baseada na implementação proposta na questão vinculada.
Esta é a solução que acabei usando:
public boolean untilAngular2HasFinishedProcessing()
{
until(() ->
{
log.info("Waiting on angular 2+ to finish processing");
final boolean isReady = (Boolean.valueOf(((JavascriptExecutor) driver)
.executeScript(
"try{" +
"return (window.getAllAngularTestabilities()[0]._ngZone.hasPendingMicrotasks == " +
"false && " +
"window.getAllAngularTestabilities()[0]._ngZone.hasPendingMacrotasks == false && " +
"window.getAllAngularTestabilities()[0]._ngZone._nesting == 0 &&" +
"window.getAllAngularTestabilities()[0]._ngZone.isStable == true)" +
"}" +
"catch(err) {" +
"if (err.message == ('window.getAllAngularTestabilities is not a function'))" +
"{" +
"return true" +
"}" +
"}")
.toString()));
log.info("Is Angular 2+ ready? " + isReady);
return isReady;
}
);
return true;
}
Isso funcionou de forma consistente até agora.
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras