Aktualisieren der Webseite durch WebDriver, wenn auf eine bestimmte Bedingung gewartet wird


154

Ich suche nach einer eleganteren Möglichkeit, die Webseite während der Tests zu aktualisieren (ich verwende Selenium2). Ich sende nur den F5-Schlüssel, frage mich aber, ob der Treiber eine Methode zum Aktualisieren der gesamten Webseite hat. Hier ist mein Code

    while(driver.findElements(By.xpath("//*[text() = 'READY']")).size() == 0 )
        driver.findElement(By.xpath("//body")).sendKeys(Keys.F5);
        //element appear after text READY is presented      
    driver.findElement(By.cssSelector("div.column a")).click();    

Vielleicht ist es eine bessere Lösung, um ein Element auf einer manuell aktualisierten Seite zu finden

Antworten:


294

In Java oder JavaScript:

driver.navigate().refresh();

Dies sollte die Seite aktualisieren.


Froh! es hat dir geholfen. Wenn Sie ausschließlich Selenium RC oder ein WebDriverBackedSelenium verwenden, können Sie alternativ auch Folgendes verwenden: selenium.refresh ();
Manpreet Singh

47
Dies entspricht jedoch nicht genau dem Drücken von F5. driver.navigate().refresh()In seinem Anforderungsheader steht "no-cache" und lädt daher bedingungslos den gesamten Inhalt neu. Während das Drücken von F5 zu einer "If-Modified-Since" -Anforderung führen kann, kann dies zu einer "304 Not Modified" -Antwort führen. Sie müssen diesen Unterschied berücksichtigen, wenn Sie Lasttests durchführen.
Wsewolod Golowanow

@Manpreet Danke für die Lösung. Es ist würdig zu stimmen.
RNS

75

In Python gibt es dafür eine Methode : driver.refresh(). In Java ist dies möglicherweise nicht dasselbe.

Alternativ könnten Sie driver.get("http://foo.bar");, obwohl ich denke, dass die Aktualisierungsmethode gut funktionieren sollte.


1
Wenn Sie verwenden, driver.get("http://foo.bar")können Sie auch einfach verwendendriver.get(driver.current_url)
Matt M.


21

5 verschiedene Möglichkeiten, eine Webseite mit Selenium Webdriver zu aktualisieren

Es gibt keine spezielle zusätzliche Codierung. Ich habe gerade die vorhandenen Funktionen auf verschiedene Arten verwendet, damit es funktioniert. Hier sind sie :

  1. Verwenden der sendKeys.Keys- Methode

    driver.get("https://accounts.google.com/SignUp");
    driver.findElement(By.id("firstname-placeholder")).sendKeys(Keys.F5);
    
  2. Verwenden der Methode navig.refresh ()

    driver.get("https://accounts.google.com/SignUp");  
    driver.navigate().refresh();
    
  3. Verwenden Sie die Methode navig.to ()

    driver.get("https://accounts.google.com/SignUp");  
    driver.navigate().to(driver.getCurrentUrl());
    
  4. Verwenden der Methode get ()

    driver.get("https://accounts.google.com/SignUp");  
    driver.get(driver.getCurrentUrl());
    
  5. Verwenden der sendKeys () -Methode

    driver.get("https://accounts.google.com/SignUp"); 
    driver.findElement(By.id("firstname-placeholder")).sendKeys("\uE035");
    

16

Verschiedene Ansätze zur Aktualisierung der Anwendung in Selen gefunden: -

1.driver.navigate().refresh();
2.driver.get(driver.getCurrentUrl());
3.driver.navigate().to(driver.getCurrentUrl());
4.driver.findElement(By.id("Contact-us")).sendKeys(Keys.F5); 
5.driver.executeScript("history.go(0)");

Live-Code finden Sie unter dem Link http://www.ufthelp.com/2014/11/Methods-Browser-Refresh-Selenium.html


1
Nett! mehrere Möglichkeiten, es zu tun. findElement (By.id ("Contact-us")) ist kein guter Weg. zuverlässigeres immer vorhandenes Element ist gut, zB: '/ html / body'. Funktioniert dies für eine harte Aktualisierung? und was ist, wenn die Seite Post-Daten enthält? Firefox zeigt bekanntermaßen den Post-Daten-Dialog an.
Mrtipale

11

Hier ist die etwas andere C # -Version:

