webentwicklung-frage-antwort-db.com.de

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

Ich suche nach einer eleganteren Methode, um Webseiten während der Tests zu aktualisieren (ich verwende Selenium2). Ich sende nur die Taste F5, aber ich frage mich, 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

135
pbaranski

In Java oder JavaScript:

driver.navigate().refresh();

Dies sollte die Seite aktualisieren.

270
Manpreet Singh

In Python gibt es eine Methode, um dies zu tun: driver.refresh(). Es kann sein, dass es in Java nicht dasselbe ist.

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

57
Isaac

In Python

Verwendung der eingebauten Methode

driver.refresh()

oder Ausführen von JavaScript

driver.execute_script("location.reload()")

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, um es zum Laufen zu bringen. Hier sind sie :

  1. Verwenden Sie die sendKeys.Keys -Methode

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

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

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

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

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

Es wurden verschiedene Ansätze gefunden, um die Anwendung in Selen zu aktualisieren:

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)");

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

15
AugustRush

Hier ist die etwas andere C # -Version:

driver.Navigate().Refresh();
9
dmeehan

Alternative für Seitenaktualisierung (F5)

driver.navigate().refresh();

(oder)

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

Eine wichtige Sache 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 "abbricht" und die weitere Ausführung nicht blockiert während der Browser die Seite neu lädt.

Dies scheint nur in wenigen Fällen der Fall zu sein, wir haben jedoch herausgefunden, dass es besser ist, sicherzustellen, dass dies zu 100% funktioniert, indem eine manuelle Überprüfung hinzugefügt wird, ob das Neuladen der Seite tatsächlich begonnen hat.

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 nur überprüfen, ob ein bestimmtes Element vorhanden ist, da das Element dort vorhanden ist, bevor das Neuladen beginnt und nachdem es ebenfalls abgeschlossen ist. So kann es vorkommen, dass Sie auf die Wahrheit stoßen, aber die Seite wurde noch nicht einmal geladen.
  • Wenn die Seite neu geladen wird, löst das Aktivieren von WebElement.isDisplayed () eine StaleElementReferenceException aus. Der Rest soll nur alle Basen abdecken
  • getName (): interne Methode, die den Namen der Seite abruft
  • getMaximumLoadTime (): interne Methode, die zurückgibt, wie lange die Seite in Sekunden geladen werden darf
  • verify (): Die interne Methode stellt sicher, dass die Seite tatsächlich geladen wurde

In den allermeisten Fällen wird die do/while-Schleife ein einziges Mal ausgeführt, da der Code jenseits von navigate (). Refresh () erst ausgeführt wird, wenn der Browser die Seite tatsächlich vollständig neu geladen hat Es dauert tatsächlich Sekunden, um diese Schleife zu durchlaufen, da die Funktion navigate (). refresh () nicht blockiert wurde, bis der Browser den Ladevorgang beendet hat.

3
mac

Sie können es auch versuchen

Driver.Instance.Navigate().Refresh();
2
user5320606

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

Sie tun Folgendes:

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

In PHP:

$driver->navigate()->refresh();
0
MegaCasper

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); 

Mit dieser Option wird die aktuelle Seite aktualisiert, indem Sie auf die Adressleiste des Browsers klicken und die Eingabetaste drücken.

0