今天整理自己的博客,發現已經快一年沒有更新了,汗。
今天給大家介紹的是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:菜單的訪問