自动化工具 面向 windows 程序的 UI 自动化测试研究历程

老曹 · 2021年04月27日 · 最后由 mjshusheng 回复于 2021年09月30日 · 2075 次阅读

最近公司有一个程序需要进行测试,其中有个测试目标是测试程序执行的成功率,我考虑肯定不能使用手工测试,必须要通过自动化测试来完成测试目标,并且这个程序大部分工作是单机完成的,接口自动化测试也无法满足要求,所以必须使用面向 windows 程序的 UI 自动化测试来达成。

目前软件自动化测试 99% 都是针对 WEB 端的,不论是 PC 侧还是安卓侧,对 windows 程序的 UI 自动化测试网上资料极少,我自己知道的仅有 QTP 这个工具,但是因为 QTP 工具太重,脚本维护也麻烦,所以我不准备采用这个工具来测试,我跟几个同行咨询请教后,首先了解到 Appium 可以用来进行 windows 的 UI 自动化测试,在网上查找相关资料后,发现大部分也都是安卓和 pc 的 WEB 自动化测试的资料,还有一个问题是这些资料和教程散碎不成体系,无法让我了解完整的自动化测试过程,我只能继续在网上查找资料,在这个过程中我又了解到,Appium 可以和 Winappdriver 一起进行自动化测试,在网上找到相关教程并按教程步骤进行环境搭建后,又出现了一个问题,Appium 无法打开测试目标程序,程序报配置文件无法加载,把测试目标程序换为暴风影音后,可以正常拉起暴风的程序,却无法分析出暴风的 windows 元素,也无法进行录制,因为这种种原因,我放弃了使用 Appium+Winappdriver 进行测试的方案。

在之前的方案失败后,我又查询了很多资料,从某篇文章得知有个 UIAutomation 工具可以做 windows 程序的 UI 自动化测试,并且比 Appium 更方便快捷,于是我开始了对这个工具的学习研究,从 1997 年开始,微软就在 windows 中集成了 MSAA 组件 (Microsoft Active Accessibility),这套组件本质上就是一组 COM 接口,让开发者可以方便的开发残疾人士辅助软件,后来慢慢被应用到了自动化测试工作中,衍生出了 UIAutomation 测试工具,并且 QTP、Fuctional Test 和 Silk Test 等工具也是通过 MSAA 完成与 windows 控件控制和信息交互的。

UIA 很适合我的测试场景,但是 UIA 是基于 C# 语言的,本人对 C# 研究不深,而且 C# 编程环境需要安装 VS CODE,整个开发环境太重,我感觉不太合适,但是这个时候在检索 UIAutomation 的结果中出现了一个不同的东西,一个名称一样的工具,却是一位 yinkaisheng 大佬使用 C++ 和 Python 对 MSAA 接口进行封装并发布在 GitHub 上的,可以使用纯 Python 进行自动化脚本开发,经过对这个模块的试用,我发现这个工具非常适合我的测试,终于测试工具确定下来了。

根据评论大佬的建议,我去了解了一下 airtest 自动化测试工具,windows 版的测试工具很小巧,而且界面功能一看就很容易上手,录制和抓取的功能非常简单,可惜的是 airtest 三种方式都无法识别我的待测程序,所以试验到此结束,我又在网上搜了一下别人的使用体验,应该说这个工具更适合移动端的测试,所以我还是决定采用原有的方式进行自动化测试,用 Inpsect 和 automation.py 进行元素抓取,用 uiautomation 和 unittest 进行用例编写。

试用代码:

import os
import subprocess
import uiautomation
import time
#打开计算器进程
subprocess.Popen('calc.exe')
time.sleep(2)
#定位窗口
wc=uiautomation.WindowControl(searchDepth=1,Name='计算器')
#设置为顶层
wc.SetTopmost(True)
wc.ButtonControl(Name='7').Click()
wc.ButtonControl(Name='加').Click()
wc.ButtonControl(Name='5').Click()
wc.ButtonControl(Name='等于').Click()
result=wc.TextControl(AutomationId='158')
print(result.Name)
if result.Name=="12":
    print("测试成功")
