Pagina Web di aggiornamento da WebDriver in attesa di una condizione specifica


154

Sto cercando un modo più elegante per aggiornare la pagina Web durante i test (utilizzo Selenium2). Ho appena inviato il tasto F5 ma mi chiedo se il driver ha un metodo per aggiornare l'intera pagina Web Ecco il mio codice

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

Forse è una soluzione migliore per trovare l'elemento nella pagina aggiornata manualmente

Risposte:


294

In Java o JavaScript:

driver.navigate().refresh();

Questo dovrebbe aggiornare la pagina.


Lieto! ti ha aiutato. In alternativa, se si utilizza RC puramente selenio o un WebDriverBackedSelenium è anche possibile utilizzare: selenium.refresh ();
Manpreet Singh,

47
Tuttavia, non è esattamente equivalente a premere F5. driver.navigate().refresh()nella sua intestazione della richiesta dice "no-cache" e, di conseguenza, ricarica incondizionatamente tutto il contenuto. Considerando che premendo F5 si potrebbe ottenere una richiesta "If-Modified-Since", che potrebbe ottenere una risposta "304 Not Modified". Devi tenere presente questa differenza, se esegui i test di carico.
Vsevolod Golovanov,

@Manpreet Grazie per la soluzione. Vale la pena votare.
RNS,

75

In Python esiste un metodo per fare questo: driver.refresh(). Potrebbe non essere lo stesso in Java.

In alternativa, potresti driver.get("http://foo.bar");, anche se penso che il metodo di aggiornamento dovrebbe funzionare bene.


1
Se stai usando driver.get("http://foo.bar")potresti anche usaredriver.get(driver.current_url)
Matt M.

54

In pitone

Utilizzando il metodo integrato

driver.refresh()

oppure, eseguendo JavaScript

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

Come possiamo aggiornare le pagine modali?
hamed baziyad,

21

5 modi diversi per aggiornare una pagina Web usando Selenium Webdriver

Non esiste una codifica extra speciale. Ho appena usato le funzioni esistenti in diversi modi per farlo funzionare. Eccoli :

  1. Utilizzando il metodo sendKeys.Keys

    driver.get("https://accounts.google.com/SignUp");
    driver.findElement(By.id("firstname-placeholder")).sendKeys(Keys.F5);
    
  2. Utilizzando il metodo navigate.refresh ()

    driver.get("https://accounts.google.com/SignUp");  
    driver.navigate().refresh();
    
  3. Usando il metodo navigate.to ()

    driver.get("https://accounts.google.com/SignUp");  
    driver.navigate().to(driver.getCurrentUrl());
    
  4. Usando il metodo get ()

    driver.get("https://accounts.google.com/SignUp");  
    driver.get(driver.getCurrentUrl());
    
  5. Utilizzando il metodo sendKeys ()

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

16

Trovati vari approcci per aggiornare l'applicazione in selenio: -

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

Per il codice live, consultare il link http://www.ufthelp.com/2014/11/Methods-Browser-Refresh-Selenium.html


1
Bello! modo multiplo per farlo. findElement (By.id ("Contattaci")) non è un buon metodo. più affidabile elemento sempre presente è buono, ad esempio: '/ html / body'. Funziona per l'aggiornamento fisico? e se la pagina contiene dati post, Firefox è noto per mostrare la finestra di dialogo dati post.
mrtipale

11

Ecco la versione leggermente diversa di C #:

driver.Navigate().Refresh();

5

Alternativo per Aggiornamento pagina (F5)

driver.navigate().refresh();

(o)

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

4

Una cosa importante da notare è che la chiamata driver.navigate (). Refresh () a volte sembra essere asincrona, il che significa che non attende il completamento dell'aggiornamento, ma semplicemente "avvia l'aggiornamento" e non blocca ulteriori esecuzioni mentre il browser ricarica la pagina.

Anche se questo sembra accadere solo in una minoranza di casi, abbiamo pensato che fosse meglio assicurarsi che funzionasse al 100% aggiungendo un controllo manuale se la pagina ha davvero iniziato a ricaricare.

Ecco il codice che ho scritto per questo nella nostra classe di oggetti della pagina di base:

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

Alcune note:

  • Dal momento che stai ricaricando la pagina, non puoi semplicemente controllare l'esistenza di un dato elemento, perché l'elemento sarà lì prima che inizi il ricaricamento e anche dopo che è stato fatto. Quindi a volte potresti diventare vero, ma la pagina non ha nemmeno iniziato a caricarsi.
  • Quando la pagina viene ricaricata, selezionando WebElement.isDisplayed () verrà generata una StaleElementReferenceException. Il resto è solo per coprire tutte le basi
  • getName (): metodo interno che ottiene il nome della pagina
  • getMaximumLoadTime (): metodo interno che restituisce la durata di caricamento della pagina in secondi
  • verifica (): il metodo interno assicura che la pagina sia effettivamente caricata

Ancora una volta, nella stragrande maggioranza dei casi, il ciclo do / while viene eseguito una sola volta perché il codice oltre la navigazione (). Refresh () non viene eseguito fino a quando il browser non ha ricaricato completamente la pagina, ma abbiamo visto casi in cui in realtà ci vogliono pochi secondi per passare attraverso quel ciclo perché la navigazione (). refresh () non si è bloccata fino al completamento del caricamento del browser.


La risposta con vero valore ... Grazie.
Ogmios,


2

C'è anche un caso in cui si desidera aggiornare solo iframe specifici nella pagina e non l'intera pagina.

Lo fai è il seguente:

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


1

Un altro modo per aggiornare la pagina corrente usando il selenio in Java.

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

L'utilizzo di questo aggiornerà la pagina corrente come facendo clic sulla barra degli indirizzi del browser e premendo invio.


1

In R puoi usare il metodo di aggiornamento, ma per iniziare navighiamo verso un url usando il metodo di navigazione:

remDr$navigate("https://...")
remDr$refresh()
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.