用pywinauto进行win32应用程序的测试

系统 2372 0

今天整理自己的博客,发现已经快一年没有更新了,汗。

今天给大家介绍的是 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 的安装非常容易,此处略过。

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.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:菜单的访问
    

用pywinauto进行win32应用程序的测试


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论