之前做win32应用测试时,用过很多大家耳熟成详的工具,接触pywinauto之前,对它的了解也不多,然而,随着对它了解的增多,发现它借助了python动态对象的能力,使得代码即便于书定,也便于阅读,而且功能非常强大,最重要的一点,就是它以一种比较优雅的方式对win32窗体、控件进行各种操作,不再使用以往录制-修改代码的方式。

例如以下的例子(以下代码均在英文操作系统上测试通过:

1
2
3
4
5
from pywinauto import application
app = application.Application.start("notepad.exe")
app.Notepad.MenuSelect("Help->About Notepad")
app.AboutNotepad.OK.Click()    
app.Notepad.MenuSelect("File->Exit")    

在以上的例子中,总共只有5行代码,便可以执行注释中的各项操作。其最大的亮点出自第三行开始,其变量Notepad没有定义和声明,拿来就可以用,同样,第四行的AboutNotepad以及它后面的OK都是这样被调用。

如果在英文操作系统下,运行以上代码,可以清楚的看到软件工作的全部过程。

看到这里,大家会问,上面说的这些变量是怎么来的?为什么就可以被调用呢?

这就是pywinauto的特色,它先通过app获得某应用程序的句柄,然后用“模糊匹配”的方式去查找对应的窗口和控件,以上的例子中,由于写字板的标题是Untitled – Notepad,所以便可以用标题里的一部分,也就是Notepad去访问它,同样,用Untitled也可以。

同时,在写字板的“关于”窗口中,那个关闭按钮的标题是“OK”,所以便可以用OK去调用它。

讲了这么多,现在具体介绍pywinauto的安装和使用

1 安装

1.1安装python

安装pywinauto有两个要求:

1: python的版本不得高于2.6

2:使用python的32位版本

因此,建议大家去python官网下载其32位的python2.6并进行安装。

1.2安装依赖库

Pywinauto有两个依赖库,即

SendKeys-ctypes

SendKeys

可以去其对应网站下载、安装,也可以从本文的附件中下载,稍后会加上该附件。

说明,以上两个库以下pywinauto都有setup.py程序,用户可以在DOS命令下,运行python setup.py install进行安装,安装成功后,这些库会出现在python的安装目录的Lib\site-packages下。

1.3 安装pywinauto

只要python符合安装要求(前面说的32位,低于2.7),且安装依赖库,pywinauto的安装非常容易,此处略过。

python的开发环境(可选)

我使用Eclipse+PyDev插件进行python的开发。

具体的配置方法是

1: 下载PyDev

2: 解压,将解压后的两个文件夹features、plugins拷贝到Eclipse的dropins目录下

3:启动Eclipse,点击菜单windows->Preferences,弹出的窗口左侧应该出现PyDev节点

4:点击PyDev下的Interpreter-Python,点击New按钮,找到Python.exe的安装路径,然后点击两次确定按钮即可。

5:此时可以新建Python工程、模块,可以在Eclipse进行Python的开发和调试。

3 Pywinauto使用

3.1 关联到一个应用,用以下方法:

start_(path)
connect_(handle or processID)

以下是示例代码

app = Application()
app.start_(“notepad.exe”)
app.connect_(path = r"c:\windows\system32\notepad.exe")
app.connect_(process = 2341)
app.connect_(handle = 0x010f0c)

3.2 调用一个窗体

当初始化app后,可以通过模糊匹配的方式操作该app中的一个窗体,变量名可以是该窗体标题的部分或全部

dlg = app.window_(title_re = ".*Part of Title.*")
dlg = app.PartOfTitle

例如,对一个写字板app应用中的窗口,在英文操作系统中,其标题是“untitled - Notepad”

可以使用以下两种方式调用该窗体

app.Untitled
app.Notepad

对于关于窗口,其标题是“About Notepad”

可以使用以下名称调用该窗体

app.AboutNotepad

3.3 调用一个控件

Pywinauto使用以下顺序定位一个控件

1: 控件的标题,即title

2:控件的类名,即friendly class

3:控件的标题加类名,即title + friendly class

对于“关于”窗口的中按钮,可以使用以下任意一种方式调用

app.AboutNotepad.OK
app.AboutNotepad.Button1
app.AboutNotepad.OKButton

如果在写字板中输入文字,执行退出时会 弹出询问窗口,对于其中的“不保存按钮”,其英文标题是Don’t Save,按照上面的规律,可以使用以下任意一方式调用该按钮,即

app.Notepad.DontSave 
app.Notepad.DoSave
app.Notepad.DotSave

以上无论DontSave、DoSave、DotSave都是标题Dont’ Save的一部分,pywinauto都可以通过模糊匹配的方式找到该按钮。

3.4 控件的基本操作

如下:

Control.Click() #点击
Control.MenuSelect() #菜单选择
Control.PressMouse/MoveMouse/ReleaseMouse() #按、移动、释放鼠标
Control.TypeKeys() #键入字符

其中TypeKeys()支持组合键,例如

Ctrl: ^

Alt: %

Shift: +

以下是其常见属性的读取:

ControlID()
FriendlyClassName()
WindowText()
Rectangle()
IsEnabled()
IsVisible()

如果想了解详细,可以查看pywinauto的官方文档,其链接是

http://pywinauto.googlecode.com/hg/pywinauto/docs/controls_overview.html

在该网页里,最上方是所有控件的基本操作和属性读取,下面依次是每个控件独有的操作,在实际的编程中,如果想知道某个控件的某个操作,可以通过文档查询。

4 其它说明

4.1 和PyUnit集成

只要代码书写符合PyUnit的要求,可以很容易的让pywinauto所测试的win32应用和PyUnit集成。

4.2 和Selenium集成

Selenium支持Python语言,因此,很容易让pywinauto与selenium。

在一些测试场景中,需要运行完某个win32应用后,立刻在web应用程序中查看结果,也就是说,一个测试同时要面对win32和web两种应用,可以用python+pywinauto+selenium组合的方式实现。

4.3 代码结构

有兴趣的网友,还可以阅读其源代码,主要的几个程序是

Application.py:与app相关   
Findwindows.py:窗体的查找
Timings.py:各种操作的时间间隔设置
win32_controls.py:普通控件的访问
common_controls.py:TreeView/ListView...等控件的访问
Menuwrapper.py:菜单的访问

转自:

http://www.cnblogs.com/gannan/archive/2013/01/08/2851825.html

用pywinauto进行win32应用程序的测试的更多相关文章

  1. java.lang.UnsatisfiedLinkError: %1 不是有效的 Win32 应用程序。

    JNA 调用 dll 库时,保错: ///////////////// 通过 JNA 引入 DLL 库 //////////// /** * ID_FprCap.dll 负责指纹的采集, 指纹仪的初始 ...

  2. zw.delphi不同版本程序运行速度测试

    { zw.delphi不同版本程序运行速度测试 delphi无论是开发,编译,还是运行,速度方面向来不差,笔者很少进行这种微粒度的优化,调试. 最近,因为项目需要,发现:同一个函数模块,差不多同样的代 ...

  3. python ImportError: DLL load failed: %1 不是有效的 Win32 应用程序

    导入的时候报出了 ImportError 在windows上安装python 的模块后,导入模块时报 python ImportError: DLL load failed: %1 不是有效的 Win ...

  4. Android应用程序Monkey测试

    Monkey是Android SDK中附带的一个测试工具:Monkey用于进行压力测试,软件开发人员结合monkey打印日志和系统日志,解决测试中出现的问题. Monkey测试的特点:所有事件都是随机 ...

  5. 【转】WIN32 控制台程序

    http://blog.csdn.net/houmin0036/article/details/7702236 win32控制台项目指在32位Windows命令提示符(即所谓的dos)环境下运行的应用 ...

  6. 【转】VS2012编译出来的程序,在XP上运行,出现“.exe 不是有效的 win32 应用程序” “not a valid win32 application”

    原文网址:http://www.cnblogs.com/Dageking/archive/2013/05/15/3079394.html VS2012编译出来的程序,在XP上运行,出现“.exe 不是 ...

  7. VS2012编译出来的程序,在XP上运行,出现“.exe 不是有效的 win32 应用程序” “not a valid win32 application”

    升级vs2010到vs2012,突然发现build出来的应用程序无法运行,提示“不是有效的 win32 应用程序” or “not a valid win32 application”. 参考CSDN ...

  8. pywin32 安装错误 ImportError: DLL load failed: 不是有效的 Win32 应用程序

    pywin32 安装错误 ImportError: DLL load failed:  不是有效的 Win32 应用程序. 发现是因为没有制定Pywin32的dll所致,我们在用Pywin32开发时, ...

  9. %1 不是有效的 Win32 应用程序

    客户环境windows server 2008,iis 6.0. 站点配置与以往并无差别,更新类库后出现“%1 不是有效的 Win32 应用程序”错误,如下图: 系统登录页面可以正常加载,登录过程中出 ...

随机推荐

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

    arriveAndAwaitAdvance()方法 arriveAndAwaitAdvance()作用是当前线程已经到达屏障,在此等待一段时间,等条件满足后继续向下一个屏障执行. public cla ...

  2. 柱状堆积图Echarts

    Map<String,Object> map = new HashMap<String, Object>(); //图例的千人.双百 HashMap<String, St ...

  3. 【转】apache kafka监控系列-KafkaOffsetMonitor

    apache kafka监控系列-KafkaOffsetMonitor 时间 2014-05-27 18:15:01  CSDN博客 原文  http://blog.csdn.net/lizhitao ...

  4. VBA 每日文件按日期打包存放

    每天省出1小时,换个好心情 1.判断是否存在tempfolder (过渡文件夹) 2.不存在 则在目标目录下新建文件夹tempfolder 在网上看到一种更简单的方法 if dir("e:\ ...

  5. 2014牡丹江K Known Notation

    Known Notation Time Limit: 2 Seconds      Memory Limit: 65536 KB Do you know reverse Polish notation ...

  6. 【C语言入门教程】4.6 指针 和 数组

    数组在内存中以顺序的形式存放,数组的第一个存储单元的地址即数组的首地址.对一维数组来说,直接引用数组名就能获得该数组的首地址.指针变量可以存放于其内容相同的数组首地址,也可以指向某一具体的数组元素.通 ...

  7. js面试题

    前几天在学习js的时候,碰到了这样一道面试题,要求计算出给你一个随机乱敲的一个字符串,要求在其中找出那个字符出现的次数最多,以及出现的个数. 这你有两种方案,请大家仔细阅读,有可能在你将来的面试中会碰 ...

  8. 安卓自动化测试(2)Robotium环境搭建与新手入门教程

    Robotium环境搭建与新手入门教程 准备工具:Robotium资料下载 知识准备: java基础知识,如基本的数据结构.语法结构.类.继承等 对Android系统较为熟悉,了解四大组件,会编写简单 ...

  9. Mac Mini中添加VNC访问

    开启Mac Mini上面的VNC. 1) 打开“系统偏好设置”(System Preference),双击打开“共享”(Sharing)项. 2)在左侧将“屏幕共享”(Screen sharing) ...

  10. Codeforces 271 Div 2 A Keyboard

    题目链接:http://codeforces.com/contest/474/problem/A 解题报告:一个矩形的键盘,上面只有规定的字符,现在按的时候总是会向某个方向按偏,也就是输入一串字符后, ...