利用UIAutomation库测试Windows应用(二)
项目代码中还要夹杂着大量的图片,对于整个项目来说,庞大的数据量里90%都是图片,对于编码者和使用者都会造成困扰,那么Windows平台的自动化测试框架就有了学习和使用的价值了。
前面已经学习的自动化测试框架,除SikuliX之外都只能对B/S架构的系统进行自动化 测试,而Windows平台下的C/S架构用SikuliX来做自动化,可靠性、可维护性比较差。
项目代码中还要夹杂着大量的图片,对于整个项目来说,庞大的数据量里90%都是图片,对于编码者和使用者都会造成困扰,那么Windows平台的自动化测试框架就有了学习和使用的价值了。
目前Windows平台下自动化工具有:Windows API, MSAA - Microsoft Active Accessibility, UIAutomation
Windows API 通过FindWindow和EnumWindows来查找到窗口句柄,然后再调用其它 API(GetWindowText,GetWindowRect, GetWindowLong…)来获取窗口属性,以此来找到想要的控件(窗口),AutoIt工具就是Windows API的技术体现。
MSAA 提供一套接口,让开发人员可以方便的给残疾人开发可以使用的软件,比如读屏程序(鼠标移动到按钮的时候,可以发出声音,辅助视力障碍的人操作电脑),从而实现微软将电脑普及到每一个家庭的梦想。
它本身设计不是为了测试,但它提供一套接口,可以通过调用接口来达到测试的目的,也是目前主流Windows平台测试的基础,通过对其再次封装实现对系统软件的调用和测试。
UIAutomation是微软在MSAA的基础上,对MSAA进行封装,重新设计并实现了 UIAutomation的类库(.Net),微软根据自动化测试的需求,重新实现了一套自动化体系。
实 验 目 的
(1).熟练应用UIAutomation完成针对Windows应用程序的自动化测试。
(2).能够在实际测试项目中综合运用Web和Windows应用自动化测试技术完成复杂的测试操作。
实 验 流 程
UIAutomation API
1.uiautomation方法
(1) WindowControl(searchDepth,ClassName,SubName)
查找窗口中的程序;可用window.Exists(maxSearchSeconds)来判断此窗口是否存在;
WindowContrl类下面有四个方法:
(1) SetTopmost(True):将窗体设置为顶层;
(2) MoveToCenter():将窗体居中显示;
(3) MetroClose():关闭win8以后出现的新菜单MetroUI;
(4) SetActive():设置一个程序被执行得间隔时间。方法可以这样在python中使用,代码如下:
以计算器为例 calcwindow = uiautomation.WindowControl(searchDepth=1, Name='计算器') #窗体居中显示 #窗体置顶 #控制操作间隔 #只针对win8,关闭MetroUI |
(2)EditControl(searchFromControl)
查找编辑位置,找到后可用DoubleClick()来改变电脑的focus;edit.SetValue("string")输入值,此类继承其父类的所有非私有方法。常用方法使用代码如下:
edit = uiautomation.EditControl(searchFromControl = musicwindow, foundIndex = 1,ProcessId='xxxx') #点击元素,将光标放入元素中 edit.Click() #先文本框输入文字 edit.SendKeys(‘你好!’) |
(3)Win32API.SendKeys("string")
如果已在编辑位置,则可用此方法来输入值,{Ctrl}为ctrl键,其他类似;{@ 8}格式可输入8个@,对于数字也可实现此功能,但对于字母不能,源码代码量较大,这里就不展示了,大家可以在python中自行查看,此类的功能非常多,涉及鼠标、键盘以及窗体的操作。常用输入信息代码如下:
#已经有光标在输入框内的时候,也可以直接使用 uiautomation.Win32API.SendKeys(‘你好!’) |
(4)MenuItemControl(searchFromControl,Name)
使用代码如下:
mubar = uiautomation.MenuBarControl(searchFromControl = musicwindow, foundIndex = 1,ProcessId='xxxx') mubar.Click() |
(5)ComboBoxControl(searchFromControl,AutomationId)
查找下拉框,然后在此基础上用Select("name")方法来选择需要的选项;
(6)BottonControl(searchFromControl,Name,SubName)
查找按钮;
calcwindow = uiautomation.WindowControl(searchDepth=1, Name='计算器') calcwindow.ButtonControl(Name='7').Click() |
(7)automation.FindControl(firefoxWindow,lambda c:(isinstance(c, automation.EditControl)
or isinstance(c, automation.ComboBoxControl)) and c.Name == 'Enter your search term')
按条件搜索handle
baiduedit = automation.FindControl(huohu,lambda c,d:isinstance(c,automation.EditControl), foundIndex=3) |
2.对找到句柄常用操作
(1)Click() 点击;
(2)RighClik() 右键点击;
(3)SendKeys() 发送字符;
(4)SetValue()传值,一般对EditControl用;
3.对windows程序常用操作
(1)subprocess.Popen('Name') 用进程打开程序;
(2)window.Close() 关闭窗口;
(3)window.SetActive() 使用;
(4)window.SetTopMost() 设置为顶层
(5)window.ShowWindow(uiautomation.ShowWindow.Maximize) 窗口最大化
(6) window.CaptureToImage('Notepad.png') 截图;
(7)uiautomation.Win32API.PressKey(uiautomation.Keys.VK_CONTROL) 按住Ctrl键
(8)uiautomation.Win32API.ReleaseKey(uiautomation.Keys.VK_CONTROL) 释放Ctrl键
(9)automation.GetConsoleWindow() #return console window that runs python,打开控制台
(10)automation.Logger.ColorfulWriteLine('\nI will open <Color=Green>Notepad</Color> and
<Color=Yellow>automate</Color> it. Please wait for a while.') 控制台传值(彩色字体),普通传值用WriteLine;
(11) automation.ShowDesktop() 显示桌面;
由于本章技术内容较多,所以分为三部分来分享,下周分享UIAutomation使用中的问题等内容。
回顾前期内容,请点击:核心实验:利用UIAutomation库测试Windows应用(一)