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

random 测试交流1 135字数 2342阅读模式

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

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

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

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

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

试用代码:文章源自玩技e族-https://www.playezu.com/216531.html

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)文章源自玩技e族-https://www.playezu.com/216531.html

软件测试分为功能测试和本文转自于TesterHome,如有侵权请联系(2523030730@qq.com)删除。文章源自玩技e族-https://www.playezu.com/216531.html 文章源自玩技e族-https://www.playezu.com/216531.html

玩技站长微信
添加好友自动发送入群邀请
weinxin
rainbow-shownow
玩技官方公众号
官方微信公众号
weinxin
PLAYEZU
 
  • 版权提示:本站仅供存储任何法律责任由作者承担▷诈骗举报◁▷新闻不符◁▷我要投稿◁
    风险通知:非原创文章均为网络投稿真实性无法判断,侵权联系2523030730
    免责声明:内容来自用户上传发布或新闻客户端自媒体,切勿!切勿!切勿!添加联系方式以免受骗。
  • 原创转载:https://www.playezu.com/216531.html
    转载说明: 点我前往阅读>>>
    • cheunghr
      cheunghr 9

      收藏了,以后写游戏脚本能用到控制句柄的方式比较直接,直接调库就可以控制,类似 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大概试用了一下 airtest,感觉并不适用我的项目,airtest 都无法识别到我的程序,而且断言靠图像识别,别人的反馈是识别率不是非常高,不过用起来感觉还是很简单,也能解决我现在的痛点,没法录制操作,每次都要先扫描再编码,再调试,有点复杂,不好推广又容易出错。用 sikilix 去实现,语言 Java,Python 都可以,简单稳定高效,但是只适用于相同分辨率显示器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,之前用过,挺不错。如果是 PC 客户端内包含 WEB 页面的要怎么进行 UI 自动化?

    匿名

    发表评论

    匿名网友
    确定