2016-05-06 5 views
1

Ich bin etwas neu für Winkelmesser/Jasmin und vor allem Javascript, um Front-End-Testautomatisierung zu schreiben. Ich habe ein Objekt im DOM, das ich abrufen und auswerten möchte. Es ist im Wesentlichen ein Spaltenhöhenwert. Ich muss dies in einer Funktion in einer separaten Klasse von meinem Testskript überprüfen.Abrufen von Attribut von DOM über externe Funktion, mit Versprechen

Das Testskript Aufruf sieht wie folgt aus (die 'Selektor' vorgegeben ist und gültig):

colHeight = lib.getColumnHeight(selector); 
console.log(colHeight); 

Die HTML-DOM sieht wie folgt aus:

class="bar" fill-opacity="0.000001" x="123.02739726027396" width="6" height="10.8" y="15.8" 

ich die Funktion eingerichtet haben aber denke, ich stolpere über das Versprechen-Konzept; Ich bekomme immer wieder undefined. Was ich will, ist einfach den Wert Höhe zurückgeben.
Hier ist ein Blick auf meine Funktion:

this.getColumnHeight = function(selector) { 

var tmpSelector = element(by.css(selector)); 

    var found = new Promise(function(resolve, reject) { 
    var look = function() { 
     tmpSelector.getAttribute("height").then(function(text) { 
     var h = text; 
     console.log("h = " + h); 
     return h; 
     }) 
    } 
    var value = look(); 
    return value; 
    }) 
} 

Die Linie:

console.log("h = " + h); 

korrekt den Wert zurückgibt.
Ich bin mir nicht sicher, wie man 'h' aus der look() Funktion herausholt und in mein ursprüngliches Testskript zurückkehrt. Wo falle ich hin? Alle Hinweise sehr geschätzt.

EDIT (5/9/16):

nicht klar zu verstehen, wie der Wert zu übergeben zurück in mein Testskript, aus dem dann() Block. Mein aktueller Code gibt ein {ausstehend} für das Versprechen zurück. Vielen Dank im Voraus.

Call (tests.js):

colHeight = lib.getColumnHeight(selector); 
console.log(colHeight); 

Funktion (lib.js):

this.getColumnHeight = function(selector) { 
    var tmpSelector = element(by.css(selector)); 

    return new Promise(
     function(resolve,reject) { 
     var height = 0; 
     setTimeout(function(){ resolve(height); }, 2000); 
    }) 

    tmpSelector.getAttribute("height").then(function(valueFromResolve) { 
    A = valueFromResolve; 
    console.log(A); 
    return A; 
    }) 
} 
+0

Es ist nicht klar, warum Sie ein Versprechen brauchen. – Andy

+0

Ich bin sehr offen für Vorschläge. Die Funktion getAttribute basiert auf dem Versprechen. Wenn es eine bessere Lösung gibt, würde ich es gerne hören. – bmagstadt

Antwort

0

Durch Ihren Kommentar scheint es, dass getAttribue ein Versprechen ist, und Sie wollen, um die Höhe zu bekommen Wert aus dem Versprechen.

//Pretend getAttribute function 
function getAttribute(selector) { 

    return new Promise(function(resolve,reject) { 

    var height = 114.5; 

    setTimeout(function(){ resolve(height); }, 1000); 
    //After 1 second resolve promise and pass height to .then() function 
    }) 
} 

var A = "I get printed before .then()" 

getAttribute("#myTable").then(function(valueFromResolve) { 
    A = valueFromResolve; 
    console.log(A); 
}) 
console.log(A); //This will run before console.log(A) inside .then() 
       // even if there is no time delay in setTimeout() 

Jede Funktion innerhalb eines .then() wird gehalten, bis das gesamte andere synchrone Code ausgeführt wird. In Ihrem Code wird return h nach return value zurückgegeben. Unter return value ist die Ausführungszeit, h ist undefined.

console.log("h = " + h); funktioniert, weil es innerhalb der -Funktion aufgerufen wird, zu einer Zeit, in der var var h = text ausgeführt wurde (nachdem der gesamte synchrone Code ausgeführt wurde).

bearbeiten: Eigentlich nicht nach alle der synchrone Code ausgeführt wurde, aber bis die Funktion Stapel leer ist.Die Funktion look belegt den Stapel und alles innerhalb von wartet darauf, dass der Stapel leer ist. Der Punkt ist wirklich nur daran zu erinnern, dass der Code innerhalb von ausgeführt wird, wenn die Promise verrechnet wird (oder abgelehnt wird) und nicht von der Reihenfolge von oben nach unten, wie wir es gewohnt sind.

+0

Danke, John.abraham. Ich habe immer noch Probleme zu verstehen, wie man den Wert aus dem then() - Block in mein Testskript zurückgibt. Ich habe meinen obigen Beitrag bearbeitet, um meinen aktuellen Code anzuzeigen. Danke im Voraus. – bmagstadt

+0

@bmagstadt Jeder Code, von dem Sie wissen möchten, dass Sie einen neuen Wert haben, muss von .then() oder von einem .then() weiter unten in der Versprechungskette aufgerufen werden. Code, der vor .then() ausgeführt wird, wird nicht wissen, was .then() zurückgibt. –