2016-08-10 6 views
0

In einigen meiner Projekte, um Formulare korrekt zu speichern, die der Benutzer ausführen muss, klicken Sie auf "Speichern" oder "Änderungen speichern". Dieser Klick bewirkt, dass die ganze Seite neu geladen wird (die Änderungen werden nach dem Neuladen auf der Seite sichtbar), aber wenn etwas nicht stimmt, stoppt die Validierung das erneute Laden der Seite. Ich möchte eine einfache Assertion erstellen, um zu überprüfen, ob diese Seite neu geladen wurde, wenn mein Test nicht fehlschlägt. Ich habe versucht, diesen Code zu verwenden:Gibt es eine Möglichkeit zu überprüfen, ob die Seite mit WebDriver (C#) neu geladen wurde?

public bool WasPageRefreshed(float seconds) 
{ 
    DriverLocal.Manage().Timeouts().SetPageLoadTimeout(TimeSpan.MinValue); 
    string getReadyState = "return document.readyState;"; 

    for (int i = 0; i < 10; i++) 
    { 
     string readyState = GetJsExecutor().ExecuteScript(getReadyState) as string; 
     if (readyState != "complete") 
      return true; 
     Thread.Sleep(TimeSpan.FromMilliseconds(seconds/10)); 
    } 

    DriverLocal.Manage().Timeouts().SetPageLoadTimeout(TimeSpan.FromSeconds(60)); 
    return false; 
} 

ich es in Assert.True() verwenden, um zu überprüfen, ob Seite neu geladen wurde, aber es funktioniert nicht immer (ich kann es 5 mal auf der gleichen Form verwenden - 3fachen ok, 2 mal Test wird fehlschlagen). Gibt es eine Möglichkeit, es zu aktualisieren, um in 100% der Verwendung korrekt zu funktionieren? Oder gibt es eine andere Möglichkeit, um zu überprüfen, ob die Seite neu geladen wurde?

Antwort

0

Es kann sein, dass einige Ajax-Aufrufe asynchron ausgeführt werden. Sie können warten, bis Ajax-Aufruf abgeschlossen, dann Ihren Fall zu tun, sehen:

public void WaitForAjax() 
{ 
    while (true) // break if ajax return false 
    { 
     var ajaxIsComplete = (bool)(driver as IJavaScriptExecutor).ExecuteScript("return jQuery.active == 0"); 
     if (ajaxIsComplete) 
      break; 
     Thread.Sleep(100); 
    } 
} 
+0

, die helfen werde nicht, wenn ich warten, wird für alle Ajax-Seite vervollständigen dann geladen und einsatzbereit. Ich muss überprüfen, ob die Seite neu geladen wird, während sie neu geladen wird. –

+0

Ihr Fall unterscheidet sich vom Ladevorgang. Warum finden Sie kein Objekt, das nach dem "Speichern" -Button vorhanden sein sollte und es auf Assertion prüfen soll? –

+0

Dies funktioniert nur, wenn die Webseite jQuery verwendet – nilesh

0

Wie meiner Meinung nach, besser genutzt werden SeleniumWait statt Schlaf. Versuchen Sie diese

 public bool WasPageRefreshed(double seconds) 
    { 
     WebDriverWait wait = new WebDriverWait(DriverLocal, TimeSpan.FromSeconds(seconds)); 
     wait.PollingInterval = TimeSpan.FromSeconds(1); 
     string getReadyState = "return document.readyState;"; 
     try 
     { 
      wait.Until(d => 
      { 
       string readyState = GetJsExecutor().ExecuteScript(getReadyState) as string; 
       if (readyState == "complete") 
        return true; 
      }); 
     } 
     catch (Exception) 
     { 
     } 
     return false; 
    } 

Ich schlage vor, Sie warten auf ein bestimmtes Element, das den Status einer aktualisierten Seite markiert.

0

Für die Webseitenbelastung gibt es leider keine einheitliche Lösung. Jede Situation ist unterschiedlich. Wie Sie in Ihrer Automatisierungssuite warten, ist sehr kritisch. Explizite wartet sind Art und Weise des Wartens empfohlen, statt Javascript-Optionen zu verwenden, können Sie direkt nach dem Laden der Seite für ein neues Element warten oder für Unsichtbarkeit bestimmter Element warten, der Ihnen sagt, dass die Seite geladen wird

new WebDriverWait(driver, TimeSpan.FromSeconds(timeOut)) 
.Until(ExpectedConditions 
.ElementExists((By.Id("new Element Id")))); 

oder

new WebDriverWait(driver, TimeSpan.FromSeconds(timeOut)) 
.Until(ExpectedConditions 
.InvisibilityOfElementLocated((By.Id("old Element Id")))); 

Sie können ExpectedElements docs überprüfen here

Verwandte Themen