Je développe des tests automatisés dans Protractor depuis un certain temps et, comme beaucoup d’entre vous, j’ai rencontré des lacunes qui ne peuvent être comblées qu’avec le pont browser.sleep()
-. Je ne suis pas un fan de codage difficile comme celui-ci, mais si c'est une nécessité, je le ferai.
Les tests que j'ai développés m'ont amené à un point où chaque browser.sleep(1000)
a un impact majeur sur mon temps d'exécution. Les tests testent actuellement les autorisations pour différents comptes (128 exactement), ce qui implique de se connecter et de se déconnecter tout en vérifiant ce à quoi chaque compte a accès et n'a pas encore accès.
Le site Web que je teste est une application purement AngularJS qui, à mes yeux, devrait faire de browser.sleep()
une méthode obsolète, car il existe une méthode browser.waitForAngular()
qui attend avec précision le chargement complet de la page par rapport à browser.sleep()
qui attend une durée définie et si votre site Web n'est pas chargé dans ce délai (cela arrive), vous aurez un test incohérent (personne n'aime l'incohérence).
Des recherches m'ont conduit à penser que browser.waitForAngular()
ne prend pas en compte les animations et les fonctionnalités associées, qui prennent beaucoup de temps, car elles ne sont pas liées à AngularJS et pourtant cela n'est pas implémenté sur notre site Web. De plus, waitForAngular()
attend essentiellement $digest
, $http
et $timeout
.
Ce que je demande, c’est de savoir si c’est quelque chose qui est considéré comme une perte acceptable puisque Protractor est génial en général ou y at-il quelque chose que j’ignore ici?
TL; DR: Existe-t-il des solutions pour nous permettre de ne pas nous contenter de browser.sleep()
?
Sources: Documents de délai d'expiration de rapporteur , Timeout-spec.js (documents de rapporteur) , Issue909 , Issue279 , Issue92 , StackQuestion1
Si vous pouvez concevoir une sorte de test pour déterminer si tout ce que vous attendez est terminé, vous pouvez utiliser browser.wait
. En prenant des idées de http://docsplendid.com/archives/209 , vous pouvez transmettre une fonction qui renvoie une promesse résolue en true
ou false
, telle que celle qui utilise isPresent
browser.wait(function() {
return element(by.id('some-element')).isPresent();
}, 1000);
ou si vous avez une condition plus compliquée, vous pouvez utiliser le chaînage de promesse:
browser.wait(function() {
return element(by.id('some-element')).isPresent().then(function(isPresent) {
return !isPresent;
});
}, 1000);
et le flux de commande attendra, appelant à plusieurs reprises la fonction passée à wait
, jusqu'à ce que la promesse renvoyée soit résolue en true
.
C’est le cas si vous souhaitez exécuter une action lorsque l’élément est présent ou si vous souhaitez attendre qu’il soit présent sur la page.
element(by.id).isPresent().then(function(result) {
if (result) {
nextButton.click();
}
else{
browser.wait(function () {
return browser.isElementPresent(element(by.id));
},50000);
}
}).then(function () {
nextButton.click();
});
},