Dans la documentation du 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 semble clair ici, c'est que vous pouvez utiliser "by.model" pour définir des valeurs dans une zone de saisie, mais si vous voulez regarder 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 vrai code, j'enregistre l'entité puis j'y reviens en mode édition, et je vérifie que ma valeur a bien été enregistré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, en 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 by.binding ne semble pas aimer le modèle complet, j'obtiens une erreur:
Error: No element found using locator: by.binding("risk.name")
Cela fonctionne (en quelque sorte) si je 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 choisit n'est pas le bon.
Donc, deux questions:
- Le by.model devrait-il être capable de retourner un getText (), ou y a-t-il une décision de conception selon laquelle il ne le fait pas et que nous devons utiliser à la place by.binding?
- Dois-je pouvoir utiliser une entité entièrement qualifiée dans by.binding, ou y a-t-il une décision de conception qui n'apprécie pas le nom complet du modèle par by.binding? Si tel est le cas, quel autre qualificatif puis-je utiliser pour choisir entre mes différentes liaisons?
ÉDITER:
J'ai également 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 console.log renvoie une valeur vide (pas une promesse ou un objet), et l'attente échoue en donnant le message:
Expected '' to equal 'A risk name'.
Je crois comprendre que le rapporteur corrige déjà l'attente pour traiter la promesse, donc je pense 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 le texte sur les étiquettes et 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 elle enregistre «true» sur la console. Je pense qu'il y a potentiellement un défaut avec getText?