【问题标题】:How can we get exact time to load a page using Selenium WebDriver?我们如何获得使用 Selenium WebDriver 加载页面的准确时间?
【发布时间】:2012-06-28 12:51:01
【问题描述】:

我们如何获得使用 Selenium WebDriver 加载页面的准确时间?

我们使用 Thread.sleep

我们使用隐式等待

我们使用 WebDriverWait

但是我们如何才能获得使用 Selenium WebDriver 加载页面的准确时间呢?

【问题讨论】:

标签: java selenium selenium-webdriver webdriver


【解决方案1】:

如果您想了解使用 Selenium WebDriver(又名 Selenium 2)完全加载页面需要多长时间。

通常,WebDriver 应该仅在页面完全加载后才将控制权返回给您的代码。

因此,以下 Selenium Java 代码可能会帮助您找到页面加载时间 -

long start = System.currentTimeMillis();

driver.get("Some url");

long finish = System.currentTimeMillis();
long totalTime = finish - start; 
System.out.println("Total Time for page load - "+totalTime); 

如果这不起作用,那么您将不得不等到页面上显示某些元素 -

 long start = System.currentTimeMillis();

driver.get("Some url");

WebElement ele = driver.findElement(By.id("ID of some element on the page which will load"));
long finish = System.currentTimeMillis();
long totalTime = finish - start; 
System.out.println("Total Time for page load - "+totalTime); 

【讨论】:

  • 唯一可能的问题是您还包括发送/接收 Selenium 命令所需的时间。如果您使用 Web 上的集线器,这种增加的延迟可能会影响页面加载时间结果。
  • 是的,你当然是对的。这不是完全正确的答案。如果我们不使用 java 和 selenium,附加组件可能会给我们正确的时间 - searchenginejournal.com/… 。请让我知道是否有任何方法可以使用 java 代码实现页面加载时间。
  • Wat 如果 Ajax 调用正在进行并且元素也是可见的吗?示例网站 - mortgage-lender-reviews.com/reviews/amerisave-reviews.html
【解决方案2】:

您可以使用 org.apache.commons.lang3.time 包的 StopWatch 对象。以下是使用Java的Selenium WebDriver的完整代码:

import org.apache.commons.lang3.time.StopWatch;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

public class TimerInSeleniumWebDriver {
    public static void main(String[] args) {
        WebDriver driver;
        driver = new FirefoxDriver();       
        StopWatch pageLoad = new StopWatch();
        pageLoad.start();
        //Open your web app (In my case, I opened facebook)
        driver.get("https://www.facebook.com/");
        // Wait for the required any element (I am waiting for Login button in fb)
        WebDriverWait wait = new WebDriverWait(driver, 10);
        wait.until(ExpectedConditions.presenceOfElementLocated(By.id("u_0_l")));

        pageLoad.stop();
        //Get the time
        long pageLoadTime_ms = pageLoad.getTime();
        long pageLoadTime_Seconds = pageLoadTime_ms / 1000;
        System.out.println("Total Page Load Time: " + pageLoadTime_ms + " milliseconds");
        System.out.println("Total Page Load Time: " + pageLoadTime_Seconds + " seconds");
        driver.close();
    }
}

【讨论】:

    【解决方案3】:

    我也有这个需求,我使用了浏览器提供的performance.timeOrigin对象。我在 C# 中使用它,但对于这个问题,我修改了@Ripon Al Wasim 的答案,使其适用于 java。

    import org.apache.commons.lang3.time.StopWatch;
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.firefox.FirefoxDriver;
    import org.openqa.selenium.support.ui.ExpectedConditions;
    import org.openqa.selenium.support.ui.WebDriverWait;
    
    public class TimerInSeleniumWebDriver {
        public static void main(String[] args) {
            WebDriver driver;
            driver = new FirefoxDriver();
            //Open your web app (In my case, I opened facebook)
            driver.get("https://www.facebook.com/");
            // Wait for the required any element (I am waiting for Login button in fb)
            WebDriverWait wait = new WebDriverWait(driver, 10);
            wait.until(ExpectedConditions.presenceOfElementLocated(By.id("u_0_l")));
            //Get the time
            long pageLoadTime_ms = getPageLoadTime();
            long pageLoadTime_Seconds = pageLoadTime_ms / 1000;
            System.out.println("Total Page Load Time: " + pageLoadTime_ms + " milliseconds");
            System.out.println("Total Page Load Time: " + pageLoadTime_Seconds + " seconds");
            driver.close();
        }
          public static long getPageLoadTime(WebDriver driver){
            //Creating the JavascriptExecutor interface object by Type casting      
            JavascriptExecutor js = (JavascriptExecutor)driver;     
    
          //This will get you the time passed since you page navigation started 
          return (Long)((JavascriptExecutor)driver).executeScript("return Date.now() - performance.timeOrigin;"");  
        }
    }
    

    只需在需要获取页面加载时间的地方调用以下方法即可。

      public static long getPageLoadTime(WebDriver driver){
            //Creating the JavascriptExecutor interface object by Type casting      
            JavascriptExecutor js = (JavascriptExecutor)driver;     
    
          //This will get you the time passed since you page navigation started     
          return (Long)((JavascriptExecutor)driver).executeScript("return Date.now() - performance.timeOrigin;"");  
        }
    

    您无需担心页面加载的开始位置,但就像其他答案一样,您必须在页面加载完成后立即输入

    这类似于秒表,但更干净(无需启动、停止、重置)。

    【讨论】:

      【解决方案4】:

      使用 TestListner 获得最佳体验:

      @AfterMethod
          public void getResult(ITestResult result) throws Exception {
              String sMethodName = "";
              Long lExecutionTime;
              sMethodName = result.getMethod().getMethodName().toString();
              lExecutionTime = (result.getEndMillis() - result.getStartMillis()) / 1000;
              System.out.println(sMethodName + " execution Time is : " + lExecutionTime + "sec.");
          }
      

      【讨论】:

        【解决方案5】:

        driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);

        【讨论】:

          猜你喜欢
          • 2020-08-02
          • 2014-07-25
          • 1970-01-01
          • 1970-01-01
          • 2012-05-23
          • 1970-01-01
          • 2014-09-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多