大家都知道,这两个方法都是跳转到指定的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. centos使用163 yum源

    备份# cp /etc/yum.repos.d/CentOS-Base.repo  /etc/yum.repos.d/CentOS-Base.repo.bak修改# vi /etc/yum.repos ...

  2. requests and BeautifulSoup

    requests Python标准库中提供了:urllib.urllib2.httplib等模块以供Http请求,但是,它的 API 太渣了.它是为另一个时代.另一个互联网所创建的.它需要巨量的工作, ...

  3. python新里程

    为什么要学Python: 2018年6月开始自学Python.因为自己目前做Linux运维,感觉自己还需要掌握一门开发语言,在Java.python.php之间毫不犹豫的选择了Python,因为Pyt ...

  4. PHP 成长规划

    PHP程序员的技术成长规划 作者:黑夜路人(2014/10/15) 转:http://blog.csdn.net/heiyeshuwu/article/details/40098043 按照了解的很多 ...

  5. 横向文本框 index获取索引 和 eq 实现

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. Cardboard Talk01 HeadTracker

    操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Android studio 3.0.0 | Cardboard 1.0 使用 Google 的 Cardboard开发V ...

  7. JSTL的基本使用

    <body> <% request.setAttribute("name", "lisi123"); request.setAttribute ...

  8. shell编程9*9乘法表

    </pre>脚本内容<pre name="code" class="plain">#!/bin/bash for i in " ...

  9. WSTMart商城系统数据字典

    欢迎来到WSTMart官网  开源多用户商城  QQ交流群: 返回首页|返回首页| 开发手册 | 数据库字典 | 授权查询 | 授权用户登录 | 官方微信扫一扫 x QQ客服 服务热线 020-852 ...

  10. java 框架收藏

    一.java 异步非阻塞编程框架 1.Spring Webflux 2.Vert.x 3.Ratpack 4.smart-socket 国产异步框架 二.微服务框架 1.Jboot :专为大型分布式项 ...