开发者社区> 技术小美> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

pywinauto 自动化框架调研

简介:
+关注继续查看

什么是Pywinauto?
Pywinauto是基于Python开发的,用于自动化测试的脚本模块,主要操作于Windows标准图形界面。它可以允许你很容易的发送鼠标、键盘动作给Windows的对话框和控件。
其中,最主要功能为对windows标准控件的一系列动作可编程处理。包括对窗口的指定、鼠标或键盘操作、获得控件属性等等。程序的开始为对所需应用的启动或连接。获得程序连接后,pywinauto通过窗口的名称、类名、是否可见等属性寻找匹配的窗口,进而通过类似方法寻找用户所需的控件,并获得相应的句柄。之后,用户可通过易理解的编程方式对指定控件进行相关操作的编程,包括鼠标点击、键盘输入、判断控件间关系、获取控件属性等。


结构介绍
外结构



Pywinauto是建立在CPython之上的python应用模块,实现原理由C做底层实现,因此与JPython不能兼容。 
Python for windows 模块,使得windows api函数有了相应的python接口,其中的ctypes和win32api模块为api函数的对应应用封装了较为完善的接口集合。

 

内结构


 

程序的入口及对指定窗口或控件的操作,定义在application.py中。其中Application类进行对应用的开启和连接,WindowSpecification类自动映射到指定的窗口或控件上。 
HwndWrapper?.py,win32_controls.py,menuwrapper.py,common_controls.py中为Pywinauto对标准控件操作的定义。控件都由HwndWrapper类继承而来,其中对控件共有的基本属性进行了定义。在控件自己的定义中,对HwndWrapper类的一些属性进行了重载,同时也定义了具有自己特色的属性和操作。对控件属性值的获取和操作定义在handleprops.py,controlsproperties.py文件中。 
Win32defines.py,win32functions.py,win32structures.py文件中,为pywinauto对底层函数操作的定义和索引。其底层调用的是python的ctypes库函数所提供的接口。Ctypes库中封装了系统所使用的C语言数据类型和windows api函数操作等模块,并提供了相应的python语言接口,使用户通过python可对系统进行操作。

 

操作方法
通常采用的使用格式为: 
app = application.Application()
app.start_( )
app.window.control.Click() 
app[window][control].Click()


接下来,通过app[u‘无标题 – 记事本’][‘Edit’].Click()来介绍Pywinauto的控件操作流程:
通过app = application.Application() 创建应用,app.start_()启动或app.connect_()连接应用。之后向下层函数传递criteria,内容为[{‘process’ = 4320L, ‘ best_match’ = ‘无标题 - 记事本’}]。通过WindowSpecification._resolve_control( ) -> findwindows.py 寻找匹配的窗口。可通过process (或者class name, control_id等)找到handle,得到它是一个DialogWrapper类的结果。对于多个记事本已开启的情况,pywinauto会通过best_match进行匹配,使用Unique_dict数据结构,对各个窗口实行串匹配算法,选取匹配率最大的窗口句柄返回。
之后通过类似方法找到Edit控件,认定其为EditWrapper类,并找到类定义中的Click操作。 操作的具体实现还要依靠 handleprops.py的支持,底层调用 windows api函数实现。

功能分析
优点: 
a. 方便实现对windows标准控件的各种鼠标、键盘操作。 
b. 通过title、部分title、class name、是否可见等属性得到窗口或控件的句柄和指定。 
c. 方便得到控件的各种属性,包括内容、title、大小、坐标、是否可用等。 
d. 易于扩展。源于Python脚本语言的易扩展性,可以扩展pywinauto的功能,也可以将pywinauto作为一个模块引入更大的功能库。
 
局限性: 
a. 对非windows标准控件的操作无法实现。(为此,在测试中,我们为非标准控件的操作制作了C底层库及相应python函数接口,扩展了pywinauto) 
b. 无法实现对系统时间的调整和性能评测。(e.g. 不能做time.sleep()的内部调整) 
c. pywinauto仅局限于界面的自动化操作,其他系统操作(如网络操作)无法实现。 
d. 对于已知流程的操作编程较方便,但对于不可知流程或需要判断的流程操作,功能有限。


