Dans la documentation relative au rapporteur, je vois l'exemple suivant:
describe('by model', function() {
it('should find an element by text input model', function() {
var username = element(by.model('username'));
username.clear();
username.sendKeys('Jane Doe');
var name = element(by.binding('username'));
expect(name.getText()).toEqual('Jane Doe');
});
Ce qui apparaît clairement ici est que vous pouvez utiliser "by.model" pour définir des valeurs dans une zone de saisie, mais si vous souhaitez consulter une zone de saisie et voir ce qu’elle contient, vous devez utiliser "by.binding".
J'ai un ensemble de code où (en résumé) je fais:
element(by.model('risk.name')).sendKeys('A value');
expect(element(by.model('risk.name')).getText()).toEqual('A value');
(Dans mon code réel, je sauvegarde l'entité, puis j'y reviens en mode édition et je vérifie que ma valeur a bien été sauvegardée. Mais cela revient toujours à la même chose, et cet exemple de code pose le même problème).
Cela me donne une erreur:
Error: Expected '' to equal 'A value'.
En théorie, suivant l'exemple de la documentation, je peux plutôt faire:
element(by.model('risk.name')).sendKeys('A value');
expect(element(by.binding('risk.name)).getText()).toEqual('A value');
Mais le by.binding ne semble pas aimer le modèle pleinement qualifié, je reçois une erreur:
Error: No element found using locator: by.binding("risk.name")
Cela fonctionne (à la mode) si je le fais:
element(by.model('risk.name')).sendKeys('A value');
expect(element(by.binding('name')).getText()).toEqual('A value');
Cela trouve un élément, mais donne également un avertissement que j'ai plus d'un élément qui correspond à 'nom'. Et malheureusement, celui qu'il a choisi n'est pas le bon.
Donc, deux questions:
MODIFIER:
J'ai aussi essayé la solution proposée par vdrulerz, j'ai modifié le code comme suit:
element(by.model('risk.name')).getText().then(function(text) {
console.log(text);
expect(text).toEqual('A risk name');
});
Le fichier console.log renvoie une valeur vide (pas une promesse ni un objet) et l'attente échoue en donnant le message:
Expected '' to equal 'A risk name'.
D'après ce que je comprends, le rapporteur corrige déjà l'espoir de tenir la promesse. Je pense donc que le problème sous-jacent est que getText ne fonctionne pas sur un champ identifié via un modèle (je peux réussir à obtenir du texte sur des étiquettes et d'autres widgets).
Je peux également exécuter le code suivant, en utilisant getAttribute plutôt que getText ():
expect(element(by.model('risk.name')).getAttribute('autofocus')).toEqual('true');
element(by.model('risk.name')).getAttribute('autofocus').then(function(text) {
console.log(text);
expect(text).toEqual('true');
});
La première partie passe - l'attente fonctionne. La deuxième partie fonctionne également, suggérant que la syntaxe de vdrulerz 'est également valide et qu'il enregistre' true 'dans la console. Je pense qu'il y a potentiellement un défaut avec getText?
Ceci est répondu dans la FAQ de Protractor: https://github.com/angular/protractor/blob/master/docs/faq.md#the-result-of-gettext-from-an-input-element-is- toujours vide
Le résultat de getText à partir d'un élément input est toujours vide
Ceci est une bizarrerie webdriver. et les éléments ont toujours des valeurs getText vides. Au lieu de cela, essayez:
element.getAttribute('value')
Pour ce qui est de la question 2, vous devriez pouvoir utiliser un nom qualifié complet pour by.binding. Je soupçonne que votre modèle ne contient pas d'élément lié à risk.name via {{}} ou ng-bind.
La fonction getText()
ne fonctionnera plus comme avant pour WebDriver. Pour que cela fonctionne avec un rapporteur, vous devez l'envelopper dans une fonction et renvoyer le texte comme nous l'avions conservé dans notre cadre de rapporteur, nous l'avons conservé une fonction commune comme -
getText : function(element, callback) {
element.getText().then (function(text){
callback(text);
});
},
En cela, vous pouvez avoir le texte d'un élément.
Faites-moi savoir si ce n'est pas encore clair.
J'ai eu ce problème j'ai essayé la solution de Jmr mais cela n'a pas fonctionné pour moi. Comme tous les champs d'entrée ont des attributs de modèle, je pourrais extraire l'attribut, l'évaluer et obtenir la valeur.
HTML
<input ng-model="qty" type="number">
Rapporteur
var qty = element( by.model('qty') );
qty.sendKeys('10');
qty.evaluate(qty.getAttribute('ng-model')) //-> 10
Vous devez utiliser Promise pour imprimer ou stocker les valeurs d'élément.
var ExpectedValue:string ="AllTestings.com";
element(by.id("xyz")).getAttribute("value").then(function (Text) {
expect(Text.trim()).toEqual("ExpectedValue", "Wrong page navigated");//Assertion
console.log("Text");//Print here in Console
});
Ce code fonctionne. J'ai un champ de saisie de la date défini en lecture seule qui oblige l'utilisateur à effectuer une sélection dans le calendrier.
pour une date de début:
var updateInput = "var input = document.getElementById('startDateInput');" +
"input.value = '18-Jan-2016';" +
"angular.element(input).scope().$apply(function(s) { s.$parent..searchForm[input.name].$setViewValue(input.value);})";
browser.executeScript(updateInput);
pour une date de fin:
var updateInput = "var input = document.getElementById('endDateInput');" +
"input.value = '22-Jan-2016';" +
"angular.element(input).scope().$apply(function(s) { s.$parent.searchForm[input.name].$setViewValue(input.value);})";
browser.executeScript(updateInput);
le code ci-dessous fonctionne pour moi, pour obtenir du texte à partir d'une entrée
return(this.webelement.getAttribute('value').then(function(text)
{
console.log("--------" + text);
}))