2009-04-15 9 views
1

Ich benutze WaitforComplete() in watiN aber es scheint nicht gut zu funktionieren. Wie es die nächste Anweisung ausführt, auch wenn Sie länger warten müssen. Ich verwende thread.sleep(), um meine Anwendung zu stoppen, bis sie die gewünschte Seite oder das gewünschte Element erhält. Aber die Sache ist, dass Seiten so dynamisch sind, dass es manchmal viel länger dauert, als angegeben.Was ist besser Ansatz auf Elemente auf einer Seite warten Waitforcomplete() oder system.threading.thread.sleep()

Jede bessere Lösung. Jedes Objekt, das die Seite abfangen wird, wird dynamisch zurückgegeben und es werden keine weiteren Anweisungen in der Anwendung ausgeführt.

Beispiel des Codes

'Show Details page 
    Assert.AreEqual("Confirmation", _internetExplorer.Title) 

    If (_internetExplorer.Button(Find.ById(New Regex("btnFinish"))).Exists) Then 
     _internetExplorer.Button(Find.ById(New Regex("btnFinish"))).Click() 
    Else 
     Assert.Fail("Could not Find Finish Booking Button on Confirmation Page") 
    End If 

    System.Threading.Thread.Sleep(100000) 

‚Show Buchung Zusammenfassung Seite Assert.AreEqual ("Display Buchung", _internetExplorer.Title)

Ich möchte etwas, das die Rückkehr der Seite dynamisch erfassen. anstatt einen konstanten Wert zu geben.

Antwort

4

Die WaitForComplete Methode verschiebt esentially auf, sobald der Browser es Readystate comllete und der Belegtzustand auf false gesetzt hat.

Was ich normalerweise tue, ist zu versuchen, auf das zuzugreifen, was Sie brauchen, dann führen Sie eine thread.sleep für sagen Sie eine halbe Sekunde aus, dann versuchen Sie es erneut. Ich habe auch eine globale Zeitüberschreitung, die nach etwa 10 Sekunden beendet wird.

int timeout = 20; 
    bool controlFound = false; 
    for (int i = 0; i < timeout; i++) 
    { 
     if (_internetExplorer.Button(Find.ById(New Regex("btnFinish"))).Exists) 
     { 
      _internetExplorer.Button(Find.ById(New Regex("btnFinish"))).Click(); 
      controlFound = true; 
      break; 
     } 
     else 
     { 
      System.Threading.Thread.Sleep(500); 
     } 
    } 


    if (!controlFound) 
    { 
     Assert.Fail("Control not found"); 
    } 
0

Wenn es die nächste Anweisung ausführt, sollte es das entsprechende Element finden. Ich schlage vor, eine Probe des Codes, den Sie versuchen, zu veröffentlichen.

5

WaitForComplete funktioniert nur gut, wenn es nach einer Aktion ein Postback gibt. Sonst muss man etwas anderes finden, auf das man warten muss. Im Anschluss an ein Beispiel, wie für den angegebenen Titel warten:

_internetExplorer.Element("title", "Confirmation").WaitUntilExists(); 

würde ich immer vorziehen, eine der WaitXXX Methoden zu verwenden, statt Thread.Sleep verursacht die WaitXXX Methoden warten Sie nur, bis die contraint erfüllt ist. Wobei Sleep auf die angegebene Zeit wartet. Wenn es zu lang ist, ist die Zeit tailliert. Wenn es zu kurz ist, entstehen Probleme.

HTH, Jeroen