Seite aktualisieren mit Selenium Webtreiber

โšก Intelligente Zusammenfassung

Eine Seite neu laden in Selenium WebDriver lรคdt den aktuellen URL sodass jedes Element gerendert wird, bevor die Assertions ausgefรผhrt werden, und das Framework bietet fรผnf verschiedene Befehle, die auf unterschiedliche Weise das gleiche Neuladen erreichen.

  • ๐Ÿ”˜ Standardauswahl: driver.navigate().refresh() ist die integrierte Neuladefunktion, die keine Argumente benรถtigt und keinen Wert zurรผckgibt.
  • โ˜‘๏ธ Rekursive Varianten: Wenn man getCurrentUrl() an get() oder navigate().to() รผbergibt, wird dieselbe Adresse erneut geladen.
  • โœ… Tastaturroute: sendKeys akzeptiert Keys.F5 oder den Unicode-Wert \uE035, muss aber auf ein reales Element abzielen.
  • ๐Ÿงช Skriptroute: JavascriptDer Executor, der location.reload() ausfรผhrt, funktioniert auch dann, wenn der WebDriver-Befehl blockiert ist.
  • ๏ธ Nach dem Neuladen: Alle zuvor erfassten Elementreferenzen sind veraltet und mรผssen erneut ermittelt werden.
  • ๐Ÿ“Š Modernes Setup: Selenium Der Manager wurde in Version 4.6 eingefรผhrt, sodass der Treiberpfad nicht mehr manuell festgelegt werden muss.

Seite aktualisieren mit Selenium WebDriver-Befehle

Bei der Testautomatisierung einer webbasierten Anwendung ist es oft erforderlich, die Seite mehrmals zu aktualisieren, damit alle Webelemente vollstรคndig geladen werden. Beim ersten Seitenaufruf werden mรถglicherweise bereits einige Webelemente geladen, wรคhrend ein zweiter Seitenaufruf nรถtig ist, um alle anzuzeigen. Dies kann mithilfe des bereitgestellten Aktualisierungsbefehls erfolgen. Selenium WebDriver.

So aktualisieren Sie die Seite in Selenium

Der Browser-Aktualisierungsvorgang kann auf folgende Weise durchgefรผhrt werden: Selenium. Wir werden die unten genannten Mรถglichkeiten im Laufe des Artikels ausfรผhrlich besprechen.

  1. Befehl driver.navigate().refresh()
  2. Methode abrufen
  3. Befehl โ€žTasten sendenโ€œ.
  4. Navigate-Methode
  5. driver.navigate().to() Befehl

1) Befehl driver.navigate().refresh()

Dies ist die integrierte Methode zum Durchfรผhren einer Seitenaktualisierung, die von Selenium WebDriver. Dieser Befehl ist der am hรคufigsten verwendete Befehl in der Testautomatisierung, um eine Seitenaktualisierung durchzufรผhren. Die Aktualisierung kann, wie unten beschrieben, auf einfache Weise erfolgen.

driver.get("https://demo.guru99.com/selenium/guru99home/");
driver.navigate().refresh();

Die Navigation ist eine Schnittstelle, รผber die verschiedene Browseroperationen ausgefรผhrt werden kรถnnen, wie z. B. das Navigieren zur vorherigen oder nรคchsten Seite, das Aktualisieren der Seite und das SchlieรŸen des Browsers. Die Methoden der Navigationsschnittstelle kรถnnen mit dem Befehl `driver.navigate()` aufgerufen werden. Die `refresh`-Methode der Navigationsschnittstelle benรถtigt keine Argumente und gibt keinen Wert zurรผck.

Ejemplo:

Testszenario:

  1. ร–ffnen Sie den Chrome-Browser mit der Webseite https://demo.guru99.com/selenium/guru99home/
  2. Sobald die Seite erfolgreich geladen wurde, aktualisieren Sie die Webseite mit der Methode driver.navigate().refresh().
  3. SchlieรŸen Sie den Browser mit der Methode driver.close().

Code

package Guru99Demo;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class RefreshDemo {
public static void main(String args[]) throws InterruptedException
{
System.setProperty("webdriver.chrome.driver", "D:\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.get("https://demo.guru99.com/selenium/guru99home/");
driver.manage().window().maximize();
driver.navigate().refresh();
driver.close();
}
}

โš ๏ธ Versionshinweis: Selenium Manager wurde mitgeliefert Selenium 4.6 und lรคdt den passenden Browsertreiber automatisch herunter, sodass die obige Zeile System.setProperty in der aktuellen Version nicht mehr erforderlich ist. new ChromeDriver() ist ausreichend. Die ursprรผngliche Zeile wird beibehalten, da sie fรผr die Selenium Das Beispiel wurde anhand des 3-Stil-Setups geschrieben.

Code Ausgang:

Beim ersten Laden der Seite wird die Demo-Startseite wie unten dargestellt gerendert.

Guru99 Demo-Startseite beim ersten Laden, bevor der Aktualisierungsbefehl ausgefรผhrt wird

Nach dem Neuladen der Seite hat sich das Video auf der Seite geรคndert, was bestรคtigt, dass das Neuladen tatsรคchlich stattgefunden hat.

Guru99 Demo-Startseite nach driver.navigate().refresh() zeigt ein anderes Video an

Es gibt mehrere weitere Mรถglichkeiten, eine Seite zu aktualisieren.

Die Aktualisierungsmethode ist nicht der einzige Weg, um die Seite neu zu laden. Die vier folgenden Techniken fรผhren zum gleichen Ergebnis und sind bekannt, da eine restriktive Anwendung oder ein widerspenstiger Browser gelegentlich eine davon blockiert.

2) Get-Methode

