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()。
driver.get()和driver.navigate().to()到底有什么不同?-----Selenium快速入门(四)的更多相关文章
- 转载:安装ie driver和chrome driver
很多同学在使用webdriver的时候总是忘了安装ie driver和chrome driver, 因此在这里简单介绍一下这2个driver的安装方式. IE driver 在新版本的webdrive ...
- Could not create the driver from NHibernate.Driver.SQLite20Driver
使用NHibernate连接Sqlite语句,版本为.net3.5. 升级.net 4.0出现异常,提示”Could not create the driver from NHibernate.Dri ...
- 在Ubuntu上安装Chrome Driver和Firefox Driver
在Ubuntu上安装Chrome Driver和Firefox Driver 此文章只介绍Chrome Driver(Firefox Driver和该步骤相同) 下载链接:http://chromed ...
- driver.close()和driver.quit()
driver.close()关闭当前窗口 driver.quit()退出驱动关闭所有窗口 from selenium import webdriver from time import sleep d ...
- selenium中driver.close()和driver.quit()的不同点
driver.quit()与driver.close()的不同:driver.quit(): Quit this driver, closing every associated windows;dr ...
- vs Qt mysql 打包程序 Driver not loaded Driver not loaded
vs下开发Qt连接mysql程序,开发过程中操作MySQL没有问题,但打包以后安装在别的电脑上发现竟然无法连接MySQL,打包的时候,所需的libmysql.dll等dll文件拷贝到exe同级目录了, ...
- Warning:detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd".
执行kubeadm init集群初始化时遇到: [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker ...
- 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 ...
- Ironic中pxe driver和agent driver的区别
历史问题: 以pxe_ipmitool 和agent_ipmitool为例,看起来似乎前者不使用ironic-python-agent,后者使用,但是实际上两者都使用ironic-python-age ...
随机推荐
- mybatis一对多关联查询+pagehelper->分页错误
mybatis一对多关联查询+pagehelper->分页错误. 现象: 网上其他人遇到的类似问题:https://segmentfault.com/q/1010000009692585 解决: ...
- 4_bootstrap之栅格系统
4.栅格系统 4.1.简述栅格系统 为了方便在布局容器中进行网页的布局操作. BootStrap提供了一套专门用于响应式开发布局的栅格系统. 栅格系统将一行分为12列,通过设定元素占用的列数来 布局元 ...
- 十、api自动化环境问题及解决方案汇总(持续更新)
1.jenkins报错: Unable to read /root/.jenkins/config.xml at hudson.WebAppMain$3.run(WebAppMain.java:248 ...
- linux编程vim设置
linux环境下c网络编程vim编辑工具设置,包括自动缩进,tab键对齐等.
- 字符串转码 将文本转为PDF
@Test public void testBasic64Code() throws Exception { String strdata = new String("how are you ...
- JQ与JS等价代码
选择器 //jquery var els = $(".el"); //原生方法 var els = document.querySelectorAll(".el" ...
- DevExpress GridView 整理
1:去除 GridView 头上的 "Drag a column header here to group by that column" --> 点击 Run Desig ...
- 迷你MVVM框架 avalonjs 学习教程4、数据填充
MVVM是前端的究极解决方案,你们可能用过jQuery,但那个写的代码不易维护:你们可以听过说requirejs与seajs,传说中的模块开发,加载器,但它们的最终目标是打包:你们可能听过unders ...
- 使用twised实现一个EchoServer
ProtocolsProtocols描述了如何以异步的方式处理网络中断时间,HTTP.DNS已经IMAP是应用应用层协议中的例子,Protocols实现了IProtocol接口,它饱和如下的方法 ma ...
- Linux内核分析 - 网络[十四]:IP选项
Linux内核分析 - 网络[十四]:IP选项 标签: linux内核网络structsocketdst 2012-04-25 17:14 5639人阅读 评论(1) 收藏 举报 分类: 内核协议栈 ...