driver.Navigate().Refresh();

5

Alternative für Seitenaktualisierung (F5)

driver.navigate().refresh();

(oder)

Actions actions = new Actions(driver);
actions.keyDown(Keys.CONTROL).sendKeys(Keys.F5).perform();

4

Eine wichtige Sache, die zu beachten ist, ist, dass der Aufruf von driver.navigate (). Refresh () manchmal asynchron zu sein scheint, was bedeutet, dass er nicht auf den Abschluss der Aktualisierung wartet, sondern nur "die Aktualisierung startet" und die weitere Ausführung nicht blockiert während der Browser die Seite neu lädt.

Obwohl dies nur in wenigen Fällen der Fall zu sein scheint, haben wir herausgefunden, dass es besser ist, sicherzustellen, dass dies zu 100% funktioniert, indem Sie eine manuelle Überprüfung hinzufügen, ob die Seite wirklich neu geladen wurde.

Hier ist der Code, den ich dafür in unserer Basisseitenobjektklasse geschrieben habe:

public void reload() {
    // remember reference to current html root element
    final WebElement htmlRoot = getDriver().findElement(By.tagName("html"));

    // the refresh seems to sometimes be asynchronous, so this sometimes just kicks off the refresh,
    // but doesn't actually wait for the fresh to finish
    getDriver().navigate().refresh();

    // verify page started reloading by checking that the html root is not present anymore
    final long startTime = System.currentTimeMillis();
    final long maxLoadTime = TimeUnit.SECONDS.toMillis(getMaximumLoadTime());
    boolean startedReloading = false;
    do {
        try {
            startedReloading = !htmlRoot.isDisplayed();
        } catch (ElementNotVisibleException | StaleElementReferenceException ex) {
            startedReloading = true;
        }
    } while (!startedReloading && (System.currentTimeMillis() - startTime < maxLoadTime));

    if (!startedReloading) {
        throw new IllegalStateException("Page " + getName() + " did not start reloading in " + maxLoadTime + "ms");
    }

    // verify page finished reloading
    verify();
}

Einige Notizen:

  • Da Sie die Seite neu laden, können Sie nicht einfach die Existenz eines bestimmten Elements überprüfen, da das Element dort ist, bevor das Neuladen beginnt und nachdem es auch abgeschlossen ist. Manchmal wird es also wahr, aber die Seite wurde noch nicht einmal geladen.
  • Wenn die Seite neu geladen wird, wird beim Überprüfen von WebElement.isDisplayed () eine StaleElementReferenceException ausgelöst. Der Rest soll nur alle Basen abdecken
  • getName (): Interne Methode, die den Namen der Seite abruft
  • getMaximumLoadTime (): Interne Methode, die zurückgibt, wie lange eine Seite in Sekunden geladen werden soll
  • verify (): Die interne Methode stellt sicher, dass die Seite tatsächlich geladen wird

Wiederum wird in den allermeisten Fällen die do / while-Schleife ein einziges Mal ausgeführt, da der Code jenseits von navig (). Refresh () erst ausgeführt wird, wenn der Browser die Seite tatsächlich vollständig neu geladen hat, aber wir haben Fälle gesehen, in denen Es dauert tatsächlich Sekunden, um diese Schleife zu durchlaufen, da navig (). refresh () nicht blockiert wurde, bis der Browser das Laden beendet hat.


Die Antwort mit echtem Wert ... Danke.
Ogmios


2

Es gibt auch einen Fall, in dem Sie nur einen bestimmten Iframe auf der Seite und nicht die gesamte Seite aktualisieren möchten.

Sie tun wie folgt:

public void refreshIFrameByJavaScriptExecutor(String iFrameId){
        String script= "document.getElementById('" + iFrameId+ "').src = " + "document.getElementById('" + iFrameId+ "').src";
       ((IJavaScriptExecutor)WebDriver).ExecuteScript(script);
}


1

Eine andere Möglichkeit, die aktuelle Seite mit Selen in Java zu aktualisieren.

//first: get the current URL in a String variable
String currentURL = driver.getCurrentUrl(); 
//second: call the current URL
driver.get(currentURL); 

Wenn Sie dies verwenden, wird die aktuelle Seite aktualisiert, indem Sie auf die Adressleiste des Browsers klicken und die Eingabetaste drücken.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.