else:
    print("测试失败")
#截图
wc.CaptureToImage('1.png')
time.sleep(2)
wc.ButtonControl(Name='关闭').Click()
os.system("taskkill /F /IM calc.exe")
#截图
wc.CaptureToImage('1.png')
time.sleep(2)
wc.ButtonControl(Name='关闭').Click()
os.system("taskkill /F /IM calc.exe")

参考文章:Python 下编写 Windows 自动化测试软件 (https://www.jianshu.com/p/be3c46c7a905)
介绍 MSAA,UIA ,Windows Automation API(https://blog.csdn.net/popeer/article/details/6855639)
UI 自动化和 Microsoft Active Accessibility(https://docs.microsoft.com/zh-cn/dotnet/framework/ui-automation/ui-automation-and-microsoft-active-accessibility)

共收到 17 条回复 时间 点赞

收藏了,以后写游戏脚本能用到

控制句柄的方式比较直接,直接调库就可以控制,类似 appium,也有对应的 windriver。windows 上的 ui 自动化也可以考虑用图像识别 + 键鼠控制的方式来做,图像识别用 opencv,控制用 pyautogui 之类的库。

airtest 可以支持 Windows 应用的 ui 测试

可以考虑用图像识别的方式去做参考 airtest,如果是 windows 应用和 web 混合的可以考虑腾讯的框架 qt4w、qt4c

@frankxii 请教一下控制句柄的方式是怎么弄?还有 opencv+pyautogui 是怎么做自动化的?有简单的例子吗?学习一下

@Vin 这个我问一下 airtest 图像识别如果显示分辨率不同,或者窗口位置变化是否可以精准定位到要识别的内容?

我就是用这个摸索着做 UI 自动化,还有 airtest 两个混着用

老曹 回复

uiautomation 这个库其实就是使用句柄的,一个控件有很多属性,句柄只是一个识别 id,还有其他的 className, text 等等,有些控件是没有文本的,一个窗体下可能有多个相同的控件,所以类名也有可能重复。
使用句柄的只适合一些系统自动应用或.net 框架写的应用,遇到一些自定义 ui 的应用就不适用,游戏类型的也拿不到里面的控件或页面信息,这时候就可以使用图像识别 + 键鼠模拟,图像识别做模板、特征匹配定位元素,键鼠 driver 执行对应的输入,点击等操作。
可以看下网易的 air test,它不是最好的解决方案,但是基本包括了一些基础的做法,可以让你了解到怎么使用 CV+HID(human interface device) 的方式去做 UI 自动化。
https://airtest.netease.com

多年前测 windows 客户端,用的是超轻量级的 autoit

老曹 #10 · 2021年04月28日 Author

大概试用了一下 airtest,感觉并不适用我的项目,airtest 都无法识别到我的程序,而且断言靠图像识别,别人的反馈是识别率不是非常高,不过用起来感觉还是很简单,也能解决我现在的痛点,没法录制操作,每次都要先扫描再编码,再调试,有点复杂,不好推广又容易出错。

用 sikilix 去实现,语言 Java,Python 都可以,简单稳定高效,但是只适用于相同分辨率显示器

nore 回复

Sikuli X 吧

推荐 3 个:1. UIA 2. Ranorex 3. SilkTest。
另,验证结果要用 assert,不要用 if 语句。

UIA 我之前试有碰到个问题,就是对于 Windows 应用的框架有限制,好像只支持 WPF 的好像

陈辉 回复

复制粘贴—UIA suits for different UI applications, including Win32, WinForm, WPF and Silverlight.

哇,感谢推荐,这个也挺适合我的,之前用了 winAPPdriver+appium,现在换成这个了,幸亏代码写的不多。

有个收费的 squish,之前用过,挺不错。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册