对Pywinauto的扩展

自动化测试中,对Pywinauto的扩展主要在以下两个方面:
虚拟控件操作的增加
底层调用HiUILib库函数实现。在win32_controls中加入VConWrpper类和相关操作实现,并在窗口指定的过程中增加相应寻找分支,使得对虚拟控件的定位和操作与标准控件基本相同。
其他实用操作的增加
在调研的过程中,我们发现了一些其他实用的操作。因此在操作中,我们将需要的函数加入到application,hwndWrapper等文件中,并增加了多处对win32api等库的函数调用。例如注册表项的增删改操作。


case组织

我们采用Python的unittest模块的基本结构,来组织自动化case。每一个大的功能模块,为一个类,继承与unittest.TestCase。通过在测试类中添加函数的形式,对测试类中的每一个测试点(即case)进行代码编写。测试类中,一定要覆盖的是setUp()和tearDown()函数,作为每一个单元测试函数的入口和出口。Unittest提供TestSuite类来集合和组织测试类中的多个测试函数。同时,提供了TextTestRunner类来运行TestSuite里的类,并返回通过、错误、失败的测试数量以及运行时间。

 

(作者:liurong)

 












本文转自百度技术51CTO博客,原文链接:http://blog.51cto.com/baidutech/743853,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
聊一聊,Python自动化测试框架
在Python语言系中,有很多可用的自动化测试框架,比如早期大多数人会选用 unittest+HTMLTestRunner、Nose等,最近几年比较常用的有Robot Framework,Robot Framework它是Python下一款非常通用的测试框架,采用扩展插件的机制可以帮助我们实现几乎任何类型的自动化测试工作,如接口自动化测试、App自动化测试、Web UI自动化测试等。
65 0
测试利器 | 一款开源的Diffy自动化测试框架:超详细实战教程讲解
测试利器 | 一款开源的Diffy自动化测试框架:超详细实战教程讲解
73 0
Python+Appium自动化测试(11)-location与size获取元素坐标
appium做app自动化测试过程中,有时需要获取控件元素的坐标进行滑动操作。appium中提供了location方法获取控件元素左上角的坐标,再通过size方法获取控件元素的宽高,就可以得到控件元素更多的坐标。
133 0
云与数字化转型的样板:Twilio十年,终入牛市
2008年,一家叫作Twilio的创业公司成立了。这家只比AWS晚了两年出现的创业公司,专注于云通信协作服务,主要为企业提供基于云的通信、企业呼叫中心和联络中心解决方案。按照亚马逊的实践经验,一项新的互联网服务要想成功,至少需要十年的时间。2018年,Twilio进入了牛市。
92 0
Python 自动化-pywinauto库定位树结构控件里的树节点实例演示
Python 自动化-pywinauto库定位树结构控件里的树节点实例演示
124 0
Springboot中使用Xstream进行XML与Bean 相互转换
在现今的项目开发中,虽然数据的传输大部分都是用json格式来进行传输,但是xml毕竟也会有一些老的项目在进行使用,正常的老式方法是通过获取节点来进行一系列操作,个人感觉太过于复杂、繁琐。
3407 0
Auty自动化测试框架第一篇——生成执行列表
[本文出自天外归云的博客园] 在Auty的scripts文件夹中编写一个create_selection.py文件,用于在同级目录下针对同级目录scripts下的所有脚本生成一个selection.txt文件,其中包含所有同级目录scripts文件夹下可执行的python脚本: 代码如下: ...
782 0
[家里蹲大学数学杂志]第235期$L^p$ 调和函数恒为零
设 $u$ 是 $\bbR^n$ 上的调和函数, 且 $$\bex \sen{u}_{L^p}=\sex{\int_{\bbR^n}|u(y)|^p\rd y}^{1/p}
599 0
+关注
6819
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载