Pywinauto在Windows Twain Driver自动化测试中的应用研究

摘  要: 以Python为基础,结合对Twain Driver测试工具的具体需求,将Pywinauto引入到Twain Driver的自动化测试中。介绍了Pywinauto的基本概念,通过测试用例说明Pywinauto在自动化测试中的具体实现。应用结果表明,该方法大大提高了测试的自动化程度,极大地减少了Twain Driver测试的工作量,同时也确保了测试质量。
关键词: Python;Pywinauto;Twain Driver;自动化测试

 Windows下扫描仪驱动程序主要使用Twain协议[1]。由于Twain协议的复杂性,Twain Driver一般会以图形界面方式提供众多扫描选项以供用户使用。扫描选项数量众多以及选项之间的依赖性,决定了Twain Driver的测试是一项非常艰巨的任务。Twain Driver的测试主要包括基本功能测试以及回归测试。一般一个Twain Driver包含近百个基本功能测试用例以及随着缺陷数量增长而不断增加的回归测试用例。特别是临近产品正式发布日期时,每修正一个缺陷,都会带来极大的工作量:一方面,要做基本功能测试检查是否有新的缺陷;另一方面,要做回归测试检查之前已修正好的缺陷是否受到影响。由于此时产品已处于开发周期的后期阶段,缺陷的基数通常会比较大,回归测试的测试用例将变得非常庞大。更重要的是,如果有多个缺陷需要修正,那么以上两个方面的测试还将重复执行多次,测试工作将成倍增长。
 针对以上问题,本文以Python为基础,结合对Twain Driver测试工具的具体需求,提出了一个基于Pywinauto实现自动化测试的解决方案[2]。Pywinauto通过模拟测试人员在用户界面上的鼠标、键盘操作,来减少测试人员的手工操作。应用结果表明,该方案能够极大地提高测试效率,在减少了测试时间的同时,也确保了产品质量。
1 Pywinauto的基本概念
    Pywinauto是基于Python开发的,用于自动化测试的脚本模块的第三方扩展包,它通过向Windows对话框和控件发送鼠标、键盘动作来实现Windows图形界面的自动化测试[3]。
1.1 标识应用程序实例
 Pywinauto在使用前首先需要将应用程序实例连接到一个进程,有两种标识方法分别对应两种情况:
 (1)应用程序未启动即应用程序实例不存在:此时可以调用start_(self,cmd_line,timeout=app_start_timeout)来启动应用程序。示例如下:
gAppName=ur"C:\\Program Files\\TWAIN Working Group\\ TWAIN Toolkit\\Twack_32.exe"
app=application.Application().start_(gAppName)
 (2)应用程序已启动:此时只需调用connect_(self, **kwargs)连接到已运行的应用程序。示例如下:
AppName=ur"TWAIN_32 Twakcer"
app=application.Application().connect_(title_re= AppName)
1.2 标识应用程序窗口
 在取得应用程序实例之后,就可使用该实例标识应用程序窗口,主要有3种标识方式:
 (1)使用窗口标题。示例如下:
gWizardName="Select"
MainDlg=app[gWizardName]
或者将窗口标题直接当成一个变量形式使用,但这样标识,非英文语系时窗口会出现问题,所以这种方法并不推荐。示例如下:
MainDlg=app.Select
 (2)窗口标题结合正则表达式,特别是当窗口标题不确定或经常变化时尤为有用。示例如下:
dlg=app.window_(title_re=".*doc",class_name="#33888")
 (3)直接取最上层窗口。此时需要确保被标识的应用程序窗口为顶层窗口。示例如下:
MainDlg=app.top_window_()
1.3 标识应用程序窗口控件
 Pywinauto的测试原理主要模拟控件上的手工操作,所以Pywinauto自动化测试中重要的一环就是标识应用程序窗口上的控件。假设应用程序窗口有一内容为OK的Button控件,主要有两种方式标识这个控件:
 (1)使用窗口控件标题。示例如下:
app["dlg"]["OK"]
或者将控件标题直接当成一个变量形式使用。与标识窗口类似,这种方法也不推荐。示例如下:
app.dlg.OK
 (2)使用Friendly class,特别是当控件标题内容为空时尤为有用。示例如下:
