今天整理自己的博客,发现已经快一年没有更新了,汗。
今天给大家介绍的是 pywinauto ,它是用 python 语言编写的开源测试工具,专用于测试 win32 应用,其 官网网址是: http://pypi.python.org/pypi/pywinauto/0.4.0
我之前做 win32 应用测试时,用过很多大家耳熟成详的工具,接触 pywinauto 之前,对它的了解也不多,然而,随着对它了解的增多,发现它借助了 python 动态对象的能力,使得代码即便于书定,也便于阅读,而且功能非常强大,最重要的一点,就是它以一种比较优雅的方式对 win32 窗体、控件进行各种操作,不再使用以往录制 - 修改代码的方式。
例如以下的例子 ( 以下代码均在英文操作系统上测试通过 :
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 的安装非常容易,此处略过。
2 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:菜单的访问