当前位置: 首页 > 后端技术 > Python

基于Python+uiautomation的WindowsGUI自动化测试概述

时间:2023-03-26 17:11:57 Python

1前言一直在使用Python进行自动化测试。最近遇到需要对桌面软件进行自动化测试,即windowsGUI。Python的GUI自动化测试工具有很多,但各有侧重。这次我将详细说明为什么选择uiautomation进行测试。2PythonGUI工具2.1常用PythonGUI编程工具详细参考:https://blog.csdn.net/NoamaNelson/article/details/113678356工具官网介绍wxPythonhttps://www.wxpython.org/wxPython是一套优秀的Python语言GUI图形库允许Python程序员轻松创建具有完整功能键的完整GUI用户界面。Kivyhttps://kivy.org/#homevy是一个开源工具包,它允许使用相同源代码创建的程序跨平台运行。它专注于创新的用户界面开发,例如多点触控应用程序。Kivy还提供了一个多点触控鼠标模拟器。目前支持的平台包括:Linux、Windows、MacOSX和AndroidFlexxhttps://flexx.readthedocs.io/...Flexx是一个用于创建图形界面应用程序的纯Python工具包。它使用网络技术呈现界面。您可以使用Flexx创建桌面应用程序以及将应用程序导出到独立的HTML文档。因为它是用纯Python开发的,所以Flexx是跨平台的。PyQthttps://www.riverbankcomputin...PyQt是Qt库的Python版本。PyQt3支持Qt1到Qt3。PyQt4支持Qt4。它的第一次发布也是在1998年,不过当时叫PyKDE,因为一开始SIP和PyQt并没有分开。PyQt是用SIP编写的。PyQt提供GPL版和商业版Tkinterhttps://docs.python.org/zh-cn...Tkinter(也称Tk界面)是Tk图形用户界面工具包的标准Python界面。Tk是一个轻量级的跨平台图形用户界面(GUI)开发工具。Tk和Tkinter可以运行在大多数Unix平台、Windows和Macintosh系统上pygt...PyGTK允许您使用Python中的图形用户界面轻松创建程序。底层的GTK+提供了各种视觉元素和功能。如果需要,您可以开发在GNOME桌面系统上运行的程序。全功能软件pyui4win域停止更新pyui4win是一个使用自绘技术的开源界面库。支持C++和python,轻松实现QQ、360安全卫士等华丽界面。而且pyui4win所见即所得的界面设计器让C++开发者和python开发者可以直接使用2.2种常见的PythonGUI自动化测试工具,详细对比参考:https://blog.csdn.net/m0_37602827/article/details/108308991tools官网介绍pywinautohttps://pypi.org/project/pywi...主要用在Application类中进行应用程序管理(打开和关闭应用程序等),窗口管理(最小化,最大化,关闭窗口)Pywin32https://pypi.org/project/pywi...包含win32gui、win32api、win32con3个子模块,用于窗口管理(定位窗口、显示和关闭窗口、获取窗口位置等)pyautoguihttps://pyautogui.readthedocs...屏幕控件(屏幕抓图等),鼠标控制(鼠标、点击、双击、右键、拖动等),键盘控制(编辑、按键等)2.3描述经过前面的介绍,我们主要用例进行自动化testing,allp的一些工具不会用到ythonGUI编程。三个常用的pythonGUI自动化测试工具,支持的平台有限,所以折腾了一番,看到大神用的是uiautomation,验证了这个工具很好用,很好用。3uiautomation简介3.1作者博客https://www.cnblogs.com/Yinkaisheng/p/3444132.html3.2uiautomation信息获取博客:https://www.cnblogs.com/Yinkaisheng/p/3444132.htmlgithub:https://github.com/yinkaisheng/Python-UIAutomation-for-Windows/blob/master/readme_cn.md3.3一般内容uiautomation是作者业余时间开发的一个python模块,供自己使用;所以直接安装:pipinstalluiautomationUIAutomation实现的自动化支持微软提供的各种界面开发框架,如Win32、MFC、WindowsForms、WPF、MetroApp、IE;另外,Qt、Firefox、Chrome实现了UIAutomationProvider,也支持UIAutomation;作者使用Python和C++为UIAutomation做了一层包装,方便自己使用,可以快速开发自动化脚本;UIAutomation支持的平台包括WindowsXP(SP3)、WindowsVista、Windows7、Windows8、8.1、10;4uiautomation使用方法4.1常用方法1.WindowControl(searchDepth,ClassName,SubName)#在窗口中查找程序。如果有中文,则需要使用Unicode;可以通过window.Exists(maxSearchSeconds)判断这个窗口是否存在;2.EditControl(searchFromControl)#找到编辑位置,找到后可以使用DoubleClick()改变电脑焦点;edit.SetValue("string")输入值;3.Win32API.SendKeys("string")#如果已经在编辑位置,可以使用该方法输入值,{Ctrl}为ctrl键,其他类似;{@8}格式可以输入8@,数字也可以实现此功能,字母不行...;4、MenuItemControl(searchFromControl,Name)#找到菜单按钮;5.ComboBoxControl(searchFromControl,AutomationI)#找到下拉框,然后在此基础上使用Select("name")方法选择需要的选项;6.BottonControl(searchFromControl,Name,SubName)#查找按钮;7.automation.FindControl(firefoxWindow,lambdac:(isinstance(c,automation.EditControl)orisinstance(c,automation.ComboBoxControl))andc.Name=='Enteryoursearchterm')#按条件搜索handle4.2句柄常用操作Click()#Click;RighClik()#右击;SendKeys()#发送字符;SetValue()#传值,一般用于EditControl;4.3windows程序常用操作subprocess.Popen('Name')#用进程打开程序;window.Close()#关闭窗口;window.SetActive()#使用;window.SetTopMost()#设为顶部window.ShowWindow(uiautomation.ShowWindow.Maximize)#窗口最大window.CaptureToImage('Notepad.png')#屏幕截图uiautomation.Win32API.PressKey(uiautomation.Keys.VK_CONTROL)#按住Ctrl键uiautomation.Win32API.ReleaseKey(uiautomation.Keys.VK_CONTROL)#释放Ctrl键automation.GetConsoleWindow()#返回运行python的控制台窗口,打开控制台automation.Logger.ColorfulWriteLine('\nIwillopenNotepad和让它自动化。请稍等。')#控制台传值(彩色字体),普通传值使用WriteLine;automation.ShowDesktop()#显示桌面;4.4Handle直接抓取并运行自动化模块枚举窗口时,支持以下参数(从doc窗口运行automation.py程序):-tintValue延迟枚举时间,单位秒-r从树根开始枚举,如果不指定,则从当前窗口枚举-dintValue枚举控件树的深度,如果不指定,则枚举整个树-f从焦点控件开始枚举,如果不指定,则从当前窗口开始枚举-c从当前窗口开始枚举光标下的控件,如果不指定,从当前窗口开始枚举-a获取光标下的控件及其所有父控件-n显示控件的完整名称,如果不指定,只显示前30个字符-m显示控件的更多属性,默认只显示控件名称四个属性示例:automation.pyc–t3,3秒后枚举当前窗口的所有控件automation.pyc–d2–t3,3秒后枚举当前窗口前三层控件automation.pyc–r–d1–t0-n0秒后从根开始枚举前两层控件,显示控件自动化全名。pyc–c–t3,3秒后显示鼠标光标下的控件信息5控件定位利用网上的Inspect.exe工具进行控件识别定位下载软件,双击打开,如下:例子设置定位控件高亮显示:例如打开计算器后,识别控件信息如下6工程实例6.1实例说明1.打开本地计算器软件;2.输入2+8计算结果3.断言结果的准确性6.2示例代码#-*-coding:utf-8-*-importunittestimportloggingimporttimeimportuiautomationimportos#@unittest.skip("skip")classTestFaultTree(unittest.TestCase):defsetUp(self)->None:#初始化os.system("calc")#开启计算time.sleep(2)self.calc=uiautomation.WindowControl(Name="calculator")self.calc_list=["two","plus","eight","equal"]self.result="10"deftearDown(self)->None:time.sleep(1)self.calc.ButtonControl(Name="CloseCalculator").Click()deftest_toolbar(self):time.sleep(1)foriinrange(0,len(self.calc_list)):self.calc.ButtonControl(Name=self.calc_list[i]).Click()time.sleep(0.5)calc_result=self.calc.TextControl(foundIndex=3).Nameprint("The计算器的结果是:",calc_result)print("Theexpectedresultis:",self.result)self.assertIn(self.result,calc_result)if__name__=="__main__":unittest.main()7示例效果8:预览会出系列文章,主要讲解如何从0到1搭建一个windowsGUI自动化测试框架,基于Python+Unittest+UIautomation+HtmlTestRunner的架构