Windows應用程式的自動化測試 by Python

Windows應用程式的自動化測試 by Python

這篇文章主要說明遇到 Windows native UI 時候或是Windows Application 時,如何進行自動化測試?

Selenium的自動化測試僅限於 Web UI,對於 Windows UI 或是 Windows 應用程式(例如小算盤)往往無法處理。

有什麼方式可以直接在 python 處理Windows UI 而不需要額外呼叫外部 AutoIT 所編譯的 EXE?

這篇文章介紹兩個方式,不儘 Windows 適用,Mac/Linux 也可以。最後給完整的程式範例說明。

 

方法一:畫面圖形比對的方式 PyAutoGUI

工具主角:PyAutoGUI

安裝方式

pip    install   PyAutoGUI

 

優缺點

這個方式最大的好處是跨平台 Windows, Mac, Linux 都可以適用,因為採用圖形比對的關係也比較直覺。

缺點就是圖形比對來找畫面元件的操作方式,誤判或是失敗的機率會比較高。

另外,由於主要是用滑鼠作標的關係,因此螢幕解析度也有可能會影響程式的進行。

實作範例

安裝結束之後,先確定螢幕解析度可以正常的被截取。於 Python command console 執行下列指令。
如果正常執行的話,應該可以看到滑鼠的游標被移動到整個螢幕的最右下角。

>>> import pyautogui
>>> pyautogui.moveTo( pyautogui.size(),duration=2)

我們主要用小算盤為例子。舉例來說,如果我們要點擊小算盤的 “7”。

我們可以截取一張圖如下,檔名為cal7.png。(檔案格式一定要是PNG)

_images/calc7key.png

執行下列 python 程式後,就會點擊到 7

[pastacode lang=”python” message=”” highlight=”” provider=”manual”]


import pyautogui
#pyautogui.moveTo( pyautogui.size(),duration=2)

button7location = pyautogui.locateOnScreen('c:\\cal7.png')

pyautogui.click(button7location)

[/pastacode]

要注意的是如果執行時小算盤被其他畫面遮到,那麼執行就會失敗。

因此,執行這類的程式時,必須要確保小算盤在螢幕上可以被看見。沒有被其他 Window 遮住。

 

技術參考資料

https://pypi.python.org/pypi/PyAutoGUI

https://pyautogui.readthedocs.org/en/latest/index.html

 

分法二: Windows ObjectID 的方式 PyWinAuto + SWAPY

工具主角: PyWinAuto + SWAPY

安裝方式

1. 首先安裝 PyWinAuto

pip   install    pyWinAuto

2. 下載 SWAPY (Simple Windows Automation on Python)

SWAPY 為一個獨立的執行工具 ,可以在這裡下載安裝:

https://swapy.googlecode.com/files/swapy-ob-0.4.3.exe

優缺點

PyWinAuto 這個方式主要透過 Windows Object locator 來定位 Windows 元件。

缺點是只能限定在 Windows 平台使用。

優點是透過 ObjectID 的方式定位,比較不會像圖形比對那樣失敗或是受到畫面修改的影響。

另外一個最大的優點是,我們可以透過 “SWAPY”這個工具自動產生程式!

測試情境

我們主要會自動執行下列動作:

1. 啟動 notepad

2. 用電腦自動點選 Help > About Notepad

為什麼用 SWAPY實作

雖然我們可以直接寫 PyWinAuto 的程式,但是筆者還是建議用 SWAPY 這個工具來直接產生。因為這個工具 SWAPY 就好比是瀏覽器的  Web element inspector ,可以看 Windows 物件的狀況,幫助我們定位並且做適當的動作 (click..)

1. 首先先啟動 notepad.exe

2. 接著再啟動 SWAPY。

因為 SWAPY 沒有 refresh 的功能,所以如果先啟動 SWAPY 之後再啟動 notepad的話,SWAPY 會找不到 notepad.exe

如果開啟的視窗比較多的話,一開始啟動的時間會比較久一些。

SWAPY 實作使用步驟

1. 啟動SWAPY之後,找到 “Untitled – Notepad” > 右鍵 > “Set Focus”

2. 展開 menu > &About Notepad >  右鍵 > “(click” 如下圖所示)

3. SWAPY 就會自動完成,右手邊 Editor 的相關 python 程式! 是不是很方便。

SWAPY use1

由於notepad.exe 是我們手動所啟動,所以要將該 python 程式自動化執行,每次都會自動啟動 notepad

所以上述自動產生程式最上面再加入這行:

pwa_app.start_(‘notepad.exe’)

 

完整Python程式碼範例 (SWAPY自動產生)

[pastacode lang=”python” message=”” highlight=”” provider=”manual”]

import pywinauto


pwa_app = pywinauto.application.Application()

# Add this line to launch notepad.exe. The other parts of source code were generated by SWAPY
pwa_app.start_('notepad.exe')

w_handle = pywinauto.findwindows.find_windows(title=u'Untitled - Notepad', class_name='Notepad')[0]
window = pwa_app.window_(handle=w_handle)
window.SetFocus()
window.MenuItem(u'&Help->&About Notepad').Click()

[/pastacode]

http://pywinauto.github.io/docs/

https://github.com/pywinauto/pywinauto

https://github.com/pywinauto/pywinauto/tree/f0e892cce6f367d94b675bb1b9e5db20f0425747/examples

AutoIT

另外可以使用AutoIT,將自動化程式編譯成EXE

https://www.autoitscript.com/site/autoit/

PyAutoGUI與PyWinAuto比較

工具 PyAutoGUI PyWinAuto + SWAPY
定位方式 透過圖形PNG  Windows objectID
實作 必須要透過截圖程式抓取要點選的畫面 使用SWAPY工具
程式失敗的可能原因 圖形比對失敗螢幕解析度該畫面被其他視窗遮蓋 相對穩定
適用平台 Mac, Linux, Windows Windows Only
適用應用程式 因為是圖形比對的方式,所以網頁、Java Applet、Flash、Windows UI、Mac UI等都可以適用 Windows Application only

 

pyWinAuto範例程式

https://github.com/pywinauto/pywinauto/tree/298bb017f91f30cc524988bfa582ee46d7aed775/examples

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *