In der Dokumentation für Winkelmesser sehe ich folgendes Beispiel:
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');
});
Was hier klar erscheint, ist, dass Sie "by.model" verwenden können, um Werte in einem Eingabefeld festzulegen. Wenn Sie jedoch ein Eingabefeld betrachten und sehen möchten, was darin enthalten ist, müssen Sie "by.binding" verwenden.
Ich habe eine Reihe von Codes, in denen ich (zusammenfassend) Folgendes tue:
element(by.model('risk.name')).sendKeys('A value');
expect(element(by.model('risk.name')).getText()).toEqual('A value');
(In meinem realen Code speichere ich die Entität und kehre dann im Bearbeitungsmodus zu ihr zurück. Ich überprüfe, ob mein Wert tatsächlich gespeichert wurde. Aber es läuft immer noch auf dasselbe hinaus, und dieser Beispielcode gibt das gleiche Problem.)
Dies gibt mir einen Fehler:
Error: Expected '' to equal 'A value'.
Theoretisch kann ich nach dem Beispiel aus den Dokumenten stattdessen Folgendes tun:
element(by.model('risk.name')).sendKeys('A value');
expect(element(by.binding('risk.name)).getText()).toEqual('A value');
Aber die by.binding scheint das vollqualifizierte Modell nicht zu mögen, ich erhalte eine Fehlermeldung:
Error: No element found using locator: by.binding("risk.name")
Es funktioniert (auf eine Art und Weise), wenn ich:
element(by.model('risk.name')).sendKeys('A value');
expect(element(by.binding('name')).getText()).toEqual('A value');
Dies findet ein Element, gibt aber auch eine Warnung aus, dass ich mehr als ein Element habe, das mit 'Name' übereinstimmt. Und leider ist der, den es auswählt, nicht der richtige.
Also zwei Fragen:
- Sollte das by.model in der Lage sein, ein getText () zurückzugeben, oder gibt es eine Entwurfsentscheidung, dass dies nicht der Fall ist und wir stattdessen by.binding verwenden müssen?
- Sollte ich in der Lage sein, eine vollständig qualifizierte Entität in by.binding zu verwenden, oder gibt es eine Entwurfsentscheidung, bei der by.binding den vollständigen Modellnamen nicht mag? Wenn ja, mit welchem anderen Qualifikationsmerkmal kann ich zwischen meinen verschiedenen Bindungen auswählen?
BEARBEITEN:
Ich habe auch die von vdrulerz vorgeschlagene Lösung ausprobiert und den Code wie folgt geändert:
element(by.model('risk.name')).getText().then(function(text) {
console.log(text);
expect(text).toEqual('A risk name');
});
Das console.log gibt einen leeren Wert zurück (kein Versprechen oder Objekt), und die Erwartung gibt die folgende Meldung nicht aus:
Expected '' to equal 'A risk name'.
Meines Wissens nach korrigiert der Winkelmesser bereits die Erwartung, das Versprechen zu erfüllen, und ich bin der Meinung, dass das zugrunde liegende Problem darin besteht, dass getText nicht in einem über ein Modell identifizierten Feld funktioniert (ich kann erfolgreich Text auf Etiketten und anderen Widgets abrufen).
Ich kann auch den folgenden Code mit getAttribute anstelle von getText () ausführen:
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');
});
Der erste Teil geht vorbei - die Erwartung funktioniert. Der zweite Teil funktioniert ebenfalls und legt nahe, dass die Syntax von vdrulerz ebenfalls gültig ist und "true" in der Konsole protokolliert. Ich denke, es gibt möglicherweise einen Fehler mit getText?