【问题标题】:Page load strategy for Chrome driver (Updated till Selenium v3.12.0)Chrome 驱动的页面加载策略(更新到 Selenium v​​3.12.0)
【发布时间】:2017-09-29 19:04:33
【问题描述】:

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

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

在 FireFox 中,我知道 PAGE_LOAD_STRATEGY = "eager"

chrome有类似的东西吗?

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

【问题讨论】:

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


    【解决方案1】:

    ChromeDriver 77.0(支持 Chrome 77 版)现在支持 eager 作为 pageLoadStrategy

    已解决的问题 1902:支持急切页面加载策略 [Pri-2]


    来自 Webdriver 规范:

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

    Page Loading 占用过多时间并且您需要停止下载其他子资源(图像、css、js 等)时,您可以通过webdriver 更改pageLoadStrategy

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

    1. normal

      这种策略导致 Selenium 等待整个页面加载(下载和解析 html 内容和子资源)。

    2. eager

      此策略导致 Selenium 等待 DOMContentLoaded 事件(仅下载和解析 html 内容)。

    3. none

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

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


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

    • 使用 DesiredCapabilities 类:

      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 类:

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

    注意pageLoadStrategynormaleagernone 是根据WebDriver W3C Editor's Draft 的要求,但pageLoadStrategy 值作为eager 仍然是ChromeDriver 实施中的WIP(正在进行的工作)。详细讨论可以在“Eager” Page Load Strategy workaround for Chromedriver Selenium in Python


    参考资料:

    【讨论】:

    • 是的!它帮助到我。但为什么.....?这个怎么运作?为什么我们必须设置 pageLoadStrategy = none?为什么 pageLoadStrategy = eager 不起作用?
    • @DebanjanB 您的回答没有解释pageLoadStrategy 的变化如何影响行为,因此后续问题超出了预期,不回答只是粗鲁。谢谢
    • @PanamaBoy Chrome 不支持急切页面加载策略。
    • 你能提供你的 Python 代码吗?我用 Python,不知道怎么用 Python 写,谢谢。
    【解决方案2】:

    在 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 秒以使页面交互或完成

    【讨论】:

      【解决方案3】:

      尝试使用显式等待。访问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);
      }   
      

      希望您的问题可以使用上面的代码解决

      【讨论】:

        猜你喜欢
        • 2018-07-24
        • 1970-01-01
        • 1970-01-01
        • 2015-02-25
        • 2020-01-04
        • 2018-12-07
        • 2016-05-02
        • 1970-01-01
        • 2016-07-10
        相关资源
        最近更新 更多