2017-07-12 3 views
0

Disons que j'ai un bouton et un élément div sur une page.Test de changement de page asynchrone avec l'interne

<button /><div>old text</div> 

En cliquant sur le bouton, javascript modifier de manière asynchrone le texte de la div (à savoir après l'appel ajax). Comment puis-je le tester avec stagiaire?

Cela ne fonctionne pas:

function testButtonClick() { 
     return command 
       .findByTagName('button') 
       .click() 
       .end() 
       .findByTagName('div') 
       .getVisibleText() 
       .then(function(text) { assert.strictEqual(text,'new text')}); //errror, text is 'old text' 
} 

Si j'ajoute .sleep(5000) après .end(), il fonctionne bien (parce que ma demande async est généralement fait en 5 secondes). Mais je ne veux pas attendre si longtemps, car l'async est généralement terminé beaucoup plus tôt. Mais en utilisant le sommeil avec une valeur de temps plus faible, je risque qu'il sera testé avant que la demande soit terminée.

Y a-t-il un meilleur moyen?

Répondre

1

La solution la plus efficace serait d'utiliser pollUntil, quelque chose comme:

return command 
    .findByTagName('button') 
    .click() 
    .end() 
    .then(pollUntil(function() { 
     var el = document.getElementByName('div'); 
     if (el && el.textContent === 'new text') { 
      return true; 
     } 
    }, 5000)); 

Sondage jusqu'à ce que se déroulera une fonction dans le contexte du navigateur à plusieurs reprises jusqu'à ce qu'il retourne une réponse non nulle, non définie, ou jusqu'à ce que ça expire. Dans l'extrait ci-dessus, la fonction d'interrogation renvoie true si l'élément existe et contient le texte attendu, ou indéfini dans le cas contraire. Il expirera après 5000ms, mais il se terminera dès que le texte attendu apparaîtra.