摘  要: 以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

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

  1. Python+selenium自动化测试中Windows窗口跳转方法

    Python+selenium自动化测试中Windows窗口跳转方法 #第一种方法 #获得当前窗口 nowhandle=driver.current_window_handle #打开弹窗 drive ...

  2. app自动化测试中的相关api

    这个说的api即python自动化测试中经常会使用到的一些api,具体如下: 1.find_element_by_id/find_elements_by_id 定位元素api,使用方法如下: driv ...

  3. Python结合Pywinauto 进行 Windows UI 自动化

    转:Python结合Pywinauto 进行 Windows UI 自动化 https://blog.csdn.net/z_johnny/article/details/52778064 说明:Pyw ...

  4. web自动化测试中绕开验证码登陆的方式

    web自动化测试中登陆需验证码是很大的一个困扰.现推荐一种简单的避开验证码登陆的方式,先代码进入登录页,人工输入验证码登录后浏览器自动保存cookie,再在新的标签中登录. 具体代码如下: publi ...

  5. Web UI自动化测试中绕开验证码登陆方式浅谈

    web自动化测试中让测试者感到困惑的是登陆验证码,每次都不一样.现在推荐一种绕开验证码登陆的方式,其实就是将web浏览器获取的登陆cookie加载到程序中就可以了,这样程序就会认为你已经登陆,就可以跳 ...

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

    1.背景 1.1 Web程序中的接口 1.1.1 典型的Web设计架构 web是实现了基于网络通信的浏览器客户端与远程服务器进行交互的应用,通常包括两部分:web服务器和web客户端.web客户端的应 ...

  7. JAVA 自定义注解在自动化测试中的使用

    在UI自动化测试中,相信很多人都喜欢用所谓的PO模式,其中的P,也就是page的意思,于是乎,在脚本里,或者在其它的page里,会要new很多的page对象,这样很麻烦,前面我们也讲到了注解的使用,很 ...

  8. python web自动化测试中失败截图方法汇总

    在使用web自动化测试中,用例失败则自动截图的网上也有,但实际能落地的却没看到,现总结在在实际应用中失败截图的几种方法: 一.使用unittest框架截图方法:   1.在tearDown中写入截图的 ...

  9. opencv图像识别技术在自动化测试中的应用

    在自动化测试中,基于xpath.js选择器.css选择器进行元素定位及判定的技术已经比较成熟.在实际应用中,无论是web端还是移动端,仍有很多时候需要根据页面内容.页面中的图像进行定位及判定,这里介绍 ...

随机推荐

  1. js实现99乘法表

    实现99乘法表(输出到页面上) * document.write("<table border='1' bordercolor='blue'>"); //循环行 9 f ...

  2. Java并发编程核心方法与框架-ScheduledExecutorService的使用

    类SchedukedExecutorService的主要作用是可以将定时任务与线程池功能结合. 使用Callable延迟运行(有返回值) public class MyCallableA implem ...

  3. zookeeper运维 --【】转】

     from:http://blog.csdn.net/hengyunabc/article/details/19006911  zookeeper运维 尽管zookeeper在编程上有很多的阱陷,AP ...

  4. c# 多线程 --Mutex(互斥锁)

    互斥锁(Mutex) 互斥锁是一个互斥的同步对象,意味着同一时间有且仅有一个线程可以获取它. 互斥锁可适用于一个共享资源每次只能被一个线程访问的情况 函数: //创建一个处于未获取状态的互斥锁 Pub ...

  5. 关于php cgi的配置

    http://blog.csdn.net/xiaolei1982/article/details/7103850 1,查看php-cgi的进程数 netstat -anpo | grep " ...

  6. HDOJ 3709 Balanced Number

    数位DP... Balanced Number Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java ...

  7. Spark之命令

    Spark之命令 1.spark运行模式有4种: a.local 多有用测试, b. standalone:spark 集群模式,使用spark自己的调度方式. c. Yarn: 对Mapreduce ...

  8. Ubuntu 14 安装Java(JRE、JDK)

    JRE vs OpenJDK vs Oracle JDK JRE(Java Runtime Environment),它是你运行一个基于Java语言应用程序的所正常需要的环境.如果你不是一个程序员的话 ...

  9. Ajax的使用

    Ajax是JQuery实现XMLHttpRequest的一种方式. 增加HTML5按钮,含有点击事件: <button type="button" class="b ...

  10. redis.1--SDS结构

    1. Redis 没有直接使用c语言的字符串(以空字符结尾的字符数组),而是自己构建了一 种名为简单动态字符串(Simple Dynamic String , SDS),并将SDS做为         ...