Chrome驱动程序的页面加载策略(更新至Selenium v​​3.12.0)

时间:2017-05-02 09:47:41

标签: selenium selenium-webdriver webdriver selenium-chromedriver pageloadstrategy

我正在使用Chrome浏览器测试WebApp。

有时页面会在很长时间后加载。我需要停止下载或限制下载时间。

在FireFox中,我了解PAGE_LOAD_STRATEGY = "eager"

铬有类似的东西吗?

P.S。:driver.manage().timeouts().pageLoadTimeout()有效,但在此之后对Webdriver的任何处理都会引发TimeOutException。 我需要在停止启动后获取页面的当前URL。

3 个答案:

答案 0 :(得分:12)

来自Webdriver规范:

  

对于导致加载新文档的命令,命令返回的点由会话的页面加载策略确定。

Page Loading花费太多时间并且您需要停止下载其他子资源(图片,css,js等)时,您可以通过{{1}更改 pageLoadStrategy }}

在撰写本文时, webdriver 支持以下值:

  1. <强> pageLoadStrategy

    此状态导致Selenium等待整页加载(html内容和子资源下载和解析)。

  2. <强> normal

    此状态导致Selenium等待DOMContentLoaded事件(仅下载并解析html内容)。

  3. <强> eager

    此策略会导致Selenium在完全收到初始页面内容后立即返回(下载html内容)。

  4. 默认情况下,当none加载页面时,它会跟随 Selenium normal

    以下是通过 DesiredCapabilities 类和 ChromeOptions 类的实例配置pageLoadStrategy()的代码块,如下所示:

    • 使用 DesiredCapabilities 类:

      pageLoadStrategy
    • 使用 ChromeOptions 类:

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

    注意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(); } } pageLoadStrategy normal {{1 }} 是符合WebDriver W3C Editor's Draft但<{1}}值的要求,因为 eager 仍然是 WIP(正在进行中) ChromeDriver 实施中。您可以在“Eager” Page Load Strategy workaround for Chromedriver Selenium in Python

    中找到详细的讨论

    参考文献:

答案 1 :(得分:0)

尝试使用显式等待。访问this链接。这可能会有所帮助

尝试此代码:

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

我希望您的问题能够使用上面的代码解决

答案 2 :(得分:0)

在C#中,由于PageLoadStrategy.Eager似乎不适用于Chrome,我只是自己用WebDriverWait编写它。将PageLoadStrategy设置为none,然后执行此操作将基本覆盖它:

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

您只需添加Chrome驱动程序作为参数,在我的情况下TimeSpan设置为最多20秒。因此,它将等待最多20秒,以使页面成为交互式或完整的