接下来,通过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里的类,并返回通过、错误、失败的测试数量以及运行时间。