通过研究selenium-webdriver的源码,笔者发现其实webdriver的实现原理并不高深莫测无法揣度。在这里以webdriver
ruby
binding的firefox-webdriver实现为例,简单介绍一下webdriver的工作原理。
-
当测试脚本启动firefox的时候,selenium-webdriver
会首先在新线程中启动firefox浏览器。如果测试脚本指定了firefox的profile,那么就以该profile启动,否则的话就新启1个profile,并启动firefox;
-
firefox一般是以-no-remote的方法启动,启动后selenium-webdriver会将firefox绑定到特定的端口,绑定完成后该firefox实例便作为webdriver的remote
server存在;
-
客户端(也就是测试脚本)创建1个session,在该session中通过http请求向remote server发送restful的请求,remote
server解析请求,完成相应操作并返回response;
-
客户端接受response,并分析其返回值以决定是转到第3步还是结束脚本;
这就是webdriver的工作流程,看起来很复杂实际上当了解了webdriver的实现原理后,理解上述问题应该比较简单。
webdriver是按照server – client的经典设计模式设计的。
server端就是remote server,可以是任意的浏览器。当我们的脚本启动浏览器后,该浏览器就是remote
server,它的职责就是等待client发送请求并做出相应;
client端简单说来就是我们的测试代码,我们测试代码中的一些行为,比如打开浏览器,转跳到特定的url等操作是以http请求的方式发送给被测试浏览器,也就是remote
server;remote server接受请求,并执行相应操作,并在response中返回执行状态、返回值等信息;
举个实际的例子,下面代码的作用是”命令”firefox转跳到google主页:
driver = Selenium::WebDriver.for :firefox
driver.navigate.to "http://google.com"
在执行driver.navigate.to “http://google.com” 这句代码时,client,也就是我们的测试代码向remote
server发送了如下的请求:
POST session/285b12e4-2b8a-4fe6-90e1-c35cba245956/url
post_data {"url":"http://google.com"}
通过post的方式请求localhost:port/hub/session/session_id/url地址,请求浏览器完成跳转url的操作。
如果上述请求是可接受的,或者说remote server是实现了这个接口,那么remote server会跳转到该post
data包含的url,并返回如下的response
{"name":"get","sessionId":"285b12e4-2b8a-4fe6-90e1-c35cba245956","status":0,"value":""}
该response中包含如下信息
-
name:remote server端的实现的方法的名称,这里是get,表示跳转到指定url;
-
sessionId:当前session的id;
-
status:请求执行的状态码,非0表示未正确执行,这里是0,表示一切ok不许担心;
-
value:请求的返回值,这里返回值为空,如果client调用title接口,则该值应该是当前页面的title;
如果client发送的请求是定位某个特定的页面元素,则response的返回值可能是这样的:
{"name":"findElement","sessionId":"285b12e4-2b8a-4fe6-90e1-c35cba245956","status":0,"value":{"ELEMENT":"{2192893e-f260-44c4-bdf6-7aad3c919739}"}}
name,sessionId,status跟上面的例子是差不多的,区别是该请求的返回值是ELEMENT:{2192893e-f260-44c4-bdf6-7aad3c919739},表示定位到元素的id,通过该id,client可以发送如click之类的请求与server端进行交互。
那么remote
server端的这些功能是如何实现的呢?答案是浏览器实现了webdriver的统一接口,这样client就可以通过统一的restful的接口去进行浏览器的自动化操作。目前webdriver支持ie,
chrome, firefox, opera等主流浏览器,其主要原因是这些浏览器实现了webdriver约定的各种接口。
具体见http://code.google.com/p/selenium/wiki/JsonWireProtocol#Command_Reference。
由于笔者能力有限才疏学浅,因此文中定然有些谬误之处,还望不吝指出,多多斧正之。
分享到:
相关推荐
揭秘WebDriver实现原理的实现原理
关于Selenium WebDriver工作原理的介绍,原理相关描述
在WebDriver中也有类似的三个角色: 工程师写的自动化测试代码: 自动化测试代码发送请求给浏览器的驱动(比如火狐驱动、谷歌驱动) 浏览器的驱动: 它来解析这些自动化测试的代码,解析后把它们发送给浏览器 ...
WebDriver实验版VB6版WebDriver实验,压缩包中有技术文档《WebDriver原理及实验》
使用webdriver实现主页面跳转到子页面后又回到主页面的操作
用webdriver调用浏览器时,有时浏览器窗口不是总是最大化的状态,可以封装一个函数实现浏览器窗口的最大化。 下面给出一个具体实例: public class IeDriver { public static void main(String[] args) { ...
QtWebDriver是Qt的WebDriver实现。 它可用于基于以下条件对应用程序执行自动Selenium测试: QtWebkit Q小部件 QQuick1(Qt4)或QQuick2(Qt5) 如果您没有使用Selenium进行自动化测试,那么您可能还会发现此链接...
VB6版WebDriver实验,压缩包中有技术文档《WebDriver原理及实验》《WebDriver命令编程手册(英文版、中文机翻版)》,代码演示的功能有:操作浏览器自动打开百度、搜索mp3,获得网页源码,获得网页标题,网页截图,...
webdriver API中文版 webdriver API中文版 2 1.1 下载selenium2.0的lib包 2 1.2 用webdriver打开一个浏览器 2 1.3 打开测试页面 3 1.4 GettingStarted 3 第2章 Webdirver对浏览器的支持 5 2.1 HtmlUnit Driver...
webdriver安装包
IE Webdriver Python
webdriver起源,原理,常用api,常用方法,firefox常用配置,htmlunit常用配置
Selenium 2 WebDriver 初级视频教程(三) 介绍webdriver 框架中的两个重要接口, WebDriver和WebElement, 其操作是使用WebDriver框架实现自动化测试的基础
绘制了webdriver 和 浏览器、selenium命令之间是如何进行工作的
php-webdriver-bindings这个PHP库允许创建功能测试与PHP webdriver
Selenium WebDriver详解及事例
webdriver-helper安装包,whl版本
Selenium-Webdriver系列教程 Selenium 1.x时代已经远去,它理应躺在历史的角落里,靠着壁炉烤着火,抽着旱烟,在袅袅的升起的青烟中回忆那曾经属于自己的美好时代。 不过事实却并非如此,现今原本早应退役的...
Selenium WebDriver Practical Guide will guide you through the various APIs of WebDriver which should be used in automation tests, followed by a discussion of the various WebDriver implementations ...
今天小编就为大家分享一篇Selenium Webdriver实现截图功能的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