2017-09-08 1 views
1

J'utilise le framework de test automatisé, Protractor.Résoudre la promesse conditionnellement

J'ai découvert que Protractor utilise fréquemment promises pour résoudre de façon asynchrone l'évaluation de code. Question: Comment puis-je résoudre manuellement une promesse à une valeur spécifique, une fois qu'une condition est remplie?


Mise à jour: 09/08/2017

Désolé, j'étais un peu clair sur promises. J'ai pu obtenir ce fonctionne correctement maintenant avec:

// match variable 
var match = false; 

// get all elements with `div` tag 
var scanElements = element.all(by.css('div')).each(function(el) { 
    // get text content of element 
    el.getText().then(function(text) { 
     // split words into array based on (space) delimeter 
     var sp = text.split(' '); 
     for (var i = 0; i < sp.length; i++) { 
      if (sp[i] == 'Stack Overflow') { 
       match = true; 
      } 
     } 
    }); 
}); 

// on complete 
scanElements.then(function() { 
    if (match) { 
     console.log('Status: Found match!'); 
    } 
    else { 
     console.log('Status: No match'); 
    } 
}); 
+0

Je n'ai pas utiliser protractor, mais je l'ai utilisé BlueBird et Q. Sur ces cadres, vous avez la possibilité de '' reject' par return deferred.reject (data) 'la promesse et attrape le statut avec un gestionnaire' .fail ((data) =>) '. Ou vous pouvez également résoudre la promesse avec différentes valeurs comme 'deferred.resolve (myConditionalData1)' ... ou 'deferred.resolve (myConditionalData2)'. Vous pouvez résoudre la promesse de plusieurs façons, avec plusieurs valeurs de données, il suffit de les gérer correctement. Je n'ai pas ajouté cela comme réponse, parce que je n'ai pas travaillé avec le framework que vous utilisez. J'espère que cela aide –

Répondre

1

Il y a each() est nul après à travers tout itère pas question ici selon le documentation le type de retour de element.all()..

Une promesse qui sera résolue lorsque la fonction aura été appelée sur tous les éléments ElementFinders. La promesse se résoudra à null.

Édition 1: Le filtre est-il une option valide?

element.all(by.css('div')) 
    .filter(function(element) { 
     return element.getText().then(function(text) { 
     var sp = text.split(' '); 
     for (var i =0; i< sp.length; i++) { 
      if(sp[0] == 'protractor') return true; 
     } 
     return false; 
     }); 
    }).first(); 

va d'abord filter puis revenir élément first qui correspond

+0

Je suppose que ce que je cherche est: comment puis-je arrêter l'exécution de la promesse externe, et renvoyer la valeur trouvée une fois la correspondance trouvée? –

1

Vous devez utiliser map au lieu de each. Si vous regardez le code source, voici comment each est mis en œuvre:

each(fn: (elementFinder?: ElementFinder, index?: number) => any): wdpromise.Promise<any> { 
    return this.map(fn).then((): any => { 
    return null; 
    }); 
} 

Donc, comme vous pouvez le voir utilise en interne map et se cache le résultat en retournant null. Il est également souligné dans le documentation. Renommez également element en autre chose simplement pour éviter toute ambiguïté avec l'objet element du rapporteur.

0

Dans votre exemple précis, vous pouvez utiliser .getText() sur ElementArrayFinder -

// calling .getText() exactly on ElementArrayFinder returns promise 
let hasStackOverflow = $$('div').getText().then(texts=> { 
    // texts would be array of strings 
    return texts.includes('Your Text exact match') 
}) 

hasStackOverflow.then(has=> { 
    if (has) { 
     console.log('Status: Found match!'); 
    } 
    else { 
     console.log('Status: No match'); 
    } 
})