Die get-Methode kann rekursiv verwendet werden, um eine Seite zu aktualisieren. Dazu muss der get-Methode eine andere Methode als Argument รผbergeben werden.

Ejemplo:

driver.get("https://www.guru99.com");
driver.get(driver.getCurrentUrl());

3) Navigationsmethode

Diese Methode verwendet dasselbe Konzept der Rekursion wie oben beschrieben. Die Methode getCurrentUrl() wird als Argument an die Methode driver.navigate().to() รผbergeben.

Ejemplo:

driver.get("https://www.guru99.com");
driver.navigate().to(driver.getCurrentUrl());

4) Methode zum Senden von Tasten mithilfe der F5-Taste

Dies ist die zweithรคufigste Methode zum Aktualisieren einer Seite SeleniumDie Methode `sendKeys` erwartet die Aktualisierungstaste (F5) als Argument. Da `sendKeys` nur auf Webelementen und nicht auf dem Browser selbst funktioniert, muss zunรคchst ein gรผltiges Webelement auf der Webseite identifiziert werden, bevor die Methode aufgerufen werden kann. Dies kann wie unten gezeigt erfolgen.

Ejemplo:

driver.get("https://www.guru99.com");
driver.findElement(By.id("username")).sendKeys(Keys.F5);

Da der Tastendruck an ein Element und nicht an die Browseroberflรคche รผbermittelt wird, ist dieser Weg davon abhรคngig, dass das Element den Fokus hat. Wenn der Locator Wenn ein Feld gefunden wird, das nicht den Fokus erhalten kann, wird die Taste verschluckt und die Seite wird nicht neu geladen.

5) Methode zum Senden von Tasten mittels ASCII Code

Diese Methode basiert auf demselben Prinzip wie oben, รผbergibt aber anstelle der F5-Taste den Codepunkt der Aktualisierungstaste. Dies lรคsst sich wie folgt realisieren.

driver.get("https://www.guru99.com");
driver.findElement(By.id("username")).sendKeys("\uE035");

Der Wert \uE035 ist der WebDriver-Unicode-Codepunkt, den das Protokoll auf F5 abbildet, daher sind dieser Codeausschnitt und der vorherige รคquivalent.

So aktualisieren Sie eine Seite mit JavaSkriptExecutor

Jeder Browser stellt Seitenskripten eine Reload-Funktion zur Verfรผgung, und Selenium kann es รผber die JavascriptExecutor-Schnittstelle. Dies ist die รผbliche Ausweichlรถsung, wenn der WebDriver-Aktualisierungsbefehl von der Anwendung oder einer Browsererweiterung abgefangen wird.

JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("location.reload();");

Zwei Varianten sind es wert, beachtet zu werden:

  1. location.reload() Fรผhrt ein normales Neuladen durch und liefert die Seite gegebenenfalls aus dem Cache.
  2. history.go(0) ist ein รคlteres ร„quivalent, das von einigen Legacy-Suiten noch verwendet wird.

Die Executor-Route lรคuft innerhalb der Seite und wartet daher nicht selbststรคndig auf das neue Dokument. Fรผgen Sie anschlieรŸend eine explizite Wartezeit ein, genau wie nach `driver.navigate().refresh()`, und beachten Sie, dass ein skriptgesteuertes Neuladen einen Dialog auf Browserebene nicht lรถscht. Lรคdt die zu testende Anwendung ihre Inhalte asynchron, gilt dieselbe Vorgehensweise wie bei โ€ฆ Verarbeitung von AJAX-Aufrufen in Selenium WebTreiber.

Wie man eine StaleElementReferenceException nach einer Aktualisierung vermeidet

Durch das Neuladen der Seite wird das aktuelle DOM zerstรถrt und ein neues erstellt. Alle vor dem Neuladen erfassten WebElemente verweisen nun auf einen Knoten, der nicht mehr existiert. Daher lรถst der nรคchste Aufruf dieser Elemente eine StaleElementReferenceException aus. Dies ist der hรคufigste Fehler nach einem Seitenneuladen.

Drei Gewohnheiten beseitigen fast alle diese Misserfolge:

  1. Lokalisieren Sie erst danach, niemals vorher. Speichern Sie den By-Locator anstelle des WebElement und rufen Sie findElement erneut auf, sobald das Neuladen abgeschlossen ist.
  2. Warten Sie auf ein echtes Signal. Ein explizites Warten auf die Sichtbarkeit eines Elements, das erst nach dem Neuladen existiert, ist weitaus zuverlรคssiger als ein festes Warten.
  3. Aktualisieren Sie die Seite und lesen Sie die Informationen erneut. รœbertragen Sie niemals einen Textwert oder ein Attribut, das vor dem Neuladen erfasst wurde, in eine anschlieรŸend durchgefรผhrte Assertion.

