web-dev-qa-db-fra.com

Stratégie de chargement de page pour le pilote Chrome (mise à jour jusqu'au Selenium v3.12.0)

J'utilise le navigateur Chrome pour tester WebApp.

Parfois, les pages chargées après très longtemps. Je devais arrêter de télécharger ou limiter leur temps de téléchargement.

Dans FireFox, je connais PAGE_LOAD_STRATEGY = "eager".

Y a-t-il quelque chose de similaire pour le chrome?

P.S .: driver.manage().timeouts().pageLoadTimeout() fonctionne, mais après cela tout traitement à Webdriver jette TimeOutException. Je dois obtenir l'URL actuelle de la page après avoir arrêté son démarrage.

7
PanamaBoy

À partir des spécifications Webdriver:

Pour les commandes qui entraînent le chargement d’un nouveau document, le point auquel la commande est retournée est déterminé par la stratégie {stratégie de chargement de page de la session} _.

Lorsque Page Loading prend trop de temps et que vous devez arrêter de télécharger des sous-ressources supplémentaires (images, css, js, etc.), vous pouvez modifier le pageLoadStrategy par le webdriver.

A ce jour, pageLoadStrategy prend en charge les valeurs suivantes:

  1. _ {normal

    En raison de cette stratégie, Selenium attend le chargement complet de la page (contenu et sous-ressources HTML téléchargés et analysés).

  2. _ {eager

    En raison de cette stratégie, Selenium attend l'événement DOMContentLoaded (contenu HTML téléchargé et analysé uniquement).

  3. _ {none

    Cette stratégie entraîne le retour de Selenium immédiatement après la réception complète du contenu de la page initiale (contenu HTML téléchargé).

Par défaut, lorsque Selenium charge une page, il suit le normalpageLoadStrategy _. 


Voici le bloc de code pour configurer pageLoadStrategy() via une instance de DesiredCapabilities Class et ChromeOptions Class comme suit:

  • Utilisation de DesiredCapabilities Class:

    package demo; //replace by your own package name
    
    import org.openqa.Selenium.WebDriver;
    import org.openqa.Selenium.chrome.ChromeDriver;
    import org.openqa.Selenium.chrome.ChromeOptions;
    import org.openqa.Selenium.remote.DesiredCapabilities;
    
    public class A_Chrome_DCap_Options {
    
        public static void main(String[] args) {
    
            System.setProperty("webdriver.chrome.driver", "C:\\Utility\\BrowserDrivers\\chromedriver.exe");
            DesiredCapabilities dcap = new DesiredCapabilities();
            dcap.setCapability("pageLoadStrategy", "normal");
            ChromeOptions opt = new ChromeOptions();
            opt.merge(dcap);
            WebDriver driver = new ChromeDriver(opt);
            driver.get("https://www.google.com/");
            System.out.println(driver.getTitle());
            driver.quit();
        }
    }
    
  • Utilisation de ChromeOptions Class:

    package demo; //replace by your own package name
    
    import org.openqa.Selenium.PageLoadStrategy;
    import org.openqa.Selenium.WebDriver;
    import org.openqa.Selenium.chrome.ChromeDriver;
    import org.openqa.Selenium.chrome.ChromeOptions;
    
    
    public class A_Chrome_Options_test {
    
        public static void main(String[] args) {
    
            System.setProperty("webdriver.chrome.driver", "C:\\Utility\\BrowserDrivers\\chromedriver.exe");
            ChromeOptions opt = new ChromeOptions();
            opt.setPageLoadStrategy(PageLoadStrategy.NORMAL);
            WebDriver driver = new ChromeDriver(opt);
            driver.get("https://www.google.com/");
            System.out.println(driver.getTitle());
            driver.quit();
        }
    }
    

Note: pageLoadStrategy valeurs normal, eager et none est une condition requise selon version de l'éditeur de WebDriver W3C mais pageLoadStrategy valeur comme eager _ est toujours un WIP (travail en cours) dans ChromeDriver implémentation. Vous trouverez une discussion détaillée dans La solution de contournement de la stratégie de chargement de page «Désireux» de Chromedriver Selenium en Python


Références:

10
DebanjanB

En C #, comme PageLoadStrategy.Eager ne semble pas fonctionner pour Chrome, je l’ai écrit moi-même avec WebDriverWait. Définissez PageLoadStrategy sur none. Cette opération aura pour effet de le remplacer: 

new WebDriverWait(_driver, TimeSpan.FromSeconds(20))
    .Until(d =>
    {
      var result = ((IJavaScriptExecutor) d).ExecuteScript("return document.readyState");
      return result.Equals("interactive") || result.Equals("complete");
    });

Vous ajoutez simplement votre pilote chrome en tant que paramètre et TimeSpan est réglé sur un maximum de 20 secondes dans mon cas. Il faudra donc attendre 20 secondes au maximum pour que la page soit interactive ou complète.

0
Jordan Webster

Essayez d'utiliser l'attente explicite. Visitez this link. Ça pourrait être utile

Essayez aussi ce code: 

WebDriver driver = new FirefoxDriver();
String startURL = //a starting url;
String currentURL = null;
WebDriverWait wait = new WebDriverWait(driver, 10);

foo(driver,startURL);

/* go to next page */
if(driver.findElement(By.xpath("//*[@id='someID']")).isDisplayed()){
    String previousURL = driver.getCurrentUrl();
    driver.findElement(By.xpath("//*[@id='someID']")).click();  
    driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

    ExpectedCondition e = new ExpectedCondition<Boolean>() {
          public Boolean apply(WebDriver d) {
            return (d.getCurrentUrl() != previousURL);
          }
        };

    wait.until(e);
    currentURL = driver.getCurrentUrl();
    System.out.println(currentURL);
}   

J'espère que votre problème sera résolu en utilisant le code ci-dessus

0