一、项目背景

目前项目中的软件产品,包含多个平台版本(Windows、安卓、Linux...),因为产品特点,功能方面只适合做 GUI 的自动化,当然公司已经有了一款商业软件在使用中,但由于一些原因(比如降本、自动化覆盖问题),需要寻求一个新的测试方案;

下面会介绍工具选型的整个过程,及方案实现;

本方案,应该适用于大多数 GUI 自动化测试项目,虽然目前只在 Windows 平台上实践过,后面也会把其他平台的实践分享出来,咱们拭目以待吧!

二、工具选型及 方案实现

2.1、从零开始

破冰思路:和一部分测试人员一样,先找个自动化工具,然后选择比较熟悉的测试框架,然后制定项目设计模式(基于 PO 模式),最后接入 CI/CD;

2.1.2、Windows 自动化工具探索
工具选型原则:"适合当下的自己",所以考虑以下 3 个维度
a)是否适合团队,组员大数多,使用的开发语言是 Python
b)是否容易掌握,学习成本低,能快速上手
c)符合当前的业务要求

先梳理出需要自动化的场景,最终会用来选定工具方案;
比如,工具栏元素定位及操作、二/三级菜单元素定位及操作、从菜单上拖拽元素到指定的位置、手势操作(多指收合/展开)、不同速度手势、窗口元素定位,切换及操作等。

inspect.exe:可以获取元素信息,主要是获取 AutomationId;
Appium:虽然是从 Windows 平台开始入手,但在工具选型上,也会尽量选择跨平台的。比如在搜索网上 Windows 自动化现有方案时,找到我们比较熟悉的 Appium 测试开源工具,可以通过访问官网,来了解它:http://appium.io/docs/cn/about-appium/intro/
另外,它可以进行远程调试,目前还是很多测试工具只支持本地调试,远程调试需要进行二次开发;进行 Windows 自动化时,需要配合 WinAppDriver(由微软提供用来 UI 自动化测试的工具,https://github.com/microsoft/WinAppDriver);
PyAutoGUI:可以协助进行点击操作,因为在工具调试过程中,发现 Webdriver 的 Click(),无法点击二级菜单中的按钮;它是一个 Python 库,不需要另外安装依赖库(Win32GUI 就比较麻烦,指定版本还要依赖库),用来进行屏幕控制(截屏、截图识别等)、鼠标控制(移动鼠标、单击、双击、右击、拖拽等)、键盘控制(编辑、按键等);

2.1.3、测试框架探索
测试框架的选型和工具一样,"适合"为上,所以直接选择用 Pytest 测试框架;

2.1.4、项目设计
基于 PO 模式,将项目分为 3 层,公共层、页面库层、用例层

2.1.5、CI/CD 接入
暂不接入

2.2、最终自动化方案

2.2.1、自动化实现思路,下面有 2 定位元素方案,可以混合使用;
1、通过 inspect.exe 获取元素的 AutomationId,通过 webdriver 的 find_element_by_accessibility_id 定位元素,获取元素的坐标和大小信息,再通过 pyautogui 的 click() 方法对元素进行操作;
2、通过 driver.page_resource 获取当前页面 xml 内容,然后通过 xpath 解析器,获取元素 xpath 表达式,再通过 webdriver 的 find_element_by_accessibility_id 定位元素,获取元素的坐标和大小信息,再通过 pyautogui 的 click() 方法对元素进行操作;

2.2.2、运行效果

2.2.3、环境搭建
a)被测设备开启 开发者模式;
b)安装 Node,下载地址:https://nodejs.org/dist/v16.13.0/node-v16.13.0-x64.msi
c)安装 Pycharm Community,下载地址:https://www.jetbrains.com/pycharm/download/download-thanks.html?platform=windows&code=PCC
d)安装 Python,下载地址,https://www.python.org/ftp/python/3.10.0/python-3.10.0-amd64.exe
e)被测设备安装 WinAppDriver,下载地址:https://github.com/microsoft/WinAppDriver/releases/download/v1.2.1/WindowsApplicationDriver_1.2.1.msi
f)安装 Appium Server,下载地址:
g)安装 Python 包
Appium-Python-Client,注意要安装 v1.x 版本,因为 v2.x 的 Location/Size 方法使用有问题;安装命令:pip install appium-python-client
PyAutoGUI,安装命令:pip install pyautogui
Pytest,安装命令:pip install pytest

2.2.4、项目结构

公共层,包含 app.py,用来负责应用的打开、关闭;common.py,用来负责放一些公共用的方法;
页面库层,xxx_module.py,用来负责划分页面结构,并定义每个页面对象;
用例层,包含测试数据、test_xxx.py(测试用例)

2.2.5、各模块说明
2.2.5.1、应用启动器:app.py

2.2.5.2、公共方法库:common.py

2.2.5.3、页面类:whiteboard_setting_module.py

2.2.5.4、用例库:test_whiteboard_setting_module.py

2.2.5.5、断言方式:
1、截图断言,通过 PyAutoGUI 的 pyautogui.locateOnScreen() 方法,从当前界面上查找 test_data 目录下已存放好的 元素截图,没找到会返回一个 None 值,可以用这个值作为结果判定;
2、定位信息断言,通过 Webdriver 的 find_element_by_xxx() 方法,从查找元素是否存在,或元素的信息是否存在;
3、使用策略,两种断言方式,混合使用;

三、项目总结

3.1、调研过程,有时候会被卡住,比如刚开始用 Appium 方案时,因为元素定位的问题,花了很久没有解决,然后就改用 uiautomation 的方案,在用此方案时,了解了 Windows 自动化的一些原理,由于此方案的一些缺点,于是又换回 Appium 方案,之前元素定位的问题一下就有了解决方案;一个是自己对原理不了解,所以原理很重要,二个是了解其他工具再回来用旧方案时,突然就有了解决方案,所以有时此路不通时,换条路获取新的思路,也是个解决问题的办法;
3.2、官方文档,有时为了急于有成效,就会去网上找现成的,绕过官方文档,当出现问题时,其实还得靠官方文档解决,所以官方文档看完,这个很重要!

四、未来规划

4.1、为了提高自动化效率,可能会考虑数据驱动,或低代码方式去写脚本;
4.2、接入 CI/CD;
4.3、尝试 AI 的方法,提高脚本录制效率;


↙↙↙阅读原文可查看相关链接,并与作者交流