Das folgende Muster trifft auf alle drei zu:

WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
driver.navigate().refresh();
WebElement search = wait.until(
        ExpectedConditions.visibilityOfElementLocated(By.id("username")));
search.sendKeys("guru99");

WebDriverWait benรถtigt eine Dauer in Selenium 4, was eine ร„nderung gegenรผber dem in der vorherigen Version verwendeten Integer-Sekunden-Konstruktor darstellt. Selenium 3. Weiterfรผhrende Techniken zur Behebung dieser Fehler werden in unserem Leitfaden behandelt. Ausnahmebehandlung in Selenium.

Vergleich von Selenium Methoden zum Aktualisieren der Seite

Alle sechs Befehle laden die Seite neu, unterscheiden sich aber darin, wovon sie abhรคngen und wie sie fehlschlagen.

Methodik Kommt drauf an Neuladen รผber Wenn es die richtige Wahl ist
driver.navigate().refresh() Nichts extra Der Browser-Neuladebefehl Fast immer โ€“ die Standardeinstellung
driver.get(driver.getCurrentUrl()) Ein lesbarer Strom URL Eine neue Navigation Wenn Sie auch den Verlaufseintrag lรถschen mรถchten
driver.navigate().to(driver.getCurrentUrl()) Ein lesbarer Strom URL Eine neue Navigation Gleiches gilt wie oben, jedoch รผber die Navigationsschnittstelle geschrieben.
sendKeys(Keys.F5) Ein fokussierbares Element Ein Tastendruck Wenn Sie den Tastaturpfad absichtlich testen
sendKeys(โ€œ\uE035โ€) Ein fokussierbares Element Ein Tastendruck Identisch mit F5, geschrieben als Codepunkt
JavascriptExecutor location.reload() Skripting aktiviert Ein Seitenskript Wenn der WebDriver-Befehl blockiert ist

Beginnen Sie mit dem Aktualisierungsbefehl und wรคhlen Sie eine andere Zeile erst dann aus, wenn dies aus einem Ihnen bekannten Grund fehlschlรคgt. Die gleiche Reihenfolge gilt, wenn Sie Browserfenster maximieren oder verkleinern: Bevorzugen Sie den nativen WebDriver-Aufruf und behandeln Sie die Skriptroute als Fallback.

Hรคufig gestellte Fragen

Das kann vorkommen. Wenn die aktuelle Seite per POST-Anfrage erzeugt wurde, fordert der Browser mรถglicherweise das erneute Senden der Daten an, und der Neuladevorgang verzรถgert sich aufgrund dieses Dialogfelds. Die Navigation zur Seite โ€ฆ URL Mit get() wird die Eingabeaufforderung erneut vollstรคndig vermieden.

Die Bindungsnamen unterscheiden sich, aber der Befehl ist derselbe: driver.refresh() in Pythondriver.Navigate().Refresh() in C# und driver.navigate().refresh() in JavaAlle drei geben die gleiche WebDriver-Anweisung aus.

Nein. Beim Neuladen bleiben Cookies, Sitzungsspeicher und lokaler Speicher fรผr dieselbe Herkunft erhalten. Daher ist das Neuladen keine gute Methode, um den Zustand zurรผckzusetzen. Lรถschen Sie stattdessen explizit die Cookies oder starten Sie eine neue Browsersitzung.

Selbstheilende Engines lรถsen einen Locator anhand mehrerer Attribute neu auf, wenn das neu geladene DOM nicht mehr รผbereinstimmt, und Fehleranalysemodelle gruppieren Fehler im Reload-Timing, sodass das Team nur eine Wartezeit anstatt fรผnfzig Tests beheben muss.

Ja, und der einzeilige Aktualisierungsaufruf ist ein Vorschlag, der zuverlรคssig funktioniert. Die anschlieรŸende Wartezeit ist jedoch der Punkt, an dem Vorschlรคge fehlerhaft sind. รœberprรผfen Sie daher jedes generierte Timeout anhand des tatsรคchlichen Ladeverhaltens der Anwendung.

Es gibt keinen dedizierten Befehl. Teams nรคhern sich einem solchen an, indem sie Strg und F5 gleichzeitig รผber die Actions-Klasse senden oder den Cache รผber die Browseroptionen deaktivieren, was die zuverlรคssigere Methode ist.

Nicht mit dem Aktualisierungsbefehl, der immer das oberste Dokument neu lรคdt. Wechseln Sie in den Frame und laden Sie ihn mit einem Skript neu oder setzen Sie sein Quellattribut zurรผck und wechseln Sie dann zurรผck zum Standardinhalt.

Verwenden Sie keine festen Wartezeiten. Warten Sie stattdessen explizit zehn bis dreiรŸig Sekunden auf eine Bedingung, die erst nach dem Neuladen erfรผllt ist, damit der Test fortgesetzt wird, sobald die Seite geladen ist.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: