selenium工作原理详解

一、什么是WebDriver

WebDriver提供了另外一种方式与浏览器进行交互。那就是利用浏览器原生的API,封装成一套更加面向对象的Selenium WebDriver API,直接操作浏览器页面里的元素,甚至操作浏览器本身(截屏,窗口大小,启动,关闭,安装插件,配置证书之类的)。由于使用的是浏览器的原生API,速度大大提高,而且调用的稳定性交给了浏览器厂商本身,显然是更加科学。然而带来的一些副作用就是,不同的浏览器厂商,对Web元素的操作和呈现存在不同程度的差异,这就要求Selenium WebDriver要分浏览器厂商的不同,提供不同的实现,例如Chrome有专门的ChromeDriver,Firefox有FirefoxDriver等等。

WebDriver Wire协议是通用的,也就是说不管是Firefox Driver还是ChromeDriver,启动之后都会在某一个端口启动基于这套协议的Web Service。例如ChromeDriver初始化成功之后,默认会从http://localhost:46350开始,而FirefoxDriver从http://localhost:7055开始。后续我们调用WebDriver的任何API,都需要借助一个ComandExecutor发送一个命令,实际上是一个HTTPrequest给监听端口上的WebService。在我们的HTTPrequest的body中,会以WebDriver Wire协议规定的JSON格式的字符串来告诉Selenium我们希望浏览器接下来做什么事情。

在这我也准备了一份软件测试视频教程(含接口、自动化、性能等),需要的可以直接在下方观看,或者直接关注VX公众号:互联网杂货铺,免费领取

软件测试视频教程观看处:

软件测试工程师大忌!盲目自学软件测试真的会毁终生,能救一个是一个......

二、通信原理

最少情况,WebDriver通过一个驱动程序与浏览器对话。通信有两种方式:WebDriver通过驱动程序向浏览器传递命令,然后通过相同的路径接收信息。

图片

驱动程序在与浏览器相同的系统上运行。这可能与执行测试本身的系统相同,也可能不同。

上面这个简单的例子就是直接通信。与浏览器的通信也可以是通过Selenium服务器或RemoteWebDriver进行的远程通信。RemoteWebDriver与驱动程序和浏览器运行在同一个系统上。

图片

远程通信也可以使用Selenium Server或Selenium Grid进行,这两者依次与主机系统上的驱动程序进行通信。

图片

WebDriver只是与浏览器通信,测试框架(如JUnit、Pytest)负责运行和执行WebDriver以及测试中相关步骤。

图片

三、具体过程

1.实例化WebDriver,在目标浏览器里启动一整套WebService。这套WebService使用了Selenium自己设计定义的协议,名字叫做The WebDriver Wire Protocol。这套协议非常之强大,几乎可以操作浏览器做任何事情,包括打开、关闭、最大化、最小化、元素定位、元素点击、文件上传等等。

2.发送请求时,用WebDriver的HttpCommandExecutor类将命令转换为URL作为value,命令作为key一起存入map作为request,同时会在request的body中存放相应的ByXpath、id、name。实际发送的URL都是相对路径,后缀多以/session/:sessionId开头,这也意味着WebDriver每次启动浏览器都会分配一个独立的sessionId,多线程并行的时候彼此之间不会有冲突和干扰。比如我们常用到的find_element_by_class_name这个接口,会转化为/session/:sessionId/element这个url,然后在发出Http Request Body内再附上具体的参数,比如classname的值。比如我们要访问某一个网站,请求地址为:

http://localhost:46350/wd/hub/session/sessionId/url,请求json内容:{"url":"http://www.qq.com"}。比如查找一个classname为test的元素,请求地址后缀为/session/sessionId/element,json内容{"using":"class_name","value":"test"}。

3.收到并执行了这个操作之后,也会回复一个HttpResponse。内容也是Json,会返回找到的element的各种细节,比如text、CSSselector、tagname、classname等等。比如:
{"sessionId":"XXXXX","status":0,"state":"success","value":{"ELEMENT":"2"},"class":"XXX","hCode":"XXX"}

四、总结

PS:这套软件测试的自学教程合集,对于在测试行业发展的小伙伴们来说应该会很有帮助。全套内容已经打包到网盘,内容总量接近500个G。如需要软件测试学习资料,关注公众号(互联网杂货铺),后台回复1,整理不易,给个关注点个赞吧,谢谢各位大佬!

这些资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。

  • 15
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值