大家都知道,这两个方法都是跳转到指定的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()。

driver.get()和driver.navigate().to()到底有什么不同?-----Selenium快速入门(四)的更多相关文章

  1. 转载:安装ie driver和chrome driver

    很多同学在使用webdriver的时候总是忘了安装ie driver和chrome driver, 因此在这里简单介绍一下这2个driver的安装方式. IE driver 在新版本的webdrive ...

  2. Could not create the driver from NHibernate.Driver.SQLite20Driver

    使用NHibernate连接Sqlite语句,版本为.net3.5. 升级.net 4.0出现异常,提示”Could not create the driver from NHibernate.Dri ...

  3. 在Ubuntu上安装Chrome Driver和Firefox Driver

    在Ubuntu上安装Chrome Driver和Firefox Driver 此文章只介绍Chrome Driver(Firefox Driver和该步骤相同) 下载链接:http://chromed ...

  4. driver.close()和driver.quit()

    driver.close()关闭当前窗口 driver.quit()退出驱动关闭所有窗口 from selenium import webdriver from time import sleep d ...

  5. selenium中driver.close()和driver.quit()的不同点

    driver.quit()与driver.close()的不同:driver.quit(): Quit this driver, closing every associated windows;dr ...

  6. vs Qt mysql 打包程序 Driver not loaded Driver not loaded

    vs下开发Qt连接mysql程序,开发过程中操作MySQL没有问题,但打包以后安装在别的电脑上发现竟然无法连接MySQL,打包的时候,所需的libmysql.dll等dll文件拷贝到exe同级目录了, ...

  7. Warning:detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd".

    执行kubeadm init集群初始化时遇到: [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker ...

  8. oracle数据库连接问题org.springframework.jdbc.support.MetaDataAccessException: JDBC DatabaseMetaData method not implemented by JDBC driver - upgrade your driver...

    org.springframework.jdbc.support.MetaDataAccessException: JDBC DatabaseMetaData method not implement ...

  9. Ironic中pxe driver和agent driver的区别

    历史问题: 以pxe_ipmitool 和agent_ipmitool为例,看起来似乎前者不使用ironic-python-agent,后者使用,但是实际上两者都使用ironic-python-age ...

随机推荐

  1. MySQL与PostgreSQL相比哪个更好?

    网上已经有很多拿PostgreSQL与MySQL比较的文章了,这篇文章只是对一些重要的信息进行下梳理.在开始分析前,先来看下这两张图: MySQL MySQL声称自己是最流行的开源数据库.LAMP中的 ...

  2. Go语言优势与劣势

    Go语言的优势: 1.脚本化的语法:开发效率高,容易上手 2.静态类型+编译型,程序运行速度有保障:静态类型+编译型语言相对于动态类型+解释型语言的效率高 3.原生的支持并发编程:降低开发.维护成本/ ...

  3. lombok 的使用

    参考:https://blog.csdn.net/motui/article/details/79012846

  4. leetcode232

    public class MyQueue { Stack<int> S = new Stack<int>(); /** Initialize your data structu ...

  5. BDE 升级到FireDAC

    BDE  Query Replace Str in files   by cnpack tools TQueryTFDQuery dmdb->qrypub->Open(sql); fdme ...

  6. JS 根据url 下载

    一. window.location="htpp://www.baidu.com/test.rar"; 二. var $form = $('<form method=&quo ...

  7. Linux运维基础入门(四):Linux中的网络知识04

    一,虚拟机的安装 略 二,Linux系统下的网络配置(Linux虚拟机的网络设定为桥接模式) 桥接模式:虚拟机同主机一样,在网络中相当于一个真实存在的装有Linux系统的电脑.(我们先用这个模式) N ...

  8. centos 安装hue 4.0

    Hue是Cloudera开源的一个Hadoop UI,由Cloudera Desktop演化而来.面向用户提供方便的UI用于平时的Hadoop操作中.Apache Ambari面向的是管理员,用于安装 ...

  9. SO_LINGER

    [SO_LINGER] 在默认情况下,当调用close关闭socket的使用,close会立即返回,但是,如果send buffer中还有数据,系统会试着先把send buffer中的数据发送出去,然 ...

  10. swagger框架

    1.1   介绍 Swagger是一个简单又强大的能为你的Restful风格的Api生成文档工具.在项目中集成这个工具,根据我们自己的配置信息能够自动为我们生成一个api文档展示页,可以在浏览器中直接 ...