Was ist die alternative zum Gewinde.Schlafen bei der Arbeit mit Selen im system testen?
Ich habe eine TestMethod mit Selen als unten:
[TestMethod]
public void ShouldSendPasswordReminder()
{
//go to loginregister url
_fireFoxWebDriver.Navigate().GoToUrl(UkPaBaseUrl + "loginregister.aspx");
Thread.Sleep(1000);
//click the forgotten password
_fireFoxWebDriver.FindElement(By.LinkText("Forgotten your password?")).Click();
Thread.Sleep(1000);
//enter your email address
_fireFoxWebDriver.FindElement(By.Id("PasswordResetRequest1_PasswordResetRequest_Username"))
.SendKeys("[email protected]");
Thread.Sleep(1000);
//click submit
_fireFoxWebDriver.FindElement(By.Id("PasswordResetRequest1_PasswordResetRequest_PasswordResetRequestSubmit")).Click();
Thread.Sleep(5000);
//assert
Assert.IsTrue(_fireFoxWebDriver.Url.Contains("ThankYou"));
}
Wie Sie sehen können, würde ich den Aufruf-Thread.Schlaf viele Male (weil die Seite kann einige Zeit dauern, um abzuschließen, was es tut, durch javascript, etc) fast nach jeder Aktion, weil Selen nicht zu sein scheinen in der Lage zu handhaben-Seite geladen und Verzögerungen, die im Gegensatz zu WatiN.
Dies macht den code eher hässlich und nicht sehr zuverlässig.
Was ist der bessere Weg, um solche Szenarien? Schreibst du häufiger Threads.Schlaf-Anrufe " in den tests als gut?
Dank,
- dies scheint zu sein, die gleiche Frage in stackoverflow.com/questions/5868439/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnten Sie verwalten, die Funktion der base-line Zeit, die Sie wollen
FindElement()
zu warten, bevor er die:Explizite warten.
Nach offiziellen Dokumentation (http://www.seleniumhq.org/docs/0...), Thread.sleep() ist der Schlimmste Fall von expliziten warten.
In expliziten warten, ohne zu warten, für die maximale Zeit, um über, er geht über, sobald die Bedingung Eintritt, wenn diese Bedingung tritt ein, bevor die angegebene maximale Zeit wird über. Daher warten müssen, bis die maximale Zeit (weil die Bedingung nicht auftreten, während der angegebenen maximalen Zeit) ist der Schlimmste Fall von expliziten warten.
Ich denke Thread.sleep() ist als der Schlimmste Fall von expliziten warten, weil, für den Thread.sleep(), es hat zu warten, für die volle Zeit, spezifiziert als das argument des Thread.sleep(), bevor Sie fortfahren.
Können Sie denken, warum Thread.sleep() ist nicht implizit warten. Ich denke, das ist, weil die Wirkung des Threads.sleep() ist nur an der Stelle, wo es geschrieben ist, wie die explizite warten. Wirkung von impliziten warten, jedoch ist für die gesamte Lebensdauer der Treiber-Instanz.
Dieser wartet bis zu 10 Sekunden vor dem Wurf eine TimeoutException oder wenn es feststellt, dass das element wird ein Rückgaberecht von 0 - 10 Sekunden.
Mein Beispielcode, mein test Fall wollte mich zu warten, für ein maximum von 10 Sekunden, früher wurde ich in der Wartezeit für 10 Sekunden zu finden, bevor meine nächste element mit Gewinde.Schlafen. Ich benutze jetzt die WebDriverWait also, wenn das element gefunden wird, es geht, das beschleunigt meine tägliche Arbeit und spart auch Zeit.
Meine Allgemeine Heuristik bei der Einführung zu Verzögerungen, wenn mein Skript wird schneller als meine app, um wirklich darüber nachzudenken, was ich erwarte. Meiner Meinung nach, zu schlafen Art Anrufe sind wirklich nur geeignet in Fällen, wo bin ich eigentlich warten auf die Zeit zu vergehen. Ein Fall, wo ich war testen eine automatische timeout sinnvoll ist, Sie zu haben einen Thread.Schlaf-Typ nennen, denn ich bin eigentlich wartet für eine bestimmte Zeit verstreichen. In der Regel, jedoch warte ich für andere Dinge auftreten - Seiten zu laden, javascript ausführen, usw. In diesen Fällen, zu warten, für einen festgelegten Zeitraum ist eine einfache Möglichkeit, um zu scheinen, um Vergangenheit, die potenziell zu größerer Komplexität, zu überprüfen, für was hab ich eigentlich nur gewartet. Dies hat mehrere Fallstricke, aber Sie kann verlangsamt werden, Ihre tests zu viel (was, wenn jeder Ihrer wartet, nur oben sein musste 200ms, zum Beispiel - jetzt noch das kurze snippet oben eine zusätzliche 2,5 Sekunden (und das ohne Anpassung der 5 Sekunden Wartezeit am Ende). Dass kann nicht scheinen, wie viel von sich selbst, aber es fügt sich als Ihre suite wird größer.) Ein anderes Problem passiert, wenn Sie zu einem langsameren Maschinen oder der Umwelt die Dinge verlangsamen Ihre app - was ist, wenn es dauerte 1,5 Sekunden, bevor Sie klicken können, die Ihr Kennwort Vergessen? link auf einer Maschine. Ihr test ausfallen würde, aber das kann sich noch innerhalb der akzeptablen Leistung der Schwellenwerte für Ihre app, so haben Sie jetzt ein falscher Fehler. Dies ist oft behandelt, einfach durch die Erhöhung der Wartezeit, aber das führt zurück auf die erste Falle ich wieder erwähnt.
Brechen aus diesem Kreislauf, ich finde es sehr wichtig, so spezifisch wie möglich, wenn ich warte auf die Dinge. Selen stellt einen Wait-Klasse, die verwendet werden können, zu warten, bis eine bestimmte Bedingung erfüllt ist. Ich weiß nicht, ob die .Net-Bindungen enthalten, aber ich würde gehen in mit Ihnen es erwartet. In der Ruby-version, die wir geben, Warten Sie einen code-block - es Aussehen kann, für das Vorhandensein eines Elements oder was wir sonst brauchen, um zu überprüfen. Die wait-Methode nimmt ein timeout-Wert und einem Intervall-Wert und führt dann den block alle interval Sekunden, bis der block den Wert true zurückgibt oder die timeout-Zeit verstrichen ist. Die Einrichtung einer Klasse wie dieser ermöglicht Ihnen, Ihre timeout-Werte hoch genug, um das untere Ende der performance-Skala aber nicht entstehen, weil die Strafe zu warten, viel länger, als Sie wirklich brauchen, um in einer bestimmten ausführen.