27
10

利用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='计算器')

#窗体居中显示
calcwindow.MoveToCenter()

#窗体置顶
calcwindow.SetTopmost(True)

#控制操作间隔
calcwindow.SetActive(20)

#只针对win8,关闭MetroUI
calcwindow.MetroClose(10)


(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)
baiduedit.SendKeys(u"在线工具库",0.5)

 

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应用(一)




为了答谢大家对蜗牛学院的支持,蜗牛学院将会定期对大家免费发放干货,敬请关注蜗牛学院的官方微信。

20190320_095757_834.jpg




版权所有,转载本站文章请注明出处:蜗牛学苑, https://www.woniuxy.cn/article/544