Ich möchte sicherstellen, dass ein Element vorhanden ist, bevor der Webdriver anfängt, Dinge zu tun.
Ich versuche so etwas zum Laufen zu bringen:
WebDriverWait wait = new WebDriverWait(driver, new TimeSpan(0,0,5));
wait.Until(By.Id("login"));
Ich habe hauptsächlich Probleme damit, die beliebige Funktion einzurichten.
TimeSpan.FromSeconds(5)
. Es macht es klarer IMOAntworten:
Alternativ können Sie implizites Warten verwenden:
quelle
Driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
Die Verwendung der von Mike Kwan bereitgestellten Lösung kann sich auf die Gesamttestleistung auswirken, da das implizite Warten in allen FindElement-Aufrufen verwendet wird. Oft möchten Sie, dass das FindElement sofort fehlschlägt, wenn ein Element nicht vorhanden ist (Sie testen auf eine fehlerhafte Seite, fehlende Elemente usw.). Mit dem impliziten Warten würden diese Operationen warten, bis das gesamte Zeitlimit abgelaufen ist, bevor die Ausnahme ausgelöst wird. Die implizite Standardwartezeit ist auf 0 Sekunden festgelegt.
Ich habe eine kleine Erweiterungsmethode für IWebDriver geschrieben, die der
FindElement()
Methode einen Timeout-Parameter (in Sekunden) hinzufügt . Es ist ziemlich selbsterklärend:Ich habe das WebDriverWait-Objekt nicht zwischengespeichert, da seine Erstellung sehr billig ist. Diese Erweiterung kann gleichzeitig für verschiedene WebDriver-Objekte verwendet werden, und ich mache Optimierungen nur, wenn sie letztendlich benötigt werden.
Die Verwendung ist unkompliziert:
quelle
WebDriverWait
sind aus demOpenQA.Selenium.Support.UI
Namespace und kommt in einem separaten Paket namensSelenium WebDriver Support Classes
NuGetSelenium WebDriver Support Classes
ist jetzt auf NuGet als "Selenium.Support" erschienen , aktuelle Version ist 3.4.0return wait.Until(ExpectedConditions.ElementToBeClickable(by));
und sie funktioniert jetzt großartig. Heads up für den Fall, dass jemand andere zufällige Elemente erhält, die noch nicht gefunden wurden.Sie können auch verwenden
ExpectedConditions.ElementExists
Sie werden also nach einer solchen Elementverfügbarkeit suchen
Quelle
quelle
DotNetSeleniumExtras.WaitHelpers
(von @Dejan oben genannte) "nicht beibehalten wird, Probleme nicht behoben werden, PRs nicht akzeptiert werden". (Quelle: github.com/SeleniumHQ/selenium/issues/… ). Sein Verlag sucht einen Betreuer, der es von ihm übernimmt.Hier ist eine Variation der @ Loudenvier-Lösung, mit der auch mehrere Elemente abgerufen werden können:
quelle
Inspiriert von Loudenviers Lösung, ist hier eine Erweiterungsmethode, die für alle ISearchContext-Objekte funktioniert, nicht nur für IWebDriver, eine Spezialisierung der ersteren. Diese Methode unterstützt auch das Warten, bis das Element angezeigt wird.
Anwendungsbeispiel:
quelle
_webDriver.Manage().Timeouts().ImplicitlyWait(Timeout);
, wird der hier festgelegte Zeitlimitwert immer noch übertroffen.Stopwatch
der Erweiterungsmethode einenConsole.WriteLine()
Rundum- Aufruf hinzugefügt und einen innerhalb des Lambda an gesendetUntil()
. Die Stoppuhr maß fast genau 60 Sekunden und es wurde nur eine Nachricht geschriebenConsole
. Vermisse ich hier etwas?Ich habe jede Funktion mit Prädikat verwechselt. Hier ist eine kleine Hilfsmethode:
quelle
Sie können so etwas in C # herausfinden.
Das habe ich in JUnit - Selenium verwendet
Importieren Sie verwandte Pakete
quelle
quelle
quelle
Der Befehl clickAndWait wird nicht konvertiert, wenn Sie das Webdriver-Format in der Selenium-IDE auswählen. Hier ist die Problemumgehung. Fügen Sie die Warteschlange unten hinzu. Realistisch gesehen war das Problem das Klicken oder Ereignis, das vor dieser einzeiligen Zeile 1 in meinem C # -Code aufgetreten ist. Stellen Sie jedoch vor jeder Aktion, bei der Sie auf ein "By" -Objekt verweisen, sicher, dass Sie über ein WaitForElement verfügen.
HTML Quelltext:
C # / NUnit-Code:
quelle
Python:
Bei EC können Sie auch andere Bedingungen auswählen: http://selenium-python.readthedocs.org/api.html#module-selenium.webdriver.support.expected_conditions
quelle
Versuchen Sie diesen Code:
quelle
Explizites Warten
Beispiel:
quelle
Verwendete Rn222 und Aknuds1, um einen ISearchContext zu verwenden, der entweder ein einzelnes Element oder eine Liste zurückgibt. Und eine Mindestanzahl von Elementen kann angegeben werden:
Anwendungsbeispiel:
quelle
Sie möchten nicht zu lange warten, bis sich das Element ändert. In diesem Code wartet der Webdriver bis zu 2 Sekunden, bevor er fortfährt.
quelle
Da ich Seitenelementdefinitionen und Seitentestszenarien mit bereits gefundenem IWebElement für die Sichtbarkeit trenne, kann dies folgendermaßen erfolgen:
quelle
Dies ist die wiederverwendbare Funktion, um mit Explicit Wait auf ein im DOM vorhandenes Element zu warten.
quelle
Das können wir so erreichen:
quelle
WebDriverWait
wird nicht wirksam.Dies würde sofort eine Ausnahme auslösen, sobald die Seite "interaktiv" ist. Ich weiß nicht warum, aber das Timeout wirkt so, als ob es nicht existiert.
Funktioniert vielleicht,
SeleniumExtras.WaitHelpers
aber ich habe es nicht versucht. Es ist offiziell, wurde aber in ein anderes Nuget-Paket aufgeteilt. Sie können sich auf C # Selenium 'ExpectedConditions is obsolet' beziehen .Ich selbst benutze
FindElements
und überprüfe, obCount == 0
, wenn wahr, verwendenawait Task.Delay
. Es ist wirklich nicht ganz effizient.quelle
Sie können Folgendes verwenden
quelle
Ich sehe bereits mehrere Lösungen, die großartig funktionieren! Für den Fall, dass jemand etwas anderes benötigt, dachte ich, ich würde zwei Lösungen veröffentlichen, die ich persönlich in Selen C # verwendet habe, um zu testen, ob ein Element vorhanden ist! Hoffe es hilft, Prost!
Hier ist der zweite
quelle
quelle
Die erste Antwort ist gut. Mein Problem war, dass nicht behandelte Ausnahmen den Web-Treiber nicht richtig schlossen und der erste Wert, den ich verwendet hatte, 1 Sekunde betrug.
Wenn Sie das gleiche Problem bekommen
restart you visual studio
und stellen Sie sicher, dassall the exceptions are handled
richtig.quelle
War auf der Suche, wie man in Selen auf Zustand wartet, ist in diesem Thread gelandet und hier ist, was ich jetzt benutze:
ReadCell(row, col) != ""
kann jede Bedingung sein. So, weil:quelle