一、工作原理1

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

二、工作原理2

1、在后台添加测试用例。
2、后台测试用例执行调用任务执行接口,传送任务id及测试数据的JSON格式字符串给程序。
3、程序根据获取数据,解析并处理。
4、启动浏览器后,selenium-webdriver会将目标浏览器绑定到特定的端口,启动后的浏览器则作为webdriver的server。
5、客户端(也就是测试脚本),借助ComandExecutor发送HTTP请求给server端(通信协议:The WebDriver Wire Protocol,在HTTP request的body中,会以WebDriver Wire协议规定的JSON格式的字符串来告诉Selenium,我们希望浏览器接下来做什么事情)。
6、Server端需要依赖原生的浏览器组件,转化Web Service的命令为浏览器native的调用来完成操作。
7、最后将处理结果及任务id通过JSON字符串的格式返回给后台,可查看每条用例执行结果。

三、框架介绍

工程结构

UI自动化原理 - 图2
按照实际的业务流程调用对应接口来实现 WEB-UI 自动化测试用例。case 层可调用 service 层和 pageObject 层的接口,pageObject 是对每一个页面元素的一个封装,service 是对一个常用的业务模块功能的封装。比如一个查询企业信息的测试用例,需要依赖登入,这个业务功能就可以直接调用 service 中的接口。企业查询的创建就可以调用 pageObject 中的接口,然后按照查询的业务流程,在测试用例中把这些接口串起来就形成了一个 UI 自动化测试用例,详细细节接下去会举例说明。
整个工程基于 selenium,采用 pageObject 模式搭建。下面对工程中的几个重要模块做介绍。

driver — 接口层

对 web 页面所有元素的操作都是在driver定义接口并实现的。driver 对 selenium 提供的接口做了二次封装,对外提供封装后的接口。pageObject 实现了一些公共方法,比如给输入框赋值等,目前 pageObject封装的方法不多,大多功能都可以通过 selenium 实现。driver 层对开源工具接口做了二次封装,想要驱动一个浏览器还有一个必不可少的工具 —— 浏览器驱动,这个驱动放在 Referenced Libraries 里,驱动的版本必须与被测浏览器版本相匹配。

model — 数据模型

创建数据模型为了实现测试数据和测试用例分离而采取的一种方法,具体的测试数据初始化。可以对一个业务流程中需要测试数据的元素在一个 model 中定义出来,方便管理和代码阅读。

pageObject — 业务层

pageObject 模式,采用接口形式封装每一个页面需要用到的元素,实现封装只要做两步:

  • 确定元素的定位方式;
  • 调用 driver 中对应的操作接口。

driver 的接口实现包含了一定的容错能力,但并不是全面的,部分页面或者组件具有独特性,单纯调用 driver 的接口并不能保证测试用例的稳定性,此时就需要在 pageObject 的接口实现中加入一些容错算法,确保用例稳定性。

service — 提供业务功能

一个业务流程很多时候依赖其他业务模块功能,为了方便设计一个测试用例,也为了避免重复造轮子,service 层就提供了一些常用的业务功能,比如登入、企业查询等。依赖方只需要在 service 层调用即可。

webdriver和浏览器的信息交互:

Webdriver 使用浏览器厂商提供的浏览器自动化 api 来控制浏览器和运行测试。
1、通过命令请求webdriver
命令: java -Dwebdriver.chrome.driver=”chromedriver.exe” -jar selenium-server-standalone-2.47.1.jar
2、vscode运行测试脚本。进入脚本所在的目录,执行命令:npx codeceptjs run 脚本名称,查看打印信息759305-20160325130838901-155075273.png
一个请求命令,webdriver都会封装一个executing(执行),发送过去,发送成功后,再返回一个done表示处理成功。如果发生了异常,如找不到页面元素,则会在执行时抛异常
3、在浏览器输入http://localhost:4444/wd/hub,通过以load script方式拿到sessionid
4、拿到sessionId后,先用接口访问个百度,接口地址:http://localhost:4444/wd/hub/session/5c81a944-55c6-4c2a-9e01-689bc43d335d/url,请求json内容:{"url“: “http://www.baidu.com/"}。查看结果