2016-05-24 7 views
1

Hi eigentlich bin ich in "it" Block meines Codes Synchronisierung konfrontiert. Das folgende Snippet zeigt das Problem.Synchronisation im 'it'-Block in Winkelmesser

it('Some Download Operation',function() 
{ 
    console.log("before"); 
    myobj.clickOnDownloadBtn(); 
    console.log("after download click"); 
    browser.driver.sleep(5000); 
    var enter = browser.actions().sendKeys(protractor.Key.ENTER); 
    enter.perform(); 
    console.log("after enter btn"); 
}); 

Im erhalten die Ausgabe wie:

before 
after download click 
after enter btn 
//Then the click on PO Object's 'myobj.clickOnDownloadBtn()' operation. 

Bitte bald lassen Sie mich das Problem und Lösung für das wissen.

+0

warum Sie SetTimeout nicht verwenden? –

+0

nicht funktioniert @AmitSoni – balu

Antwort

2

Sie haben das Hinzufügen einer Funktion, wie auf diese Weise:

it('Some Download Operation',function() 
{ 

    myobj.clickOnDownloadBtn().then (function() { 
    console.log("after enter btn"); 
    console.log("after download click"); 
    }); 

    browser.driver.sleep(5000); 
    var enter = browser.actions().sendKeys(protractor.Key.ENTER); 
    enter.perform().then (function() { 
    console.log("after enter btn"); 
    }); 

}); 
+1

Gute Arbeit! Btw, fügte ein bisschen mehr zu "warum" das würde in einer separaten Antwort arbeiten. – alecxe

+0

Vielen Dank für Ihre Ermutigungen alecxe;) Wir lernen von Ihren Beispielen;) – Emna

+1

Danke Alecxe und Emna :) – balu

2

Um ein bisschen mehr zu erarbeiten, warum @ Emna-Lösung helfen würde:

Protractor ist völlig asynchrone und basiert auf das Konzept der Versprechen - Sie können nicht erwarten, dass Ihr Code von oben nach unten blockierend arbeitet. In Protractor gibt es diesen Control Flow Mechanismus, der als Warteschlange von WebDriver verspricht.

Um die in der Perspektive Ihres Codes stellen:

console.log("before"); 
myobj.clickOnDownloadBtn(); 
console.log("after download click"); 
browser.driver.sleep(5000); 
var enter = browser.actions().sendKeys(protractor.Key.ENTER); 
enter.perform(); 
console.log("after enter btn"); 

Hier würde alles von oben nach unten ausgeführt werden, aber console.log() Anrufe sofort durchgeführt werden würde, da sie synchron sind. Aufrufe wie myobj.clickOnDownloadBtn(), browser.driver.sleep(5000) und enter.perform() Return Versprechungen, würden nicht sofort ausgeführt werden, sondern würden stattdessen auf den Kontrollfluss gesetzt werden. Deshalb sehen Sie console.log Ergebnisse, bevor Aktionen auf der Seite ausgeführt werden.

Verwandte Themen:

+0

Vielen Dank für die Erklärung @alecxe – balu