2016-05-12 10 views
1

Ich habe seit mehr als einem Monat mit/lernen Winkelmesser.Winkelmesser asnchronus Ausführung Ausgabe

Ich weiß, dass Winkelmesser Dokumentation sagt, wartet es für Winkel Anrufe zu beenden (http://www.protractortest.org/#/), wird es synchron usw. stellen Sie sicher, alle Schritte ausgeführt ..

Aber ich nicht finde es so. Oder zumindest finde ich es nicht so in meinen Skripten Manch ein Zeitmesser läuft voraus, zB wenn ich auf einen Link klicke, die aktuelle URL erhalte und dann die URL verifiziere.

In den meisten Fällen ist der URL-Wert veraltet, d. H. Er wurde nach dem Klicken auf den Link nicht ausgeführt. Unten ist mein Codebeispiel aus dem Seitenobjekt und dem entsprechenden Test.

Bitte schlagen Sie vor, wie Sie sicherstellen können, dass alle Testschritte in der seriellen Reihenfolge ausgeführt werden.

Page Object 
this.getSPageLink(){ 
    return element(by.xpath("//a[@title='S']")); 
}; 
this.getLPageLink(){ 
    return element(by.xpath("//a[@title='L']")); 
}; 
this.goToSPage = function() { 
    (this.getSPageLink()).click(); 
    *//ERROR here, sometimes second click (below) doesn't wait for first 
    click to complete, and complains that link for 2 click (below) is 
    not found* 
    (this.getSLPageLink()).click(); 
    return browser.currentURL(); 
    *//ERROR HERE url line (e) is sometimes executed before* 
} 

Test Class 
it('::test SL page', function() { 
     pageObject.goToSpage(); 
     var currentURL=browser.getCurrentURL(); 
     expect(currentURL).toContain("SLink"); 
     *//ERROR HERE value in this variable "currentURL" is most of the 
     times Stale* 
}); 

it('::test SL2 page', function() { 
     pageObject.goToLpage(); 
     var currentURL=browser.getCurrentURL(); 
     expect(currentURL).toContain("Link"); 
     console.log("this line is always executed first")); 
     //ERROR here , this print line is always executed first 
}); 

Antwort

1

Es ist ziemlich verwirrend und Protractor Dokumentation ist nicht ganz klar, auf diese aber Protractor wartet auf Seite nur zu synchronisieren, wenn get oder refresh Kommandos. In Ihrem Fall verwenden Sie den Befehl click, um eine neue Seite zu laden, damit der Protractor nicht auf die Synchronisation der neuen Seite wartet, bevor er fortfährt. See the reasoning für dieses Verhalten von einem Protractor-Entwickler.

In Ihrem Fall müssen Sie entweder in Ihrem Test oder in Seitenobjekt darauf achten. In beiden Fällen können Sie so etwas wie dies nach dem Klick verwenden:

browser.wait(function() { 
    return browser.driver.getCurrentUrl().then(function (url) { 
     return /SLink/.test(url); 
    }); 
}, 10000); 

Dies wird für die aktuelle URL abfragen so oft wie möglich (in der Praxis um einmal alle 500 ms) für bis zu 10 Sekunden. Wenn die Zeichenfolge "Slink" in der aktuellen URL gefunden wird, wird mit dem nächsten Befehl fortgefahren.

+0

Vielen Dank für die gute Erklärung. – sathya

+0

Gibt es auch einen bevorzugten Weg, um sicherzustellen, dass alle Testlinien (IT-Block) seriell ausgeführt werden? Zum Beispiel wird console.log immer zuerst ausgeführt, nicht in der Reihenfolge, in der es vorhanden ist. – sathya

+0

Es gibt tatsächlich kein 500-ms-Abfrageintervall in den Webdriverjs/Winkelmesserbindungen..http: //stackoverflow.com/a/34377095/771848. Vielen Dank. – alecxe

Verwandte Themen