web-dev-qa-db-fra.com

Actualisation d'une page Web par WebDriver en attente d'une condition spécifique

Je recherche un moyen plus élégant d'actualiser une 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 la page Web entière 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 une meilleure solution pour trouver des éléments sur une page actualisée manuellement

135
pbaranski

Dans Java ou JavaScript:

driver.navigate().refresh();

Cela devrait actualiser la page.

270
Manpreet Singh

Dans Python, il existe une méthode pour cela: driver.refresh(). Ce n'est peut-être pas la même chose en Java.

Vous pouvez également utiliser driver.get("http://foo.bar");, bien que je pense que la méthode de rafraîchissement devrait fonctionner correctement.

57
Isaac

En python

Utilisation de la méthode intégrée

driver.refresh()

ou, en exécutant JavaScript

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

5 manières différentes d’actualiser une page Web en utilisant 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 que cela fonctionne. 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 browse.refresh ()

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

    driver.get("https://accounts.google.com/SignUp");  
    driver.navigate().to(driver.getCurrentUrl());
    
  4. Utiliser 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");
    
18
Sandeep

Trouvé différentes approches pour actualiser l'application dans Selenium: -

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 vous reporter au lien http://www.ufthelp.com/2014/11/Methods-Browser-Refresh-Selenium.html

15
AugustRush

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

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

Alternative pour Actualisation de la page (F5)

driver.navigate().refresh();

(ou)

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

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 "déclenche simplement l'actualisation" et ne bloque pas l'exécution ultérieure. pendant que le navigateur recharge la page.

Bien que cela ne semble se produire que dans une minorité de cas, nous avons estimé qu'il était préférable de s'assurer que cela fonctionne à 100% en ajoutant un contrôle manuel pour savoir si la page a réellement commencé à être rechargée.

Voici le code que j'ai écrit pour cela dans notre classe d'objet page page:

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 rechargement et après. Alors parfois, vous pouvez devenir vrai, mais le chargement de la page n'a même pas encore commencé.
  • Lorsque la page se recharge, la vérification de WebElement.isDisplayed () génère une exception StaleElementReferenceException. Le reste est juste pour couvrir toutes les bases
  • getName (): méthode interne qui obtient le nom de la page
  • getMaximumLoadTime (): méthode interne qui indique combien de temps la page devrait être autorisée à se charger en secondes
  • verify (): la méthode interne s'assure que la page est réellement chargée

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

3
mac

Vous pouvez aussi essayer

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

Il existe également un cas où vous souhaitez actualiser uniquement l'iframe spécifique sur la page et non la page entière.

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
Johnny

En PHP:

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

ne autre façon d'actualiser la page en cours en utilisant Selenium en Java.

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

En utilisant ceci, vous actualiserez la page actuelle, comme en cliquant sur la barre d'adresse du navigateur et en appuyant sur Entrée.

0
RyanskyHeisenberg