要说当下有哪些炙手可热的自动化技术,Selenium绝对占据了一席之地。无论是各大测试论坛,还是众多培训机构的课程里,都常常提到Selenium这个UI测试技术。现在我们讨论的Selenium,通常是Selenium3(Selenium+WebDriver)。但在很多年前,Selenium与WebDriver是两个拥有不同原理的技术。
Selenium1
创始人是来自 ThoughtWorks 的Jason Huggins,Selenium原理是通过JS来控制浏览器,完成一系列的操作。
具体一点的介绍如下:
第一步:测试脚本(可以是各种语言编写)向Selenium Server发送请求,建立连接。
第二步:Selenium Server通过Launcher启动浏览器,并在浏览器中嵌入Selenium Core的JS代码库,然后再将浏览器的代理设置为Selenium Server的Http proxy。
第三步:测试脚本向Selenium Server发送Http请求,Selenium Server解析请求,并通过Http proxy调用被嵌入的Selenium Core。
第四步:Selenium Core接受到请求,通过JS控制浏览器完成响应的操作。
第五步:如果操作过程中,浏览器端发送了请求,因为浏览器的代理访问地址为Selenium Server的Http proxy地址,那么Selenium Server就会接受到这个浏览器的请求,Selenium Server解析、重组请求后,将请求发送到Web服务器去。
第六步:Web服务器接受到请求,返回响应结果给Selenium Server。
第七步:Selenium Server将响应结果发送到浏览器端
WebDriver
WebDriver是通过浏览器内部接口来操作浏览器,因此不同的浏览器必须适配不同的WebDriver。与Selenium使用JS代码定位、操作元素不同,WebDriver使用内部的接口来定位元素的坐标位置,并在该位置触发相应的事件。
WebDriver整个运行过程,可以类比为打出租车:
乘客(测试脚本)、出租车司机(浏览器驱动)、出租车(浏览器)
乘客先叫车,相应的司机开着出租车过来,乘客告诉司机去哪里,司机听了后操作踩离合、挂挡、轰油门前往目的地,最终乘客下车。
如果觉得有些抽象,我们就切换回真实的场景。
第一步:测试脚本(客户端)调用浏览器驱动,该浏览器驱动去启动对应的浏览器(在新线程中)。
第二步:启动后,WebDriver将浏览器绑定到特定的端口上(服务器),此浏览器便成了该WebDriver的Remote Server
第三步:测试脚本(客户端)创建一个Session,并通过Http协议向Remote Server(浏览器,可以看做服务器)发送restful请求,Remote Server接受到请求后,解析为该浏览器的内部接口来调用,完成相应的操作并接受response
第四步:测试脚本(客户端)接受到服务器端的response,决定是继续发送请求还是结束脚本
优缺点
作为早期很给力的UI自动化测试技术,他们都拥有着各自的优缺点:
Selenium
优点:1.因为是使用JS,在调用页面元素方面更强
2.可以自定义JS语句,灵活性较高
缺点:1.也是使用JS,需要将Selenium API翻译为JS语句,对翻译的准确性依赖较严重,因此稳定性无法保证
2.翻译的效率较低,执行时间较长
3.使用JS注入技术与浏览器交互,后来大家都不允许外部JS注入了
(真是成也JS,败也JS)
WebDriver
优点:调用的是浏览器内部接口,稳定性较强
缺点:1.不够灵活,操作页面元素没有Selenium强
2.不同的浏览器需要不同的驱动
所幸的是,后面Jason Huggins与Simon Stewart在Google成了同事,也就有了后来的Selenium2、Selenium3。