driver.get()和driver.navigate().to()到底有什么不同?Selenium快速入门(四)

  大家都知道,这两个方法都是跳转到指定的url地址,那么这两个方法有什么不同呢?遇到这种情况,第一反应就是查查官方的文档。

  官方文档的说法是:Load a new web page in the current browser window. This is done using an HTTP GET operation, and the method will block until the load is complete. This will follow redirects issued either by the server or as a meta-redirect from within the returned HTML. Should a meta-redirect "rest" for any duration of time, it is best to wait until this timeout is over, since should the underlying page change whilst your test is executing the results of future calls against this interface will be against the freshly loaded page. Synonym for WebDriver.Navigation.to(String).

上面的说明的地址是(http://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/WebDriver.html#get-java.lang.String-)

  大家看到我红色标识的“Synonym”没,这个单词的意思就是“同义词”,也就是说,官方文档的说法是这两者是一样的,马上转到Navigation.to的说明看看,说明是一模一样的。但是为什么网上会有那么多声音,认为这两者是有所不同呢?例如,有的认为,driver.get调用后,不具有前进后退的能力,而navigation则有这个能力,但我测试后发现,两者调用后均能前进后退。还有的认为,driver.get是要等浏览器加载完后才跳转,而navigation则是直接跳转,但从上面的说明以及自己简单测试看起来,navigation也是一样,都要等浏览器加载完后才跳转。诸如此类,网上总是有说法,认为两者大致一样,但还是有微小的差别。但是他们说的差异,我是试不出来,不知有哪位高手可以举个例子。

  既然再怎么百度也没用,那在官方文档和网上说法有差别的情况下,该相信谁呢?我始终无法选择相信任何一个,因为都没有十足的依据,想来想去,既然selenium是开源的,那好办,查源码。

  如果大家有看我们这个系列的第一篇文章,就知道我们引用的库有这样一个文件,client-combined-3.9.1.jar,没错,我们就是查这个。

  经过简单的查找,可以看出继承关系,ChromeDriver extends RemoteWebDriver, FirefoxDriver extends RemoteWebDriver,还有其他driver均是继承自RemoteWebDriver,而RemoteWebDriver  implements WebDriver ,WebDriver是一个接口。关键在于RemoteWebDriver这个类。

  打开这个类,我们找到get的定义:

public void get(String url) {
    execute(DriverCommand.GET, ImmutableMap.of("url", url));
  }

    再继续找下去,我们找到Navigation的定义:

 public Navigation navigate() {
    return new RemoteNavigation();
  }

       从代码可以看到,RemoteNavigation是关键,再找下去,可以找到这个类的定义:

private class RemoteNavigation implements Navigation {

    public void back() {
      execute(DriverCommand.GO_BACK);
    }

    public void forward() {
      execute(DriverCommand.GO_FORWARD);
    }

    public void to(String url) {
      get(url);
    }

    public void to(URL url) {
      get(String.valueOf(url));
    }

    public void refresh() {
      execute(DriverCommand.REFRESH);
    }
  }

  而里面,有我们想要的to方法的定义,至此,大家应该很清楚了吧。从上面代码可以看到,to的定义是这样的:

public void to(String url) {
      get(url);
    }

    public void to(URL url) {
      get(String.valueOf(url));
    }

  也就是说,navigate().to()实际是在调用get(url),可见driver.navigate().to()和driver.get()是一模一样的的,说起来,driver.get()还要比navigate().to()快那么一点点呢。但为什么网上众说纷纭呢?我估计可能有两个原因,一个是Selenium以前的版本,两者确实有差别,另一个可能是浏览器(或版本)的差异造成的。

  但无论怎样,我现在可以宣布,在Selenium3.9.1下,driver.navigate().to()和driver.get()是一模一样的,没有任何差别。硬要说差别,那就是driver.get()比driver.navigate().to()快那么一点点,因为driver.navigate().to()实际是在调用driver.get()。

原文地址:https://www.cnblogs.com/devtester/p/8577903.html