2017-09-27 4 views
0

J'ai actuellement le code suivant dans un de mes spécifications de test pour Protractor:Protractor Timing Questions

.then(function() { 
    return button.click(); 
}) 
.then(function() { 
    return element(otherButton).isDisplayed(); 
}) 
.then(function(otherButtonIsPresent) { 
    if(otherButtonIsPresent) { 
     return browser.wait(EC.elementToBeClickable(element(otherButton)), getWaitTime()) 
      .then(function() { 
       element(otherButton).click(); 
       return element(continueButton).isPresent(); 
      }) 
    } 
}) 

Lorsque j'utilise Chrome pour déboguer en utilisant les --debug-brk et --inspect drapeaux, je suis en mesure de transmettre ces contrôles et curriculum vitae comme d'habitude. Lorsque je lance le même test sans les drapeaux, le test échoue et se bloque pendant la recherche otherButton avant d'essayer de cliquer dessus. Je me demande si c'est parce que pendant le débogage, je définis les points d'arrêt et j'attends que les boutons apparaissent sur l'écran avant d'essayer de cliquer dessus.

Je dois m'assurer que cet élément est visible sur la page avant d'essayer de cliquer dessus et je me demandais s'il y avait un autre moyen d'y parvenir?

Merci

+0

Essayez d'utiliser browser.wait() avec ExpectedConditions pour faire WebDriver à jusqu'à ce qu'une condition spécifique. consulter http://www.protractortest.org/#/api?view=ProtractorExpectedConditions. –

Répondre

0

J'utilise réponse que je ne peux pas encore de commentaire.

Vous le dites vous-même: après avoir cliqué sur un bouton, vous voulez simplement attendre que le bouton suivant soit cliquable. Par conséquent votre .then() -fonctions devrait commencer par le bouton dont il dépend. Pour moi, il semble, les trois fonctions alignées .then() dépendent de la même condition, donc après .click() le premier bouton, le second .then() est immédiatement exécuté, ne pas attendre le précédent .click() pour terminer.

donc mettre le .then() directement derrière le .click() concerné et à l'intérieur du précédent .then() -fonction, cela devrait fonctionner:

.then(function() { 
    element(button).click().then(function(){ 
     element(otherButton).click().then(function(){ 
      return element(continueButton).isPresent(); 
     }); 
    }); 
}); 

Ou si vous allez avec ExpectedConitions, vous ne devriez pas avoir besoin .then() -functions. Parce que doit gérer le Protractor ControlFlow, vous permettant d'écrire sans chaînés .then() -functions:

.then(function() { 
    browser.wait(EC.elementToBeClickable(element(button)), getWaitTime()); 
    element(button).click(); 
    browser.wait(EC.elementToBeClickable(element(otherButton)), getWaitTime()); 
    element(otherButton).click(); 
    browser.wait(EC.elementToBeClickable(element(continueButton)), getWaitTime()); 
    return element(continueButton).isPresent(); 
}); 

This nice post élabore un peu sur l'écriture asynchrone, mais grâce à l'exécution synchrone RAPPORTEUR.

Comme autre exemple combinant mes deux entrées, une sorte de double fixation du test:

.then(function() { 
    browser.wait(EC.elementToBeClickable(element(button)), getWaitTime()); 
    element(button).click().then(function(){ 
     browser.wait(EC.elementToBeClickable(element(otherButton)), getWaitTime()); 
     element(otherButton).click().then(function(){ 
      browser.wait(EC.elementToBeClickable(element(continueButton)), getWaitTime()); 
      return element(continueButton).isPresent(); 
     }); 
    }); 
});