UI自动化PO设计模式介绍
-基于python+selenium2+unittest+HTMLTestRunner
一、简介
on+selenium+unittest+HTMLTestRunner完成。该文档主要介绍此框架的设计、环境安装搭建及框架应用相关内容。该文档是动态更新
UI自动化使用pyth的,根据需要,会对框架做优化,增加删除更新某些模块。
此文档帮助测试人员尽快熟悉UI自动化测试。所以,整理此文档。
二、整体框架介绍
2.1 PO设计模式
什么是设计模式?
PO(PageObject)设计模式将某个页面的所有元素对象定位和对元素对象的操作封装成一个 Page 类,即一个py文件,并以页面为单位来写测试用例,实现页面对象和测试用例的分离,若元素发生变化,只需要进入对应的Page类,更新元素定位即可,不用修改用例。PO模式的设计思想与面向对象相似,能让测试代码变得可读性更好,可维护性高,复用性高。
PO 模式可以把一个页面分为三个层级:对象库层、操作层、业务层。
对象库层:封装定位元素的方法。
操作层:封装对元素的操作。
业务层:将一个或多个操作组合起来完成一个业务功能。
一条测试用例可能需要多个步骤操作元素,将每一个步骤单独封装成一个方法,在执行测试用例时调用封装好的方法进行操作。
PO 模式的优点
·通过页面分层,将测试代码和被测试页面的页面元素及其操作方法进行分离,降低代码冗余。
·页面对象与用例分离,业务代码与测试代码分离,降低耦合性。
·不同层级分属不同用途,降低维护成本。
·代码可阅读性增强,整体流程更为清晰。
2.2 架构图
2.3 目录设置
整个测试框架分为四层,通过分层的方式,测试代码更容易理解,维护起来较为方便。
第一:“测试工具层”:
models包:用于实现测试过程中调用的工具类方法,例如读取配置文件、页面元素的操作方法、操作Excel文件等。
conf 包:配置文件及全局变量。
test_data 目录:Excel 数据文件,包含测试数据输入、测试结果输出。
log 目录:日志输出文件。
image 目录:异常截图保存目录。
第二层:“服务层”,对于页面测试,是对页面元素或操作的一个封装。
page_obj 包:对象库层及操作层,将所有页面的元素对象定位及其操作分别封装成一个类。
第三层:“测试用例逻辑层”,该层主要是将服务层封装好的各个业务对象,组织成测试逻辑,进行校验。
action 包:基于page_obj封装常用的测试流。
test_case 包:基于业务层和测试数据文件,执行测试用例集合。
test_data 目录:Excel 数据文件,包含测试数据输入、测试结果输出。
第四层:“测试场景层”,将测试用例组织成测试场景,实现各种级别 cases 的管理、冒烟,回归等测试场景。
run_all_test.py:本 PO 框架的运行主入口。
2.4 selenium
selenium是thoughtworks公司的一个集成测试的强大工具,它封装了各种工具和库,实现了web浏览器的自动化。
selenium经历了两个版本,selenium1.0和selenium2.0,selenium不是一个单独的工具,而是由一些插件、类库组成的,每个部分都有其特点和应用场景,selenium1.0家谱图如下:
selenium2.0 = selenium1.0 + webdriver,可以把webdriver看作是 seleniumRC的替代品。
selenium2的特点:
·开源、免费
·多浏览器支持:Firefox、Chrome、IE、Opera、Edge;
·多平台支持:linux、Windows、MAC;
·多语言支持:java、python、Ruby、C#、JavaScript、C++;
·对web页面有良好的支持;
·简单、灵活;
·支持分布式测试用例执行;
掌握selenium2主要是掌握webdriver,webdriver本质上是一个库,完成对浏览器的自动化操作,学好自动化首先掌握webdriver的常用api,元素的定位,浏览器控制、页面元素操作,表单窗口上传下载文件警告信息处理等等,这里不做一一介绍,可以参考seleniumAPI手册。
2.5 unittest
unittest介绍:
https://www.cnblogs.com/miki-peng/p/12501341.html
内容包括:unittest四个核心概念、unittest常用断言、测试用例命名方式使用、TestFixture的两种使用方法,测试套件如何添加测试用例集、结合报告执行。
2.6 HTMLTestRunner
HTMLTestRunner是 Python 标准库的 unittest 框架的一个扩展
2.7 ddt数据驱动
ddt是第三方模块,需要安装,安装方法详见4.5.
ddt的data有两种:
第一种:直接输入测试数据,程序会自动循环读取测试数据执行,而执行的代码只需要写一次,实现代码复用,减少冗余。使用方法如下:
需要两步,在类名前加装饰器@ddt,在方法名前加装饰器@ddt.data(具体数据),数据类型可以是元组、列表、字典等数据。
详见:https://www.cnblogs.com/songzhenhua/p/11068308.html
第二种:从文件中读取数据,可以从json、yaml、或者Excel中获取测试数据,本文主要讲从Excel中获取数据。方法如下:
在类名前和测试方法前分别加上装饰器,从Excel读取的测试数据方法放在测试方法的装饰器的参数中。
Excel读取方法如下:
循环从Excel中读取数据,并返回list
四、环境搭建
4.1、本地搭建python开发环境
Python可应用于多平台包括 Linux 和 Mac OS X。通过终端窗口输入 "python" 命令来查看本地是否已经安装Python以及Python的安装版本。
这里就不具体讲python的安装了,详细步骤如下:https://zhuanlan.zhihu.com/p/111168324?from_voters_page=true
安装好python后,Python 2.7.9 + 或 Python 3.4+ 以上版本都自带 pip 工具,pip 是 Python 包管理工具,以后也是用pip来管理各种工具包。
4.2、安装selenium
进入命令行模式,用pip工具安装selenium,“pip install selenium” 用来安装selenium
安装完成后,在C:\Users\xiong\AppData\Local\Programs\Python\Python37\Lib\site-packages目录下,你会看到一个selenium 目录。这就是安装好的selenium包,如下:
4.3、unittest
unittest是Python自带的单元测试框架,无需安装,位置如下:
4.4、安装openpyxl
同样的方法,用pip install openpyxl安装openpyxl
安装完成后,在C:\Users\xiong\AppData\Local\Programs\Python\Python37\Lib\site-packages目录下,会看到一个openpyxl目录,这就是安装好的openpyxl包,如下:
4.5、安装ddt数据驱动
同样的方法,用pip install ddt安装ddt
安装完成后,在C:\Users\xiong\AppData\Local\Programs\Python\Python37\Lib\site-packages目录下,会看到一个ddt目录,这就是安装好的ddt包,如下:
4.6、HTMLTestRunner
HTMLTestRunner是一个py文件,该原始文件是基于python2来开发的,如果你安装的是python3的环境,运行原始文件时会报错,需要改几行代码,但总体区别不大。
该文件所在目录:
在项目中,需要时,直接import就可以使用。
4.7、Chrome浏览器驱动安装
首先查看Chrome的版本:chrome://version/
下载Chrome浏览器驱动,注意驱动版本要和浏览器版本对应,否则运行会报错。
如下网址查看浏览器版本对应的驱动下载链接:
https://npm.taobao.org/mirrors/chromedriver
我的浏览器是88版本,下载对应的驱动,如下:
存放路径有两种方式:
方法一:
把驱动放到Chrome的启动程序路径下:
运用时,需要指定驱动的位置,如下示例:
将下载的chromedriver.exe放到至Python的安装目录下,与python.exe文件相同目录下。查看Python的安装目录(cmd输入命令where python)。如下图所示:
以下示例:
如果是其他浏览器方法如同炮制,不多赘述。
五、远程运行
运行自动化测试脚本会影响我们的日常工作,所以采用selenium提供的分布式测试工具—Selenium Grid,利用Selenium Grid可以在不同的分支节点上运行,从而不影响我们的日常工作。
现在采用Selenium Grid2版本,需要下载Selenium Server才可以使用Grid2功能。
使用Grid,首先下载配置Selenium Server,下载地址:http://www.seleniumhq.org/download
找到对应版本下载得到selenium-server-standalone-XXX.jar,由于jar包由java开发,所以需要java环境,如果没有配置java需要先安装。
远程运行测试脚本步骤:
1.代码中,启动浏览器驱动时,配置远程ip等信息,如下:
2.启动Selenium Server
java –jar selenium-server-standalone-2.47.0.jar
3.启动本地hub主机、远程node主机
java –jar selenium-server-standalone-2.47.0.jar –role hub
java –jar selenium-server-standalone-2.47.0.jar –role node –port 5555 –node http://XXXXXX
4.运行脚本 python 文件包.py
注意,想在其他主机上运行node需要满足以下要求:
·本地hub主机和远程node主机之间必须ping命令连通;
·远程主机必须安装用例执行的浏览器及驱动,并且驱动要放在环境变量path的目录下;
·远程主机必须按照java环境
六、常见问题
1、找不到元素?
遇到找不到元素的情况,首先看是否没有加载出来导致元素找不到,需要设置等待。还有可能页面出现内嵌的frame或者iframe,需要switch_to进入该frame才能找到元素。
2、alter弹框的处理方法?
确认:switchto().alert().accpet();
取消:switchto().alert().dismiss();
3、滚动条的处理方法,需要用到执行js脚本解决
String js="window.scrollTo(0,ducument.body.ScrollHeight)";
((JavascriptExecutor)driver).executeScript(js);
4、用例怎么管理
用excel维护用例,一个测试点用一个sheet维护
5、如果只执行一部分用例怎么办?
在测试用例里有一列is_Run,如果Y表示要执行,N表示不执行
6、数据依赖怎么处理
可以把放在setUp()方法里调用,每次执行该用例时会自动调用