web-dev-qa-db-fra.com

Protractor browser.wait n'attend pas

Je suppose que browser.wait devrait être un appel bloquant, mais il ne fonctionne pas comme prévu. Voici mon échantillon:

describe("browser.wait", function() {
    beforeEach(function() {
        browser.wait(function() {
            console.log('1 - BeforeEach WAIT');
            return true;
        });
    console.log('2 - BeforeEach after wait');
});

afterEach(function() {
    browser.wait(function() {
        console.log('4 - afterEach WAIT');
        return true;
    });
    console.log('5 - afterEach after wait');
});

it('should probably actually wait.', function() {
    console.log('3 - IT statement');
    expect(1).toBe(1);      
});

Maintenant, parce que je supposais que browser.wait bloquait réellement, je pensais que mes appels console.log seraient exécutés dans l'ordre; 1,2,3,4,5;

La sortie réelle que j'obtiens est:

2 - BeforeEach after wait  
1 - BeforeEach WAIT  
3 - IT statement  
5 - afterEach after wait  
4 - afterEach WAIT  

Comment faire pour que browser.wait attende? Ou est-ce que j'utilise complètement la mauvaise fonction? J'ai besoin que les choses se bloquent jusqu'à ce que mon navigateur arrive là où il doit être pour le prochain appel.

31
Justin

Il s'agit de promesses (en fait, chaque question du rapporteur concerne les promesses).

browser.wait() n'est pas un appel bloquant, il planifie une commande pour attendre une condition:

Planifie une commande pour attendre le maintien d'une condition, comme défini par une fonction fournie par l'utilisateur. Si des erreurs se produisent lors de l'évaluation de l'attente, elles seront autorisées à se propager. Dans le cas où une condition renvoie un webdriver.promise.Promise, la boucle d'interrogation attend qu'il soit résolu et utilise la valeur résolue pour évaluer si la condition est remplie. Le temps de résolution d'une promesse est pris en compte pour savoir si une attente a expiré.

Il n'appellerait pas la fonction que vous transmettez immédiatement, il planifierait une commande et attendrait que la promesse soit résolue (si la fonction à l'intérieur renvoie une promesse).

Vous pouvez utiliser then() pour avoir un ordre correct dans ce cas:

beforeEach(function() {
    browser.wait(function() {
        console.log('1 - BeforeEach WAIT');
        return true;
    }).then(function () {
        console.log('2 - BeforeEach after wait');
    });
});

Voir les cas d'utilisation ici:

40
alecxe

La fonction d'attente retiendra l'exécution de cette fonction particulière, mais JavaScript fonctionne de manière asynchrone. Il peut donc arriver que votre fonction soit exécutée avant la fonction wait. Pour mieux le comprendre, vous devez lire Promesses en angulaire/rapporteur.

Pour que votre code fonctionne, vous devez .then (function () {}); (demander à la fonction 2 d'attendre la fin de la 1ère.

browser.wait(function() {
    console.log('1 - BeforeEach WAIT');
    return true;
}).then(function () {
    console.log('2 - BeforeEach after wait');
});
1
Yash Jagdale