2016-12-09 3 views
1

In meinem Test-Code darf ich folgendes erreichen:Rückgabewert von verschachtelten Versprechen mit WebDriver

it('Updates label text', function(done) { 
    page.testLabelText(); 
    assert.equal(page.testLabelText().pageLabel, page.testLabelText().iFrameLabel); 
    done(); 
}); 

In meiner Seite Objekt, hier ist testLabelText();:

page.testLabelText = function() { 
    var pageLabel = function() { 
     return driver.findElement(By.css('#element')).getText().then(function(text) { 
      return text; 
     }); 
    }; 
    var iFrameLabel = function() { 
     return driver.findElement(By.css('#element')).getText().then(function(text) { 
      return text; 
     }); 
    }; 
    return { 
     pageLabel: pageLabel(), 
     iFrameLabel: iFrameLabel() 
    }; 
}; 

Aber das gibt 'Nicht definiert' wenn auf die Konsole ausgegeben ... ich einen Neuling in javascript bin so, obwohl ich dies in regelmäßiger Javascript geschaffen habe, alles, was ich versucht habe, hat mit Selen WebdriverJS Versprechen gescheitert ...

+0

Wie genau unterscheiden sich die Funktionen 'pageLabel' und' iFrameLabel'? Ist "# element" ein Platzhalter? – gyre

+0

pagelabel bezieht sich auf die Bezeichnung auf der Hauptseite, die sich von Benutzereingaben aktualisiert. Danach sollte der Iframe mit einem eigenen Label aktualisiert werden, das die Inhalte der Hauptseite widerspiegelt. #element war nur ein Beispiel, ist aber eigentlich der CSS-Selektor für jeden. – codemon

Antwort

1

Die Lösung war eine Behauptung Bibliothek zu verwenden, die Versprechen in den Tests lösen könnte, wie Dies wäre mit regulären Async-Assets unmöglich. In diesem Fall habe ich Chai as Promised.

das Erfordern folgende:

chai = require('chai'), 
chaiAsPromised = require("chai-as-promised"), 
should = chai.should(); 

einschließlich chai.use(chaiAsPromised); in before Haken des Mokka, konnte ich dann

it('Updates label text', function() { 
    var label = FormsPage.testLabelText(); 
    label.labelHeading.should.eventually.contain(label.userInput); 
}); 

ich einen Blogeintrag schreiben auf dieser here

gefunden
2

Ihre assert.equal() vergleicht zwei verschiedene Versprechen Objekte, so dass nie wahr sein wird. Um zu verstehen, warum, hier ist der Schritt für Schritt. Was Sie tun müssen, ist, die Werte aus beiden Versprechungen zu holen, nachdem sie aufgelöst wurden, und dann die Werte zu vergleichen.

page.testLabelText(); selbst gibt nur ein Objekt zurück, so dass es ohne Angabe des Rückgabewertes oder Referenzieren des Rückgabewerts selbst aufruft.

page.testLabelText().pageLabel selbst ist ein Versprechen.

page.testLabelText().iFrameLabel selbst ist ein Versprechen.

Und sie sind verschiedene Versprechen Objekte so Ihre assert.equal() nicht wahr sein.

Wenn Sie die beiden Werte von den Versprechungen vergleichen wollte, dann würden Sie so etwas zu tun haben:

var obj = page.testLabelText(); 
Promise.all(obj.pageLabel, obj.iFrameLabel).then(function(results) { 
    assert.equal(results[0], results[1]); 
    done(); 
}); 
+0

Ich bin mir ziemlich sicher, dass '' pageLabel' und iFrameLabel' Promises sind, nicht funktioniert. – gyre

+0

@gyre - Sie hatten Recht. Ich habe diesen Teil korrigiert. Ich habe das '()' im zurückgegebenen Objekt verpasst. Ich finde diesen Code wirklich verwirrend zu lesen mit so vielen Namen, die sehr ähnlich sind. – jfriend00

+0

@ jfriend00 Danke für die Erklärung, hat der Code Ähnliche Namen, weil die App ein Etikett auf der Hauptseite und den entsprechenden Betrag in der iFrame aktualisiert (es ist eine proprietäre App leider nicht zeigen kann). Das Problem mit Ihrer Lösung ist, dass ich Best Practices befolgen muss und keine Behauptungen in den Seitenobjekten habe, aber auch keine "Programmierung" in den Testfällen habe. Deshalb war meine einzige Lösung bisher, es zu versuchen um 'testLabelText()' auszuführen und es den inneren Text der erforderlichen Elemente zurückgeben zu lassen, und behaupten, dass sie innerhalb des Testfalls übereinstimmen ... Ich finde das super schwierig. – codemon

Verwandte Themen