底层原理(一)元素操作与驱动交互

浏览器启动完成后,调用:driver.get("https://ke.qq.com/");
就能在导航栏中访问到指定的这个页面,这个里面发生了什么?
到底是客户端脚本直接操作浏览器还是通过某些中间件来完成??

底层原理如下:

1、在自动化测试过程中,存在三部分组件:客户端脚本+驱动+浏览器终端。
2、驱动文件,以geckodriver.exe为例,这个可执行的驱动文件启动后,相当于一个暴露了一系列接口的服务器,监听某一端口,例如:89890。
3、客户端的操作(访问页面,定位元素,输入数据,点击按钮等)都是封装成了接口请求(eg:/session/xx/yy),然后提交到驱动服务器。
4、驱动服务器接收到客户端的请求后,再跟终端浏览器交互。
5、终端浏览器做出相应操作。

下图描述了整个交互过程:


image.png

定位元素为例,定位搜索框,我们来看底下这行代码在执行的时候底层到底经历了些什么:

WebElement searchInputBox = driver.findElement(By.id("js_keyword"));
image

实际,底层请求时,每个请求会被封装为一个command,然后根据不同的commannd封装得到不同的HttpRequest对象:

image

根据此命令,得到接口地址:

image

拿到此接口地址封装为一个HttpRequest请求。

image

client.execute(httpRequest,true),执行接口调用:

image

至于其他操作:往输入框输入数据,点击按钮等,都是对应一个接口地址,通过调用接口,请求驱动来处理,最后驱动同浏览器进行交互,浏览器按照指示做出对应操作。

Selenium有一个类AbstractHttpCommandCodec,此类中维护了众多自动化操作对应的接口地址:

image
image
image
image
image

另外,可能会有人好奇,驱动服务器是何时启动的服务。其实是在执行下面这行代码的时候启动的,大家可执行去debug调试selenium的底层代码:

image

当上面这行代码执行完,可以发现eclipse的控制台显示了如下信息:

image

说明此驱动服务器成功启动了,并且监听了本机的21984端口,等待客户端发起请求,并处理。

至于驱动跟浏览器之间是如何交互的,在后面的文章中会择机介绍,请大家守候。