WebDriver actualiza la página web cuando espera una condición específica

154

Estoy buscando una forma más elegante de actualizar la página web durante las pruebas (uso Selenium2). Acabo de enviar la clave F5, pero me pregunto si el controlador tiene un método para actualizar toda la página web. Aquí está mi código

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

Quizás sea una mejor solución para encontrar elementos en una página actualizada manualmente

pbaranski
fuente

Respuestas:

294

En Java o JavaScript:

driver.navigate().refresh();

Esto debería actualizar la página.

Manpreet Singh
fuente
¡Alegre! Te ha ayudado. Alternativamente, si está utilizando puramente selenio RC o un WebDriverBackedSelenium, también puede usar: selenium.refresh ();
Manpreet Singh
47
Sin embargo, no es exactamente equivalente a presionar F5. driver.navigate().refresh()en su encabezado de solicitud dice "no-cache" y, como resultado, recarga incondicionalmente todo el contenido. Mientras que presionar F5 podría dar como resultado una solicitud "If-Modified-Since", podría obtener una respuesta "304 Not Modified". Debe tener en cuenta esa diferencia si realiza pruebas de carga.
Vsevolod Golovanov
@Manpreet Gracias por la solución. Es digno de votar.
RNS
75

En Python hay un método para hacer esto: driver.refresh() . Puede que no sea lo mismo en Java.

Alternativamente, podría driver.get("http://foo.bar");hacerlo, aunque creo que el método de actualización debería funcionar bien.

Isaac
fuente
1
Si está utilizando driver.get("http://foo.bar")might, simplemente usedriver.get(driver.current_url)
Matt M.
54

En pitón

Usando el método incorporado

driver.refresh()

o, ejecutando JavaScript

driver.execute_script("location.reload()")
Md. Nazmul Haque Sarker
fuente
¿Cómo podemos actualizar las páginas modales?
Hamed baziyad
21

5 formas diferentes de actualizar una página web utilizando Selenium Webdriver

No hay codificación adicional especial. Acabo de usar las funciones existentes de diferentes maneras para que funcione. Aquí están :

  1. Usando el método sendKeys.Keys

    driver.get("https://accounts.google.com/SignUp");
    driver.findElement(By.id("firstname-placeholder")).sendKeys(Keys.F5);
    
  2. Usando el método navigation.refresh ()

    driver.get("https://accounts.google.com/SignUp");  
    driver.navigate().refresh();
    
  3. Usando el método navigation.to ()

    driver.get("https://accounts.google.com/SignUp");  
    driver.navigate().to(driver.getCurrentUrl());
    
  4. Usando el método get ()

    driver.get("https://accounts.google.com/SignUp");  
    driver.get(driver.getCurrentUrl());
    
  5. Usando el método sendKeys ()

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

Encontró varios enfoques para actualizar la aplicación en 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)");

Para el código en vivo, consulte el enlace http://www.ufthelp.com/2014/11/Methods-Browser-Refresh-Selenium.html

AugustRush
fuente
1
¡Agradable! Múltiples formas de hacerlo. findElement (By.id ("Contáctenos")) no es una buena manera. El elemento más confiable siempre presente es bueno, por ejemplo: '/ html / body'. ¿Funciona esto para una actualización dura? y si la página tiene datos de publicación, se sabe que firefox muestra el diálogo de datos de publicación.
mrtipale
11

Aquí está la versión de C # ligeramente diferente:

driver.Navigate().Refresh();
dmeehan
fuente
5

Alternativa para la actualización de página (F5)

driver.navigate().refresh();

(o)

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

Una cosa importante a tener en cuenta es que la llamada driver.navigate (). Refresh () a veces parece ser asíncrona, lo que significa que no espera a que finalice la actualización, simplemente "inicia la actualización" y no bloquea la ejecución posterior mientras el navegador está recargando la página.

Si bien esto solo parece suceder en una minoría de casos, pensamos que es mejor asegurarse de que esto funcione al 100% agregando una verificación manual si la página realmente comenzó a recargarse.

Aquí está el código que escribí para eso en nuestra clase de objeto de página 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();
}

Algunas notas:

  • Como está volviendo a cargar la página, no puede simplemente verificar la existencia de un elemento dado, porque el elemento estará allí antes de que comience la recarga y después de que también se haya completado. Entonces, a veces puede ser cierto, pero la página ni siquiera comenzó a cargarse todavía.
  • Cuando la página se vuelve a cargar, la comprobación de WebElement.isDisplayed () arrojará una StaleElementReferenceException. El resto es solo para cubrir todas las bases.
  • getName (): método interno que obtiene el nombre de la página
  • getMaximumLoadTime (): método interno que devuelve cuánto tiempo se debe permitir que la página se cargue en segundos
  • verificar (): el método interno asegura que la página se cargue realmente

Nuevamente, en la gran mayoría de los casos, el bucle do / while se ejecuta una sola vez porque el código más allá de navegar (). Refresh () no se ejecuta hasta que el navegador vuelve a cargar la página por completo, pero hemos visto casos en los que En realidad, lleva unos segundos atravesar ese ciclo porque el navegador (). refresh () no se bloqueó hasta que el navegador terminó de cargarse.

Mac
fuente
La respuesta con verdadero valor ... Gracias.
Ogmios
3

También puedes probar

Driver.Instance.Navigate().Refresh();
usuario5320606
fuente
2

También hay un caso en el que desea actualizar solo un iframe específico en la página y no la página completa.

Lo que haces es lo siguiente:

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

En PHP:

$driver->navigate()->refresh();
MegaCasper
fuente
1

Otra forma de actualizar la página actual usando selenio en Java.

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

Usar esto actualizará la página actual, como hacer clic en la barra de direcciones del navegador y presionar enter.

RyanskyHeisenberg
fuente
1

En R puede usar el método de actualización, pero para comenzar navegamos a una url usando el método de navegación:

remDr$navigate("https://...")
remDr$refresh()
Tiago Martins Peres 李大仁
fuente