2016-05-10 4 views
1

ich ein Stück Code wieDefaultWait <T> .bis Verhalten für Polling

DefaultWait<IWebDriver> wait = new DefaultWait<IWebDriver>(driver); 
wait.PollingInterval = TimeSpan.FromMilliseconds(250); 
wait.Message = "Can't find element"; 
wait.Timeout = TimeSpan.FromSeconds(30); 
driver.Navigate().GotoUrl('.....'); 

IWebElement elem = wait.Until(x => x.FindElement(By.ClassName("abc"))); 

Nun sagen lässt, dass die URL ich navigiert nicht dieses Element enthält, mit einem Klassennamen „abc“.

Mein Verständnis von DefaultWait ist, dass es dieses Element finden soll, durch Abfrage alle 250 Millisekunden und Timeout nach 30 Sekunden. Aber ich sehe, dass es fast sofort zurückgibt, dass das Element nicht vorhanden ist oder eine Ausnahme auslöst.

Ich bin ein wenig verwirrt, weil technisch nach 10 Sekunden oder so das DOM hätte geändert werden können, um ein Element dieser Klasse zu schaffen, und die Wartezeit sollte erfolgreich sein/oder hätte erfolgreich sein können.

Also die Frage ist, was ist das Verhalten der DefaultWait? Sollte es bis zum angegebenen Timeout warten oder fehlt mir das Verhalten des DefaultWait vollständig?

+0

Dies ist die C# Implementierung? –

Antwort

2

Es ist am einfachsten, die ElementExists erwartete Bedingung damit umzugehen.

IWebElement elem = new WebDriverWait(Driver, TimeSpan.FromSeconds(30)) 
    .Until(ExpectedConditions.ElementExists(By.ClassName("abc")); 

Der Grund Ihr Beispiel ist nicht wie erwartet funktioniert, weil FindElement eine Ausnahme bei einem Fehler führt. Sie könnten Ihr Beispiel überarbeiten, um FindElements zu verwenden, was eine leere Auflistung zurückgibt, aber selbst dann müssten Sie Logik hinzufügen, um eine leere Auflistung zu behandeln, da DefaultWait.Until einen Nicht-Null-Rückgabewert als erfolgreich betrachtet.

Die einfachste Sache ist, die Logik zu benutzen, die in ExpectedConditions zur Verfügung gestellt wird, um das ganze schwere Anheben für Sie zu tun.

Das Standard-Abfrageintervall beträgt 500 ms. Sie können das Abfrageintervall festlegen, indem Sie den optionalen dritten Parameter wie folgt übergeben:

IWebElement elem = 
    new WebDriverWait(Driver, 
        TimeSpan.FromSeconds(30), // time out 
        TimeSpan.FromMilliseconds(250)) // polling interval 
    .Until(ExpectedConditions.ElementExists(By.ClassName("abc")); 
+0

Danke Paul. Schätzen Sie Ihre schnelle Hilfe. Was ist das Standardabfrageintervall in diesem Fall? Ich könnte natürlich meinen Standard-Kellner zur Konfiguration verwenden, aber ich frage mich, was das Standard-Abfrageintervall ist. – dgorti

+0

500ms. Aktualisierte Antwort mit Informationen darüber, wie Sie das ändern können. –

+0

:-) Super. Vielen Dank. – dgorti