En renvoyant une valeur de un à partir d'un rapporteur promesse à l'intérieur d'une fonction
Je vais essayer d'obtenir le texte d'une page, et ensuite utiliser ce texte plus bas dans la spec à faire valoir sur un autre élément.
Je l'ai collé un très simple spec, vous pouvez exécuter qui montre que vous ne pouvez pas retourner une valeur à partir d'une fonction si la fonction de l'instruction return est à l'intérieur d'un rapporteur promesse return txt;
(ligne 24)...
describe('My Test', function () {
var tempVariable;
it('should go get some text from the page', function () {
browser.get('https://angularjs.org/');
tempVariable = getTextFromElement(); //it appears javascript immediately sets this variable before waiting for protractor to return the value
});
it('should do some random other stuff', function () {
element.all(by.cssContainingText('a', 'Learn')).get(0).click();
element.all(by.cssContainingText('a', 'Case Studies')).get(0).click();
element.all(by.cssContainingText('a', ' Home')).get(0).click();
});
it('should be able to use the text from the first page in this test', function () {
console.log('\ntempVariable: ' + tempVariable); //this is undefined!
expect(typeof tempVariable).not.toBe('undefined', 'failed: tempVariable was undefined!');
});
});
function getTextFromElement() {
$('a.learn-link').getText().then(function (txt) {
console.log('\nInitial text: ' + txt);
return txt; //how do we return this so it's available to other 'it' blocks?
});
}
Mise à jour de l'extrait de code suivant @alecxe réponse et mon commentaire.
Je tente de contruct un objet de diverses texte sur une page et de le renvoyer à faire valoir sur une page ultérieure...
function getRandomProductFromList() {
var Product = function (line, name, subname, units) {
this.line = line;
this.name = name;
this.subname = subname;
this.units = units;
};
var myProduct = new Product();
myProduct.line = 'Ford';
myProduct.units = 235;
//select a random product on the page and add it to 'myProduct'
var allProducts = element.all('div.product');
allProducts.count().then(function (count) {
var randomIndex = Math.floor(Math.random() * count);
var productName = allProducts.get(randomIndex);
productName.getText().then(function (prodName) {
myProduct.name = prodName;
productName.click();
});
});
//If a sub-product can be chosen, select it and add it to 'myProduct'
var subproduct = $('div.subproduct');
subproduct.isDisplayed().then(function (subProductExists) {
if (subProductExists) {
subproduct.getText().then(function (subProductName) {
myProduct.subname = subProductName;
});
subproduct.click();
}
}, function (err) {});
return myProduct;
}
Placer le code que vous voulez exécuter après le retour à l'intérieur d'une fonction anonyme et de le passer à
getTextFromElements
en tant que paramètre. Puis il suffit d'appeler ce paramètre comme une fonction de l'endroit où vous êtes en essayant de retourner la valeur.OriginalL'auteur luker02 | 2015-08-10
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, vous êtes de ne pas retourner quelque chose à partir de la fonction:
Maintenant, cette fonction vous retournez un promesse lequel vous devez résoudre avant de l'utiliser:
Plus, afin de déterminer si une variable est définie ou pas, je voudrais utiliser
toBeDefined()
dejasmin-les allumettes
:getTextFromElement()
utilisegetText()
plusieurs fois pour contruct un . Et son que je veux revenir, afin d'accéder à ses attributs plus tard dans la spec. Les différentsgetText()
fonctions sont dispersés dans toute la fonction donc je ne suis pas sûr de l'endroit où le retour de l'objet final. Avez-vous des conseils pour la réalisation de quelque chose comme ça au lieu de revenir à seulement une promesse?Je pense que nous pouvons le résoudre. Pouvez-vous nous donner le code que vous avez jusqu'à présent et ce que l'objet devrait ressembler? Merci!
Cool. J'ai ajouté un plus spécifiques de la version de mon
getTextFromElement()
fonction à ma question initiale, maintenant appelégetRandomProductFromList()
comment faisons-nous la valeur de retour au lieu de la promesse de la fonction?
nous n'avons pas, passer des promesses autour de et de les résoudre en cas de besoin.
OriginalL'auteur alecxe
Grâce à @alecxe pour le démarrage de moi sur le pied droit.
J'ai trouvé une solution, je suis maintenant en utilisant un peu après la lecture de cette.
Par le passage d'un objet par référence, vous pouvez ajouter des propriétés à la volée et de les utiliser plus tard dans votre spec.
Exemple:
OriginalL'auteur luker02
Aucun des ci-dessus a fonctionné pour moi. Ce travail est pour moi:
item.getText()
qui fait la même chose que l'ensemble de votremethodToGetTheText
fonction. Mais, si vous avez besoin de modifier le texte avant de les retourner, de les simplifier:this.methodToGetTheText = function () { return item.getText().then(function (text) { return text.toLowerCase(); }); }
(vous n'avez pas besoin de laPromise.resolve
). Si l'utilisation de la Machine ou ES6, de simplifier encore plus:this.methodToGetTheText = () => item.getText().then(text => text.toLowerCase());
Je ne peux pas tout simplement appeler poste.getText(). Si je fais ça, la méthode renvoie undefined.
OriginalL'auteur Carlos
Faites-vous appel à
methodToGetTheText().then(
de votre spec? La valeur à l'intérieur de la.then()
fonction doit contenir votre page de texteOriginalL'auteur luker02