wake-up-neo.com

Seitenladestrategie für Chrome-Treiber (aktualisiert bis Selenium v3.12.0)

Ich verwende den Chrome-Browser zum Testen von WebApp.

Manchmal wurden Seiten nach sehr langer Zeit geladen. Ich musste das Herunterladen beenden oder die Downloadzeit einschränken.

In Firefox kenne ich PAGE_LOAD_STRATEGY = "eager".

Gibt es etwas Ähnliches für Chrom?

P.S .: driver.manage().timeouts().pageLoadTimeout() funktioniert, aber danach löst jede Behandlung von Webdriver TimeOutException..__ aus. Ich muss die aktuelle URL der Seite nach dem Stoppen des Bootvorgangs abrufen.

7
PanamaBoy

Von den Webdriver-Spezifikationen:

Bei Befehlen, bei denen ein neues Dokument geladen wird, wird der Punkt, an dem der Befehl zurückgegeben wird, durch die Sitzungsladestrategie der Sitzung bestimmt.

Wenn Page Loading zu lange dauert und Sie das Herunterladen zusätzlicher Subressourcen (Bilder, css, js usw.) beenden müssen, können Sie pageLoadStrategy durch die webdriver ändern.

Zum jetzigen Zeitpunkt unterstützt pageLoadStrategy die folgenden Werte:

  1. normal

    Aufgrund dieser Strategie wartet Selenium auf das vollständige Laden der Seite (HTML-Inhalt und heruntergeladene und analysierte Subressourcen).

  2. eager

    Aufgrund dieser Strategie wartet Selenium auf das DOMContentLoaded-Ereignis (nur heruntergeladene und analysierte HTML-Inhalte).

  3. none

    Diese Strategie bewirkt, dass Selenium unmittelbar nach dem vollständigen Empfang des ursprünglichen Seiteninhalts zurückkehrt (herunter geladener HTML-Inhalt).

Wenn Selenium eine Seite lädt, folgt diese standardmäßig dem normalpageLoadStrategy


Hier ist der Codeblock zum Konfigurieren von pageLoadStrategy() durch beide Instanzen von DesiredCapabilities Class und ChromeOptions Class wie folgt:

  • Verwendung von 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();
        }
    }
    
  • ChromeOptions Class verwenden:

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

Hinweis: pageLoadStrategy Werte normal, eager und none sind eine Anforderung gemäß WebDriver W3C Editor's Draft aber pageLoadStrategy Wert als eager ist immer noch eine WIP (Work In Progress) - Implementierung innerhalb von ChromeDriver. Eine ausführliche Diskussion finden Sie in „Eager“ Page Load Strategy Workaround für Chromedriver Selen in Python


Verweise:

10
DebanjanB

In C #, da PageLoadStrategy.Eager für Chrome nicht zu funktionieren scheint, habe ich es selbst mit einem WebDriverWait geschrieben. Legen Sie für PageLoadStrategy den Wert none fest und überschreiben Sie ihn dadurch: 

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

Sie fügen einfach Ihren Chrome-Treiber als Parameter hinzu und der TimeSpan ist in meinem Fall auf maximal 20 Sekunden eingestellt. Es wird also maximal 20 Sekunden warten, bis die Seite interaktiv oder vollständig ist

0
Jordan Webster

Versuchen Sie es mit explizitem Warten. Besuchen Sie this link. Es könnte hilfreich sein

Versuchen Sie auch diesen 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);
}   

Ich hoffe, dass Ihr Problem mit dem obigen Code gelöst wird

0