Actualisation de la page Web par WebDriver lors de l'attente d'une condition spécifique


154

Je recherche un moyen plus élégant de rafraîchir la page Web pendant les tests (j'utilise Selenium2). Je viens d'envoyer la clé F5 mais je me demande si le pilote a une méthode pour actualiser toute la page Web Voici mon 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();    

Peut-être est-ce une meilleure solution pour trouver un élément sur une page actualisée manuellement

Réponses:


294

En Java ou JavaScript:

driver.navigate().refresh();

Cela devrait rafraîchir la page.


Heureux! cela vous a aidé. Alternativement, si vous utilisez purement sélénium RC ou WebDriverBackedSelenium, vous pouvez également utiliser: selenium.refresh ();
Manpreet Singh

47
Ce n'est pas exactement équivalent à appuyer sur F5. driver.navigate().refresh()dans son en-tête de requête dit "no-cache" et, par conséquent, recharge inconditionnellement tout le contenu. Alors que le fait d'appuyer sur F5 pourrait entraîner une demande «If-Modified-Since», cela pourrait obtenir une réponse «304 Not Modified». Vous devez garder cette différence à l'esprit si vous effectuez des tests de charge.
Vsevolod Golovanov

@Manpreet Merci pour la solution. Il vaut la peine de voter pour.
RNS

75

En Python il y a une méthode pour ce faire: driver.refresh(). Ce n'est peut-être pas la même chose en Java.

Vous pouvez également driver.get("http://foo.bar");, bien que je pense que la méthode d'actualisation devrait fonctionner correctement.


1
Si vous utilisez, vous driver.get("http://foo.bar")pouvez aussi bien utiliserdriver.get(driver.current_url)
Matt M.


21

5 façons différentes d'actualiser une page Web à l'aide de Selenium Webdriver

Il n'y a pas de codage supplémentaire spécial. Je viens d'utiliser les fonctions existantes de différentes manières pour le faire fonctionner. Les voici :

  1. Utilisation de la méthode sendKeys.Keys

    driver.get("https://accounts.google.com/SignUp");
    driver.findElement(By.id("firstname-placeholder")).sendKeys(Keys.F5);
    
  2. Utilisation de la méthode navigate.refresh ()

    driver.get("https://accounts.google.com/SignUp");  
    driver.navigate().refresh();
    
  3. Utilisation de la méthode navigate.to ()

    driver.get("https://accounts.google.com/SignUp");  
    driver.navigate().to(driver.getCurrentUrl());
    
  4. Utilisation de la méthode get ()

    driver.get("https://accounts.google.com/SignUp");  
    driver.get(driver.getCurrentUrl());
    
  5. Utilisation de la méthode sendKeys ()

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

16

Trouvé diverses approches pour rafraîchir l'application dans le sélénium: -

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

Pour le code en direct, veuillez consulter le lien http://www.ufthelp.com/2014/11/Methods-Browser-Refresh-Selenium.html


1
Agréable! plusieurs façons de le faire. findElement (By.id ("Contactez-nous")) n'est pas un bon moyen. L'élément toujours plus fiable est bon, par exemple: '/ html / body'. Cela fonctionne-t-il pour un rafraîchissement dur? et si la page contient des données de publication, Firefox est connu pour afficher une boîte de dialogue de données de publication.
mrtipale

11

Voici la version C # légèrement différente:

driver.Navigate().Refresh();

5

Alternative pour l' actualisation de la page (F5)

driver.navigate().refresh();

(ou)

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

4

Une chose importante à noter est que l'appel driver.navigate (). Refresh () semble parfois être asynchrone, ce qui signifie qu'il n'attend pas la fin de l'actualisation, il "lance simplement l'actualisation" et ne bloque pas la poursuite de l'exécution pendant que le navigateur recharge la page.

Bien que cela ne semble se produire que dans une minorité de cas, nous avons pensé qu'il était préférable de s'assurer que cela fonctionne à 100% en ajoutant un contrôle manuel si la page avait vraiment commencé à se recharger.

Voici le code que j'ai écrit pour cela dans notre classe d'objet de page de 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();
}

Quelques notes:

  • Étant donné que vous rechargez la page, vous ne pouvez pas simplement vérifier l'existence d'un élément donné, car l'élément sera là avant le début du rechargement et une fois celui-ci terminé également. Alors parfois, vous pouvez devenir vrai, mais la page n'a même pas encore commencé à se charger.
  • Lorsque la page se recharge, la vérification de WebElement.isDisplayed () lèvera une StaleElementReferenceException. Le reste est juste pour couvrir toutes les bases
  • getName (): méthode interne qui récupère le nom de la page
  • getMaximumLoadTime (): méthode interne qui retourne combien de temps la page doit être autorisée à se charger en secondes
  • verify (): la méthode interne s'assure que la page est effectivement chargée

Encore une fois, dans la grande majorité des cas, la boucle do / while s'exécute une seule fois car le code au-delà de navigate (). Refresh () n'est pas exécuté tant que le navigateur n'a pas rechargé complètement la page, mais nous avons vu des cas où cela prend en fait quelques secondes pour traverser cette boucle car le navigateur (). refresh () ne s'est pas bloqué tant que le navigateur n'a pas fini de charger.


La réponse avec une vraie valeur ... Merci.
Ogmios

3

Vous pouvez également essayer

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

2

Il existe également un cas où vous souhaitez actualiser uniquement une iframe spécifique sur la page et non la page complète.

Vous faites est comme suit:

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


1

Une autre façon d'actualiser la page actuelle en utilisant le sélénium en Java.

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

L'utilisation de ceci actualisera la page actuelle comme en cliquant sur la barre d'adresse du navigateur et en appuyant sur Entrée.


1

Dans R, vous pouvez utiliser la méthode de rafraîchissement, mais pour commencer, nous naviguons vers une URL en utilisant la méthode de navigation:

remDr$navigate("https://...")
remDr$refresh()
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.