一、背景介绍
一直以来在测试书籍相关业务的过程中,创建测试书籍都是必不可少的。创建测试书籍不仅种类繁多,流程复杂,书籍状态随流程的不同变化多样,手动添加不仅耗时费力而且测试完成后处理不当极易产生测试垃圾影响线上业务。本文提供了一套在Pytest框架下使用Pageobjrect实现UI自动化操作书籍创建签约的方案。使用Pytest的主要原因有二,一是Pytest的文档丰富,属于较为成熟的测试框架。二是Pytest基于python的框架相较于其他的框架安装方便。Pytest的其他优势及使用方法已有其他人进行过充分的介绍,本文不在赘述,本文主要针对Pageobject设计思路,搭建的UI自动化框架的介绍。
二、Pageobject的设计思路以及优点
Pageobject设计思路是将页面的元素定位和元素行为封装成一个page类。编写用例时通过调用类的方法实现对页面的操作。这种设计模式的核心思想是测试对象与测试用例分离。这样做的好处有很多,从代码维护的角度分析其优势为:
1、当某个页面的元素发生变化,只需要修改该页面对象中的代码即可,测试用例不需要修改。
2、 提高代码重用率。结构清晰,维护代码更容易。
3、测试用例发生变化时,不需要或者只需要修改少数页面对象代码即可。
4、从成本的角度讲,由于实际的操作存储在每一个页面中,方便成员进行分工,各自维护各自负责的页面即可,不易互相影响。节省了协作成本。
5、用例的编写工作对代码能力要求较低,仅需了解方法调用即可,对人员的能力要求较低,可降低学习门槛。
三、环境搭建及相关软件
本次主要是对web UI自动化测试进行环境部署,使用的环境为:基于Python的Pytest测试框架,Selenium实现元素定位及执行动作,实现对浏览器的操作,及对页面元素的抓取。
Selenium的框架底层使用JavaScript模拟真实用户对浏览器进行操作。测试脚本执行时,浏览器自动按照脚本代码做出点击、输入、打开、验证等操作,就像真实用户所做的一样,从终端用户的角度测试应用程序。当用于Web端的UI自动化测试需要下载与浏览器匹配的WebDriver用于驱动浏览器,并且可通过给浏览器加装Selenium IDE简化定位过程、录制脚本。
selenium的工作过程:
1、selenium client(python等语言编写的自动化测试脚本)初始化一个service服务,通过Webdriver启动浏览器驱动程序chromedriver.exe
2、通过RemoteWebDriver向浏览器驱动程序发送HTTP请求,浏览器驱动程序解析请求,打开浏览器,并获得sessionid,如果再次对浏览器操作需携带此id
3、打开浏览器,绑定特定的端口,把启动后的浏览器作为webdriver的remote server
4、打开浏览器后,所有的selenium的操作(访问地址,查找元素等)均通过RemoteConnection链接到remote server,然后使用execute方法调用_request方法通过urlib3向remote server发送请求
5、浏览器通过请求的内容执行对应动作
6、浏览器再把执行的动作结果通过浏览器驱动程序返回给测试脚本
四、实现方案
Page Object模式,顾名思义,就是页面对象,在实际自动化测试中,一般对脚本分为三层:
对象层: 用于存放页面元素定位
逻辑层: 用于存放一些封装好的功能用例模块
业务层: 用于存放我们真正的测试用例的操作部分
除了以上三层,还有一个基础层,基础层主要是针对selenium的一些常用方法,根据实际业务需要进行二次封装,如点击、输入等操作加入一些等待、日志输入、截图等操作,方便以后查看脚本的运行情况及问题排查。
1、基础层:
基础层类名一般命名为BasePage,后续的对象层操作元素时都继承这个基础类,下面以点击、输入为例:
![](https://tech.qimao.com/content/images/2023/03/image-1.png)
以点击click_element()为例,这里二次封装时加入了等待操作、日志输入、异常截图,后面点击元素时就直接调用click_element()就可以一步到位,不需要再考虑等待、日志、异常的情况,这里都已经处理好了,虽然在初期写基础页面会比较耗时,但只要基础打好,在后续维护工作中会轻松很多。以上只是一个示例,可以根据自己的实际需要进行优化。
2、对象层及逻辑层:
对象层存放页面元素定位,逻辑层存放元素操作方法(页面功能),元素定位可以根据实际需要,可以单独放在一个模块来维护,也可以存放在excel中进行集中管理;下面演示的是元素定位和元素操作方法都存放到一个模块中,一个页面一个模块,后续页面元素发生变化,只需要在这个模块中修改对应的定位表达式或者操作方法即可。
纵横作者专区登录:
![](https://tech.qimao.com/content/images/2023/03/image-2.png)
运行结果:
![](https://tech.qimao.com/content/images/2023/03/image-3.png)
纵横作者专区上传章节:
![](https://tech.qimao.com/content/images/2023/03/image-4.png)
为了实现UI自动化测试还需要对页面page类进行丰富,对各个页面方法的完善及用例的撰写会继续补充。