大家都知道,这两个方法都是跳转到指定的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. JMS消息服务模型

    JMS--仅仅是一种规范,一种接口规约,一种编程模型.类似的JPA,JSR等 场景: 1.多个系统之间交互,实现可以采取RPC,但是交互复杂,基本就是点对点的方式 2.其实交互就是消息,而JMS就是消 ...

  2. 磁盘IO计算

    看了篇文章,突然想写点磁盘IO的东西,也算是对磁盘的一点点总结. 以下以理论为主,辅助结合实际情况.不明白这句话的出去. 今年是2018年,目前市场上早已经没有国产的硬盘,以前的长城.易拓早早的被拍死 ...

  3. 深入浅出 Java Concurrency (5): 原子操作 part 4 CAS操作

    在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁(后面的章节还会谈到锁). 锁机制存在以下问题: (1)在多线程竞争下,加锁.释放锁会导致比较多的上下文切换和调度 ...

  4. Back to CNBLOG

    突然发现自己很久都没有写过博客了,感觉有点愧对程序员这个称号... 任重道远,要做的东西很多,越来发现,坚持是最难的,例如写博客. 但起码有有个开始,要有个开始去分享自己的经历,去让别人也知道,你是怎 ...

  5. leetcode88

    public class Solution { public void Merge(int[] nums1, int m, int[] nums2, int n) { //for (int i = 0 ...

  6. 26.OGNL与ValueStack(VS)-N语法top语法

    转自:https://wenku.baidu.com/view/84fa86ae360cba1aa911da02.html N语法[0]:<s:property value="[0]& ...

  7. JS在生成csv文件时,","逗号问题处理.

    在生成csv文件时,发现一个问题,因为csv文件本身是依靠逗号进行分列的,所以内容中有逗号时也被强制分列了,处理方法很简单,为内容加上双引号(英文格式)就可以了. 如: "11111,222 ...

  8. css 积累1

    1.position 取值. 通常的回答是 static.relative.absolute 和 fixed .当然,还有一个极少人了解的 sticky .其实,除此之外, CSS 属性通常还可以设置 ...

  9. 九项重要的职业规划提示(转自W3School )

    1. 学习的步伐不停止 古人说,活到老,学到老.终身学习应该是您的座右铭. 世界在不断变化,每个人都在寻找各自的事业途径. 您只有保证了足够的技能储备,才能确保能够得到一份足够满意的工作. 为了保证您 ...

  10. 282 expression and operations添加运算符

    [抄题]: 给定一个仅包含数字 0 - 9 的字符串和一个目标值,返回在数字之间添加了 二元 运算符(不是一元)+, - 或 * 之后所有能得到目标值的情况. "123", 6 - ...