webentwicklung-frage-antwort-db.com.de

GetText für eine Eingabe im Winkelmesser

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:

  1. 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?
  2. Sollte ich in der Lage sein, eine vollständig qualifizierte Entität in der by.binding zu verwenden, oder gibt es eine Entwurfsentscheidung, dass by.binding nicht den vollständigen Modellnamen mag? Wenn ja, mit welchem ​​anderen Qualifier kann ich zwischen meinen verschiedenen Bindungen wä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');  
});

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?

88
PaulL

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.

168
Jmr

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.

4
vdrulerz

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

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

                    });
0
P Mishra

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

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