Dialog.Button1
 需要说明的是:Button、Button0及Button1都是代表第一个Button,Button2代表第二个Button。标准控件通过Friendly class很容易标识出来,但是非标准控件其Friendly class并不明显,这时可通过Visual Studio自带的Spy++来查看,如图1所示。

1.4 如何操控鼠标与键盘
 在取得Windows对话框和控件后,就可以向对话框或者控件发送鼠标、键盘操作来实现自动化测试。
鼠标的操作:(1)点击操作:模拟鼠标的点击操作可以结合具体的控件,Pywinauto对于不同的控件提供了不同的函数。例如,模拟Next Button的点击事件可以表示为Dialog.["Next"].Click();模拟ComboBox 控件的选择操作可以使用如下方式:Dialog.ComboBox1.Select(1)。(2)拖动操作:主要使用PressMouse()、MoveMouse()和ReleaseMouse()实现鼠标的按下、移动以及释放操作。示例如下:
def AdjustSize (WizardDlg,ShiftX,ShiftY):
        Offset=10
        OrgRect=WizardDlg.WiaControl1.Rectangle()
    WizardDlg.WiaControl1.PressMouse(coords=(Offset,Offset))
        WizardDlg.WiaControl1.MoveMouse(coords=(Offset+ShiftX,Offset+ShiftY))
        WizardDlg.WiaControl1.ReleaseMouse()
按键的操作:Pywinauto使用SendKeys来进行按键处理[4]。一些程序并不会将菜单项指定给主UI(如Word),这样就不能直接使用菜单方法,而是使用快捷键的方式,这就需要使用SendKeys发送快捷键。如要表示按下Alt+F组合键,可以写成MainWin.TypeKeys("%F")。需要说明的是:TypeKey还可表示按照一定时间间隔接受多个组合按键。例如,在Word2003打开从扫描仪导入图片的窗口,需要先按Alt+I,然后按Alt+P,最后按Alt+S。用SendKeys可以表示为:
MainWin.TypeKeys("%IPS",pause=0.5)
1.5 中文支持
 Pywinauto在对中文应用的菜单进行操作时,通常会由于编码问题而使中文应用的对话框和控件无法进行标识。可以使用以下两种方法解决:
 (1)使用"u"或者"ur"将字符串转换成UTF格式的字符串。例如:
gDialogName=u"选择来源"
gButtonName=u"选定"
app[gDialogName][gButtonName]
 (2)使用decode函数强行转换字符串编码。例如:
CP="cp936"
gDialogName="选择来源".decode(CP)
gButtonName="选定".decode(CP)
app[gDialogName][gButtonName]
2 Twain Driver自动化测试实现
 由于Twain协议使用的广泛性,目前已经有很多应用程序支持该协议。Windows下常见的应用程序主要有Twack_32、Microsoft Word、PageManager 以及Adobe Photoshop等,这些应用程序均可作为Twain Driver的测试工具。其中Twack_32是TWAIN官方所提供的一个工具,其兼容性最好,而且它不仅提供了TWAIN应用的例程,还可以在计算机系统上安装一个虚拟的图像输入设备(TWAIN_32SampleSource),所以测试人员通常使用Twack_32对Twain Driver进行测试。本文也以Twack_32为例实现Twain Driver的自动化测试。
2.1 Twack_32启动的实现
 下载并安装完后,打开Twack_32界面,然后依次选择File->Select Source,弹出一个对话框,如图2所示。

 实现时,首先通过调用start函数启动应用程序获取应用程序实例,然后利用该应用程序实例和界面的标题(TWAIN_32 Twacker)取得应用程序窗口实例,最后根据应用程序窗口实例取得控件标识,之后就可以操纵该控件了。中文菜单可使用"u"转换字符串。实现代码如下:
AppName=′TWAIN_32 Twacker′
TWAINDS_NAME=′SP C240SF/C242SF LAN 0.59 (32-32)′
def RunTwack():
      app=application.Application()
  app.start_(ur"C:\\Program Files\\TWAIN Working Group\\TWAIN Toolkit\\Twack_32.exe")
   app[AppName].Wait(′ready′)
   app[AppName].MenuSelect("File->Select Source...")
   app[u′选择来源′].Listbox1.Select(TWAINDS_NAME)
   app[u′选择来源′][u′选定′].Click()
   return app
2.2 自动化测试实现
 Twack_32成功启动后,如果安装了需要测试的驱动,将会出现被测Twain Driver的界面,图3为某一驱动的界面,以下实现也以此驱动为例。

 该驱动支持三种扫描模式,分别是:Full Color、Gray和Black and White。假设需要测试该驱动的扫描模式是否实现正确,首先需要将mode改为Full Color,其他参数不变,扫描并观察图片是否正确;然后依次将mode改为Gray 和 Black and White并重复以上操作。使用Pywinauto实现对扫描模式的自动化测试。实现时尽量将每一个测试案例用一个相应的函数实现,有利于测试脚本的后期维护。示例代码如下:
 DriverName=′SP C240SF/C242SF LAN′
 def SetScanParameter(ScanApp,nPaperSource,nColorModelItem, nDPIItem,nSizeIndex):
    WaitForWindowIsReady(ScanApp[DriverName])
    ScanApp[DriverName].ComboBox.Select(nPaperSource)
    WaitForWindowIsReady(ScanApp[DriverName])
    ScanApp[DriverName].ComboBox2.Select(nColorModelItem)
    ScanApp[DriverName].ComboBox3.Select(nDPIItem)
    ScanApp[DriverName].ComboBox4.Select(nSizeIndex)
    ScanApp[DriverName].Scan.Click()
    time.sleep(0.5)
def ScanImageWithTwackChangeMode(ScanApp, nColorModelItem)
SetScanParameter(ScanApp,1, nColorModelItem,1,2)def TestColorMode(ScanApp)
ScanImageWithTwackChangeMode(ScanApp,1)
ScanImageWithTwackChangeMode(ScanApp,2)
ScanImageWithTwackChangeMode(ScanApp,3)
 本文以Twain Driver为例介绍了Pywinauto在图形界面自动化测试中的应用与实现。Pywinauto通过模拟测试人员在用户界面上的鼠标、键盘操作来减少测试人员的手工操作。实现时,将各个测试用例对应一个函数,然后根据测试需求调用相应的函数。由于基本功能测试时测试用例相对稳定,所以脚本一旦写好,以后每次发布版本前只需运行一次脚本即可完成基本功能测试。而在回归测试阶段,每增加一个测试用例,便增加一个相应的实现函数,从而避免遗漏对之前版本缺陷的测试。此外,本文的方案只需稍作修改,便可应用于其他Windows图形应用程序的测试,特别是程序界面手动操作比较复杂时,该方案的效果更加明显。
参考文献
[1] TWAIN—standard for image acquisition devices[DB/OL].http://twain.org.2001.
[2] 辛敏杰,高建华.一种改进的GUI测试框架DART[J].计算机工程,2009,35(7):55-58.
[3] Contents-pywinauto v0.4.1 documentation[DB/OL]. http://pywinauto.googlecode.com/hg/pywinauto/docs/contents.html,2010.
[4] SendKeys|Rutherfurd.net[DB/OL]. http://www.rutherfurd.net/python/sendkeys,2008.

转自:

http://www.hqew.com/tech/fangan/734726.html

时间: 2024-10-10 06:52:15

Pywinauto在Windows Twain Driver自动化测试中的应用研究的相关文章

windows平台UI自动化测试

原文地址:http://www.51testing.com/html/16/n-170116.html 以前写过一篇跟UI自动化 测 试有关的技术,谈到了一个自动化测试工具必备的几个功能,而且也提到了Windows平台自动化测试工具所基于的一些技术.下边就说 一下这些技术的比较和展望,同时也包含了一些纠结-- Windows API 识 别窗口:需要通过FindWindow和EnumWindows来查找到窗口句柄,然后再调用其它 API(GetWindowText,GetWindowRect,

(转)Web自动化测试中的接口测试

1.背景 1.1 Web程序中的接口 1.1.1 典型的Web设计架构 web是实现了基于网络通信的浏览器客户端与远程服务器进行交互的应用,通常包括两部分:web服务器和web客户端.web客户端的应用有html,JavaScript,ajax,flash等:服务器端的应用非常丰富,比如java的servlet,jsp,ssh框架,.net的aspx,还包括其他脚本如php,python. web服务器端的设计架构近年来一直比较流行的是三层架构(3-tier application),通常意义上

app自动化测试中的相关api

这个说的api即python自动化测试中经常会使用到的一些api,具体如下: 1.find_element_by_id/find_elements_by_id 定位元素api,使用方法如下: driver.find_element_by_id('digit8') 2.find_element_by_name 定位元素api,使用方法如下: driver.find_element_by_name('8') 3.find_element_by_accessibility_id 定位元素api,使用方

web自动化测试中的八大定位方法,推荐使用xpath

web自动化测试中的定位方法,常用相对路径来定位,推荐使用 xpath 定位 在百度进行定位 # 引入库 from selenium import webdriver # 打开谷歌浏览器,建立会话.启动Chromedriver.exe 打开Chrome driver = webdriver.Chrome() # 启动谷歌浏览器 # driver = webdriver.Firefox() # 启动火狐浏览器 # driver = webdriver.Ie() # 启动IE浏览器 # 访问百度首页

Windows Phone 8.1中数据显示控件基石------ItemsControl

在Windows Phone 8.1中数据显示交互控件无外乎FlipView,ListView,GridView等,但我们用的时候总不能直接写 <FlipView/>,<ListView/>,<GridView/>之类来使用吧,虽说这样也可以,但这样呈现出来的画面就很难看了,哪 个用户会高兴看呢,反正我是不高兴看. 在这里问题就来了,不光要求数据能绑定到位,功能也到位,界面也总得美化美化吧. 好了进入正题了: 这些数据呈现控件的基石是谁呢?当然是ItemsControl

windows平台在tomcat中启动cas报错解决

windows平台在tomcat中启动cas报错: Caused by: java.lang.UnsatisfiedLinkError: Could not load library. Reasons: [no jansi in java.library.path, 系统找不到指定的路径.] 解决办法:将jansi.dll文件放到C:\Windows\System32目录下即可. 注意:jansi.dll文件在使用gradle编译打包cas时会下载到C:\Users\${用户名}\.gradle

Windows Server 2012 R2中通过IIS实现AD帐号密码修改功能

现在越来越多的企业会对AD帐号进行分类,例如将业务帐号.服务帐号同员工帐号分开管理,那么这类帐号也会因为业务应用特定类型而选择是否开启邮箱功能,再或者有些企业会采用腾讯企业邮箱或网易企业邮箱等等,这些平台本身同AD域是独立的,而且很多企业又使用MAC系统或计算机根本不加域,这时企业内网要搭建OA.WIKI.JIRA等一些需要调用AD中的LDAP让员工登录的系统时,则面临后期密码到期后用户没有入口去修改密码的问题.那么在今天我就要给大家介绍的是如何利用Windows Server 2012 R2中

怎样修复“Windows/System32/Config/System中文件丢失或损坏”故障

怎样修复“Windows/System32/Config/System中文件丢失或损坏”故障 英文原文引自 http://xphelpandsupport.mvps.org/how_do_i_repair_a_missing_or_cor1.htm 此类错误通常说明计算机由于注冊表的原因不能启动,下列操作应该可以修正以上错误.然而,须要特别注意的是,你须要将5个注冊表区域所有进行替换.仅仅简单的替换一个或者两个将会潜在的导致其它的错误 注意 假设你使用的是WindowsXP的OEM版本号,那么你

在Windows控制台应用程序中使用CString

CString是在windows平台下开发中经常使用的字符串类, CString已从MFC中剥离出来了,可以单独使用,只需引用atlstr.h头文件即可. 1 include "stdafx.h" 2 #include <atlstr.h> 3 #include <iostream> 4 5 using namespace std; 6 7 int _tmain(int argc, _TCHAR* argv[]) 8 { 9 //控制台应用程序中使用CStrin