原文链接:https://blog.51cto.com/u_13281972/4931678
很多人可能写过不少测试脚本,但是可能没有理清测试代码,WebDriver,浏览器 driver 和浏览器之间的关系,下面会逐渐为大家理清一下这些关系
(测试代码)(Webdriver)(浏览器 driver)(浏览器)之间的关系
形象描述
如果把自动化控制浏览器和人工手动点击浏览器来测试进行比较,那么可以把测试代码中各个 API 操作浏览器的方法看做人工手动点击滑动鼠标的操作,自动化中会将这些 API 方法转化成相应的指令并发给浏览器去执行,手工的话就相当于浏览器中会将人的点击等事件转为指令并去执行
技术描述
WebDriver 的 API 可以看成客户端,浏览器 driver 可以看成服务端,即一个经典的 C/S 结构,它们之间使用 HTTP 协议进行通信
1、测试代码
对于 Java 语言而言,测试代码中的各个方法实际上是 selenium 包中提供 WebDriver 的 API
2、WebDriver
与浏览器 driver 相交互的类,提供各种可以被 driver 解析的 API。其基于 Json Wire Protocol 协议,该协议以 HTTP 协议为基础并对 HTTP 协议中请求和响应体数据做了进一步规范
3、浏览器 driver
将 WebDriver 中的 API 操作进行解析并发送给指定浏览器
4、浏览器
执行 driver 发送过来的指令,实现浏览器的运行
执行信息是如何传递的呢?
大致步骤
每个 selenium【测试脚本】通过【WebDriver】会创建 http 请求
【WebDriver】将 http 请求传给【浏览器 driver】
【浏览器 driver】中包含一个 HTTP Server,来接收【WebDriver】传过来的请求
【浏览器 driver】中的 HTTP Server 接收到请求后,根据请求来操作【浏览器】
【浏览器】执行操作步骤
【浏览器】将执行这些步骤的结果返回给【浏览器 driver】中 HTTP Server
【浏览器 driver】中的 HTTP Server 再将结果返回到【测试脚本】中(抛异常的方式)
细节步骤
WebDriver 和浏览器 driver 交互
WebDriver 使用 Json Wire Protocol 协议可以发送 Get 请求或 Post 请求,POST 请求如findElement()或click()等接口请求,服务端会根据不同接口请求来执行不同操作,POST 请求时,请求体中的数据服务端在响应给客户端时提供了细化的状态码,比如状态码 7 是NoSuchElement,状态码 11 是ElementNoVisible,状态码 200 是Everything OK
一些问题
为啥采用 HTTP 呢?
答:因为 HTTP 是浏览器和 Web 服务器间的通信协议,几乎每种编程语言都提供丰富的 HTTP 库,WebDriver 中的各种 API 接口就像 client,浏览器 driver 中的 HTTP Server 就是 server
为什么一个浏览器 driver 可以处理各种语言的操作脚本呢?
答:因为 WebDriver(客户端) 基于 Json Wire Protocol,该协议会对传输数据做一个格式规范,当不同语言的代码被编译器编译之后,代码中的数据封装进请求体中被 WebDriver(客户端)发往浏览器 driver(服务端),浏览器 driver(服务端)也会把响应数据做一定格式的封装进响应体中返回给 WebDriver(客户端),这样由于遵循了指定的协议做了格式规范,WebDriver(服务端)无需关注是何种语言