selenium自动化测试的工作原理

时间:2024-02-23 20:53:11

  记得在不久前的一次工作技能培训中,有位同事问了我一句,关于selenium的底层工作原理是怎么样的,我们持续关注的webdriver到底是如何识别我们的代码并进行对应的动作的,起初不以为然,底层的东西知道个大概就行,毕竟精力有限,但后面仔细回想了下,就像以前大学做的嵌入式设计一样,如果不知道底层的相关东西,是没办法很好理解和使用的。

       OK,既然如此,那就好好整理一下吧。

       先举个例子,假如我们出门坐出租车,我们首先要做的就是拦一辆出租车,并跟司机传达我们所要去的目的地,然后司机启动车辆,带我们到达目的地。

       其实类比过来,webdriver里面的角色也跟上述差不多:

         1.工程师所写的测试代码,无论是python、JAVA、还是C#等都会先发送请求给我们的浏览器驱动,如火狐、谷歌、IE这些。

         2.浏览器收到了驱动发过来的指令,就开始根据指令进行工作。

       没错,你看,我们的代码就是对应的指令传达,浏览器驱动就是我们的司机,整个浏览器就是我们所有人的载体,出租车。

       通过上述形象的对比,我们可以得到一个流程,给指令,驱动工作,浏览器工作。

       从技术层面上来说,上述三者就是我们所谓的WebDriver API、browser driver、以及我们的borwser如谷歌、火狐、IE这些。

       接下来我们看一下这个通讯过程是怎么实现的,首先,先抛出一个问题,为什么selenium可以支持多种语言,像python、java、c#等。其实对于我们的每条selenium脚本而言,都如同创建一个http请求,并发给对应的浏览器驱动,浏览器驱动中包含了一个http server,用来接收并转换成对应的操作对浏览器进行操控,然后浏览器将对应的结果返回给浏览器驱动。

       所以说,归根究底,都是各种脚本通过我们的HTTP协议对浏览器发送请求,接收结果的一个过程,中间由我们对应的浏览器驱动进行转化,所以说,无论用什么语言,本质上是一样的。

       既然说到请求,那就免不了说一下我们的客户端和服务端,我们的浏览器驱动相当于一个客户端,浏览器相当于服务端。

       再往深一步继续,WebDriver基于的协议:JSON Wire protocol。

       我们知道,HTTP请求有很常见的GET、POST等,举个例子,我通过POST请求给对应的接口发送一串JSON数据,如:

    { "name": "chongwei", "age": "29", "moble": "unknow" }

       然后浏览器接收到了数据,进行结果返回:

    {"status" : 0, "value": {"element" : "66666"}}

       当然,这个过程就是通过JSON Wire protocol协议进行通讯的,也就是说,这个就是我们的传声筒,通过它,我们要到达的目的地才能让司机知会,然后进行开车出发。

       以上,差不多就是webdriver的白话版工作原理了。

 

  若想了解更多内容,我都记录在公众号-寻虫测试中,可关注了解。