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 anzeigen möchten, um zu sehen, was darin ist, müssen Sie "by.binding" verwenden.
Ich habe eine Reihe von Code, wo ich (zusammenfassend):
element(by.model('risk.name')).sendKeys('A value');
expect(element(by.model('risk.name')).getText()).toEqual('A value');
(In meinem echten Code speichere ich die Entität, komme dann im Bearbeitungsmodus zurück und prüfe, ob mein Wert tatsächlich gespeichert wurde. Aber es läuft immer noch auf dasselbe hinaus, und dieser Beispielcode gibt das gleiche Problem an.).
Das gibt mir einen Fehler:
Error: Expected '' to equal 'A value'.
Theoretisch kann ich dem Beispiel aus den Dokumenten folgend tun:
element(by.model('risk.name')).sendKeys('A value');
expect(element(by.binding('risk.name)).getText()).toEqual('A value');
Aber das by.binding scheint das vollqualifizierte Modell nicht zu mögen, ich bekomme eine Fehlermeldung:
Error: No element found using locator: by.binding("risk.name")
Es funktioniert (nach einer Mode), 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 das, was es auswählt, nicht das Richtige.
Also zwei Fragen:
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');
});
Console.log gibt einen leeren Wert zurück (kein Versprechen oder Objekt), und der Expect schlägt fehl und gibt die Nachricht aus:
Expected '' to equal 'A risk name'.
Ich verstehe, dass der Winkelmesser bereits die Erwartungen erfüllt, mit denen er das Versprechen abhandeln will. Das zugrunde liegende Problem ist daher, dass getText nicht in einem Feld funktioniert, das über ein Modell identifiziert wurde (ich kann GetText auf Etiketten und anderen Widgets erfolgreich ausführen).
Ich kann auch den folgenden Code ausführen, indem ich getAttribute anstelle von getText () verwende:
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 vergeht - die Erwartung funktioniert. Der zweite Teil funktioniert ebenfalls, was darauf hindeutet, dass die Syntax von vdrulerz ebenfalls gültig ist, und sie protokolliert "true" in der Konsole. Ich denke, dass es einen Fehler mit getText gibt?
Dies wird in der Protractor FAQ beantwortet: https://github.com/angular/protractor/blob/master/docs/faq.md#the-result-of-gettext-from-an-input-element-is- immer leer
Das Ergebnis von getText aus einem Eingabeelement ist immer leer
Dies ist ein Webdriver-Freak. und Elemente haben immer leere getText-Werte. Versuchen Sie stattdessen:
element.getAttribute('value')
Für Frage 2: Ja, Sie sollten einen vollständig qualifizierten Namen für by.binding verwenden können. Ich vermute, dass Ihre Vorlage kein Element enthält, das über {{}} oder ng-bind an risk.name gebunden ist.
getText()
function funktioniert nicht wie früher für Web-Treiber. Damit der Winkelmesser funktioniert, müssen Sie ihn in eine Funktion packen und den Text so zurückgeben, wie wir es für unseren Rahmen für das Winkelstück gemacht haben, in dem wir ihn aufbewahrt haben eine gemeinsame Funktion wie -
getText : function(element, callback) {
element.getText().then (function(text){
callback(text);
});
},
Dadurch können Sie den Text eines Elements haben.
Lass es mich wissen, wenn es noch unklar ist.
Ich hatte dieses Problem, ich versuchte Jmrs Lösung, aber es funktionierte nicht für mich. Da alle Eingabefelder ng-model-Attribute haben, könnte ich das Attribut ziehen, auswerten und den Wert erhalten.
HTML
<input ng-model="qty" type="number">
Winkelmesser
var qty = element( by.model('qty') );
qty.sendKeys('10');
qty.evaluate(qty.getAttribute('ng-model')) //-> 10
Sie müssen Promise verwenden, um Elementwerte zu drucken oder zu speichern.
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
});
Dieser Code funktioniert. Ich habe ein Datums-Eingabefeld, das so eingestellt ist, dass es nur gelesen werden kann, was den Benutzer zwingt, aus dem Kalender auszuwählen.
für ein Startdatum:
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);
für ein Enddatum:
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);
der folgende Code funktioniert für mich, um Text aus der Eingabe zu erhalten
return(this.webelement.getAttribute('value').then(function(text)
{
console.log("--------" + text);
}))