Wie lässt du Selenium 2.0 auf das Laden der Seite warten?
java
selenium
webdriver
selenium-webdriver
karthick kumar
quelle
quelle
Antworten:
Sie können pageloaded auch mit dem folgenden Code überprüfen
quelle
Verwenden Sie die Klasse WebDriverWait
Siehe auch hier
Sie können erwarten, ein Element zu zeigen. so etwas wie in C #:
quelle
Wenn Sie die implizite Wartezeit des Treibers festlegen und dann die
findElement
Methode für ein Element aufrufen, von dem Sie erwarten, dass es sich auf der geladenen Seite befindet, fragt der WebDriver nach diesem Element, bis er das Element findet oder den Zeitlimitwert erreicht.Quelle: implizite Wartezeiten
quelle
Im Allgemeinen sollte der Webtreiber mit Selenium 2.0 die Kontrolle über den aufrufenden Code erst zurückgeben, wenn festgestellt wurde, dass die Seite geladen wurde. Wenn dies nicht der Fall ist, können Sie anrufen
waitforelemement
, wodurch der Anruf wiederholt wird,findelement
bis er gefunden wird oder eine Zeitüberschreitung auftritt (Zeitüberschreitung kann eingestellt werden).quelle
If click() causes a new page to be loaded via an event or is done by sending a native event (which is a common case on Firefox, IE on Windows) then the method will not wait for it to be loaded and the caller should verify that a new page has been loaded.
JavascriptExecutor
und darauf gewartet, dass document.readyState "vollständig" ist. Aufgrund der Hin- und Rückfahrt von Selen zum Browser wird der Rennzustand vermutlich gemildert, und dies funktioniert "immer" für mich. Nach "click ()", wenn ich erwarte, dass eine Seite geladen wird, warte ich explizit (mit WebDriverWait) auf den Readystate. ]Ruby-Implementierung:
quelle
Sie können die
System.out
Zeile entfernen . Es wird zu Debug-Zwecken hinzugefügt.quelle
Alle diese Lösungen sind für bestimmte Fälle in Ordnung, leiden jedoch unter mindestens einem von mehreren möglichen Problemen:
Sie sind nicht allgemein genug - sie möchten, dass Sie im Voraus wissen, dass eine bestimmte Bedingung für die Seite gilt, auf die Sie gehen (z. B. wird ein Element angezeigt).
Sie sind offen für eine Race-Bedingung, bei der Sie ein Element verwenden, das sowohl auf der alten als auch auf der neuen Seite vorhanden ist.
Hier ist mein Versuch einer generischen Lösung, die dieses Problem vermeidet (in Python):
Zunächst eine generische "Warte" -Funktion (verwenden Sie ein WebDriverWait, wenn Sie möchten, ich finde sie hässlich):
Als nächstes beruht die Lösung auf der Tatsache, dass Selen eine (interne) ID-Nummer für alle Elemente auf einer Seite aufzeichnet, einschließlich der obersten Ebene
<html>
Elements . Wenn eine Seite aktualisiert oder geladen wird, erhält sie ein neues HTML-Element mit einer neuen ID.Angenommen, Sie möchten auf einen Link mit dem Text "Mein Link" klicken, zum Beispiel:
Für mehr pythonische, wiederverwendbare, generische Hilfsmittel können Sie einen Kontextmanager erstellen:
Und dann können Sie es für so ziemlich jede Selen-Wechselwirkung verwenden:
Ich denke, das ist kugelsicher! Was denken Sie?
Mehr Infos in einem Blogbeitrag dazu hier
quelle
Sie können auch die Klasse verwenden:
ExpectedConditions
um explizit darauf zu warten, dass ein Element auf der Webseite angezeigt wird, bevor Sie weitere Aktionen ausführen könnenMit der
ExpectedConditions
Klasse können Sie feststellen, ob ein Element sichtbar ist:In der
ExpectedConditions class Javadoc
Liste finden Sie alle Bedingungen, die Sie überprüfen können.quelle
Dies scheint eine ernsthafte Einschränkung von WebDriver zu sein. Das Warten auf ein Element bedeutet natürlich nicht, dass die Seite geladen wird. Insbesondere kann das DOM vollständig erstellt werden (Onready-Status), wobei JS noch ausgeführt wird und CSS und Bilder noch geladen werden.
Ich glaube, die einfachste Lösung besteht darin, eine JS-Variable für das Onload-Ereignis festzulegen, nachdem alles initialisiert wurde, und diese JS-Variable in Selen zu überprüfen und auf sie zu warten.
quelle
Imrans Antwort für Java 7 erneut aufbereitet:
quelle
Wenn Sie auf das Laden eines bestimmten Elements warten möchten, können Sie die
isDisplayed()
Methode für Folgendes verwendenRenderedWebElement
:(Beispiel aus dem 5-Minuten-Handbuch Erste Schritte )
quelle
RenderedWebElement
in der API. DieisDisplayed()
Methode ist jetzt jedoch direkt auf verfügbarWebElement
.Warten Sie explizit oder bedingt in dieser Wartezeit, bis diese Bedingung erfüllt ist.
Dies wartet 60 Sekunden lang auf jedes Webelement.
Verwenden Sie implizit das Warten auf jedes Element auf der Seite bis zu dieser bestimmten Zeit.
Dies wartet 60 Sekunden lang auf jedes Webelement.
quelle
Verwenden Sie implizit das Warten auf jedes Element auf der Seite bis zur angegebenen Zeit.
Warten Sie 30 Sekunden lang auf jedes Element auf der Seite.
Eine weitere Wartezeit ist Explizites Warten oder bedingtes Warten in dieser Wartezeit bis zur gegebenen Bedingung.
Geben Sie in id die statische Element-ID an, die auf der Seite unterschiedlich angezeigt wird, sobald die Seite geladen wird.
quelle
Ich bin überrascht, dass Prädikate nicht die erste Wahl waren, da Sie normalerweise wissen, mit welchen Elementen Sie als Nächstes auf der Seite interagieren, auf die Sie warten. Mein Ansatz war es immer, Prädikate / Funktionen wie
waitForElementByID(String id)
undwaitForElemetVisibleByClass(String className)
usw. zu erstellen und diese dann zu verwenden und wiederzuverwenden, wo immer ich sie benötige, sei es zum Laden einer Seite oder zum Ändern des Seiteninhalts, auf den ich warte.Beispielsweise,
In meiner Testklasse:
In meiner Testklasse Eltern:
Obwohl dies viel zu sein scheint, müssen Sie wiederholt nachsehen, und das Intervall für die Überprüfungsdauer kann zusammen mit der endgültigen Wartezeit vor dem Timeout festgelegt werden. Außerdem werden Sie solche Methoden wiederverwenden.
In diesem Beispiel definiert die Elternklasse und initiiert das
WebDriver driver
und dasWebDriverWait driverWait
.Ich hoffe das hilft.
quelle
Der beste Weg, um auf das Laden von Seiten zu warten, wenn Sie die Java-Bindungen für WebDriver verwenden, ist die Verwendung des Seitenobjekt-Entwurfsmusters mit PageFactory. Dies ermöglicht es Ihnen, die zu nutzen
AjaxElementLocatorFactory
was einfach ausgedrückt als globales Warten auf alle Ihre Elemente fungiert. Es gibt Einschränkungen für Elemente wie Dropboxen oder komplexe Javascript-Übergänge, aber es reduziert die benötigte Codemenge drastisch und beschleunigt die Testzeiten. Ein gutes Beispiel finden Sie in diesem Blogpost. Grundlegendes Verständnis von Core Java wird vorausgesetzt.http://startingwithseleniumwebdriver.blogspot.ro/2015/02/wait-in-page-factory.html
quelle
NodeJS-Lösung:
In Nodejs können Sie es über Versprechen bekommen ...
Wenn Sie diesen Code schreiben, können Sie sicher sein, dass die Seite vollständig geladen ist, wenn Sie zum ...
Wenn Sie diesen Code schreiben, navigieren Sie und Selen wartet 3 Sekunden ...
Aus der Selendokumentation:
this.get (url) → Thenable
Plant einen Befehl zum Navigieren zur angegebenen URL.
Gibt ein Versprechen zurück, das aufgelöst wird, wenn das Dokument vollständig geladen wurde .
Selendokumentation (Nodejs)
quelle
Hier ist eine Java 8-Version der derzeit am besten bewerteten Antwort :
Wo
myDriver
ist einWebDriver
Objekt (früher deklariert).Hinweis : Beachten Sie, dass diese Methode (
document.readyState
) nur das DOM überprüft.quelle
Rufen Sie unten Funktion in Ihrem Skript auf, dies wartet, bis die Seite nicht mit Javascript geladen wird
quelle
Sie können vom Dokument zu einem Element wechseln, wenn nur ein Teil eines Dokuments geändert wird.
Diese Technik wurde von der Antwort von Sincebasic inspiriert.
quelle
SelenWaiter :
Und für Sie verwenden Sie es :
quelle
Mit der folgenden vorhandenen Methode können Sie die Zeit für pageeLoadTimeout im folgenden Beispiel festlegen. Wenn das Laden der Seite länger als 20 Sekunden dauert, wird eine Ausnahme beim erneuten Laden der Seite ausgelöst
quelle
Sie können explizit warten, bis ein Element auf der Webseite angezeigt wird, bevor Sie Maßnahmen ergreifen können (z. B. element.click ()).
Dies ist, was ich für ein ähnliches Szenario verwendet habe und es funktioniert gut.
quelle
Mein einfacher Weg:
quelle
Der beste Weg, den ich gesehen habe, ist die Nutzung der
stalenessOf
ExpectedCondition zu verwenden, um darauf zu warten, dass die alte Seite veraltet ist.Beispiel:
Es wird zehn Sekunden warten, bis das alte HTML-Tag veraltet ist, und dann eine Ausnahme auslösen, wenn dies nicht der Fall ist.
quelle
Ich benutze Node + Selenium-Webdriver (welche Version ist jetzt 3.5.0). was ich dafür mache ist:
quelle
Sie können wait verwenden. Grundsätzlich gibt es zwei Arten von Wartezeiten in Selen
- Implizites Warten
Dies ist sehr einfach, siehe Syntax unten:
- Explizites Warten
Warten Sie explizit oder bedingt, bis eine bestimmte Bedingung erfüllt ist.
Sie können wie andere Eigenschaften verwenden
visblityOf()
,visblityOfElement()
quelle
Wenn jemand Selenid verwendet:
Weitere Bedingungen finden Sie hier: http://selenide.org/javadoc/3.0/com/codeborne/selenide/Condition.html
quelle
In meinem Fall habe ich Folgendes verwendet, um den Seitenladestatus zu ermitteln. In unserer Anwendung sind GIFs zum Laden vorhanden, und ich höre sie wie folgt an, um unerwünschte Wartezeiten im Skript zu vermeiden.
Wo der xpath das GIF im HTML-DOM findet. Danach können Sie auch Ihre Aktionsmethoden implementieren. Klicken Sie auf.
quelle
Mann all diese Antworten erfordern zu viel Code. Dies sollte eine einfache Sache sein, da es ziemlich häufig ist.
Warum nicht einfach ein einfaches Javascript mit dem Webdriver injizieren und überprüfen. Dies ist die Methode, die ich in meiner Webscraper-Klasse verwende. Das Javascript ist ziemlich einfach, auch wenn Sie js nicht kennen.
quelle
Wie Selenium nach einem Klick auf das Laden der Seite wartet, bietet den folgenden interessanten Ansatz:
WebElement
von der alten Seite.WebElement
bisStaleElementReferenceException
die Kasse ausgelöst wird.Beispielcode:
quelle
new WebDriverWait(driver, 10).until(ExpectedConditions.stalenessOf(element))
.