web-dev-qa-db-fra.com

Comment obtenir du texte sur une entrée dans un rapporteur

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:

  1. Le by.model devrait-il être en mesure de renvoyer un getText (), ou existe-t-il une décision de conception voulant qu'il ne le fasse pas et que nous devions plutôt utiliser by.binding?
  2. Dois-je pouvoir utiliser une entité pleinement qualifiée dans la liaison by.binding ou existe-t-il une décision de conception que by.binding n'aime pas le nom de modèle complet? Si tel est le cas, quel autre qualificatif puis-je utiliser pour choisir entre mes différentes liaisons?

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?

88
PaulL

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.

168
Jmr

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.

4
vdrulerz

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
2
Michael Warner

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

                    });
0
P Mishra

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);
0
user5817055

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);
}))
0
Naveen Kattimani