轉載:https://airtest.doc.io.netease.com/tutorial/0_automated_testing/
7 | 如何測試Windows應用程序
7.1 前言
本教程主要講解如何使用AirtestIDE進行Windows應用程序的自動化測試(以網易雲音樂Windows版為案例)。
通過閱讀本文,你將學會:
- 使用AirtestIDE對一個Windows軟件窗口進行腳本錄制
- 如何調用Windows操作的接口
- 如何在腳本和命令行里指定連接某個Windows窗口
7.2 基本原理
AirtestIDE對普通Windows應用程序測試的支持,主要依靠圖像識別框架(Airtest)進行位置定位,使用pywinauto的操作接口進行模擬操作。
Poco在Windows上的支持尚未推出,我們將會盡快推出該功能,敬請期待。
7.3 在AirtestIDE中連接Windows窗口
要使用AirtestIDE測試某個Windows程序,首先要將待測試的Windows窗口與AirtestIDE進行連接,其實也就是將Windows窗口的句柄告訴給AirtestIDE。在成功連接窗口后,Airtest能夠將該窗口作為一個設備,接下來就像在操作一台Android設備一樣,能夠對Windows窗口進行圖像識別、點擊操作等。
注意:由於選定連接Windows窗口后,在AirtestIDE中操作、運行腳本時,將會依賴這個特定的窗口句柄。因此在窗口選定后請不要隨意關閉,否則會導致運行時無法找到對應窗口而報錯。
7.3.1 常規連接方法:一鍵嵌入
AirtestIDE提供了一鍵嵌入Windows窗口的功能,如下所示:
點擊AirtestIDE的選定窗口按鈕,將可以選擇桌面上一個已經啟動的Windows應用(此時窗口邊緣將會顯示綠色方框),把它嵌入到AirtestIDE中。嵌入窗口后,可以方便地在AirtestIDE中操作窗口、錄制語句、運行腳本。
7.3.2 另一種備用的連接方法
由於Windows應用的底層實現各不相同,有些應用窗口如果使用默認的一鍵嵌入方法,在嵌入到AirtestIDE里之后會遇到一些問題(例如嵌入后無法用鼠標操作、無法正常嵌入、嵌入后無法顯示圖像等)。
針對這些問題,我們提供了一種無嵌入連接的方案,請在AirtestIDE的設置面板中,找到Device-Windows Embed Backup Method,勾選后即可使用備用方案來連接窗口。
接下來的連接方式和常規方法一樣,點擊選定窗口,然后選擇待測窗口程序:
從圖中可以看到,這種窗口連接方式不會將Windows窗口嵌入到AirtestIDE里,雖然在腳本錄制時不如默認嵌入方式簡單好用,但是能夠避免一些窗口嵌入帶來的問題。
7.3.3 桌面模式
假如想要測試的窗口不止一個(擁有多個不同的窗口句柄),單獨嵌入一個窗口可能無法滿足測試需求,此時我們也提供了第三種方案:桌面模式。
點擊桌面模式按鈕,此時AirtestIDE右側的設備窗口將會完全隱藏,進入Windows桌面模式。
在此模式下,錄制腳本與運行腳本都與正常情況下沒有區別,只不過執行時將會對整個桌面進行截圖識別,甚至可以識別到AirtestIDE代碼窗口里的截圖語句(因此在執行腳本時,請盡量縮小AirtestIDE的窗口,避免腳本界面里的截圖干擾執行結果)。
7.3.4 連接注意事項
-
由於在選定窗口時,桌面上可能會有不少同時打開着的其它窗口,導致選擇時的綠色方框不一定能夠很准確地框選到被測應用,請大家在點擊選定窗口按鈕之前,盡可能先把所有其它無關窗口都最小化,這樣做可以讓窗口選擇更准確。
-
為了防止出現異常情況,請不要選擇自己的桌面、AirtestIDE軟件本體。因為窗口嵌入的功能原理是,將一個Windows窗口設置為IDE的子窗口,因此如果試圖連接桌面,可能會導致無法預料的異常情況發生。如果只是想測試桌面上的所有窗口,可以選擇我們的桌面模式來錄制腳本。
-
由於Windows窗口在截圖時需要記錄分辨率,因此把窗口嵌入到IDE后大小將會被固定,無法修改。如果覺得嵌入后窗口過大,可以在嵌入之前先將窗口調整至合適大小再進行嵌入。
7.3.5 退出Windows連接
- 直接關閉AirtestIDE即可退出本次Windows連接,並將先前嵌入的窗口自動彈出
- 也可以通過右上角的Disconnect current device按鈕來退出窗口連接

7.4 錄制與編寫Airtest腳本
成功連接上Windows窗口,就相當於我們已經連接上了一台設備,接下來就可以對它進行腳本的錄制與回放了。
7.4.1 生成截圖語句
首先,touch / wait / exists / assert_exists / assert_not_exists等Airtest帶有截圖的語句,與在Android/iOS設備上錄制並沒有太大區別:
但是需要注意的是,在使用鼠標拖拽框選好想要截圖的位置后,需要雙擊該截圖區域才能完成截圖,而不會在鼠標松開時自動完成截圖,這也是與Windows下截圖的最大區別。
因此截圖的步驟是:
- 拖動鼠標框選合適的區域
- 雙擊鼠標完成截圖
- 點擊鼠標右鍵可以重新進行框選
- 按Esc按鈕可以退出本次截圖操作
以及,在錄制swipe語句時,在完成截圖區域框選后,需要單擊滑動終點完成語句錄制。
7.4.2 調用Windows接口
和Android/iOS一樣,Airtest也對Windows下的常用操作進行了封裝,底層操作接口使用的是pywinauto庫。
因此,在編寫Windows應用的測試腳本時,我們可能需要查閱以下幾個API文檔:
- Airtest的跨平台API,這里的所有API都可以在腳本里直接調用
- Airtest的Windows專屬API,請查閱后面提供的代碼示例來了解如何調用Windows設備的專屬接口
- 如果需要更復雜的操作,可能需要查閱pywinauto提供的API
(1)一個簡單的示例
為了方便演示,我們假設這個腳本沒有在命令行中傳入參數,而是在腳本里使用connect_device接口來連上一個句柄為123456的窗口,並對它進行一些操作:
from airtest.core.api import * dev = connect_device("Windows:///123456") # 通用的接口調用方式,與其它平台相同: touch(圖片)
假如我們希望能夠調用一些Windows的專屬操作,比如查閱了Airtest的Windows專屬API文檔后,我們發現有一些操作是只有Windows窗口才有的:
# 調用Windows專屬的接口,例如獲取當前窗口的標題內容 print(dev.get_title()) # 把窗口移動到某個坐標位置 dev.move((100, 200))
接下來,假設我們現在想要使用鼠標滾輪,在查閱Airtest的API后發現,Airtest的Windows模塊並沒有封裝鼠標滾輪的功能,此時我們可以進一步查詢pywinauto的文檔,尋找到mouse相關的章節后,就知道如何調用鼠標滾輪接口了:
dev.mouse.scroll(coords=(80, 100), wheel_dist=1)
(2)輸入KeyEvent
在Android中,我們可以通過KeyEvent(“HOME”)來實現按下HOME鍵的操作,而在Windows中,我們同樣可以通過KeyEvent接口發送一些按鍵響應。Android的按鍵碼是基於ADB的,而Airtest的Windows模塊則封裝使用了pywinauto支持的按鍵碼,請查閱pywinauto.keyboard文檔內容來編寫Windows下的KeyEvent接口參數:
# 在pywinauto中,符號^也代表了CTRL鍵,因此^a即為全選(Ctrl+A) keyevent("^a") # 例如這是刪除鍵的輸入方式,需要加上括號{} keyevent("{DEL}")
請大家根據實際需求,查閱文檔后再編寫按鍵響應的代碼。
7.5 如何在運行腳本時,指定連接某個窗口
在AirtestIDE的Windows模式中,運行腳本和查看報告與其它平台並無不同:
然而,最需要注意的一點是:在AirtestIDE里連接的窗口,都是用窗口句柄連接的。窗口句柄是每個Windows窗口對象擁有的獨一無二的32位無符號整數,而且每次打開窗口,這個數值都會變化。
這就意味着,假如我們用某個窗口嵌入到AirtestIDE里寫出了一個腳本,雖然這次可以直接運行,但是通過復制AirtestIDE里的腳本命令行的方式,是無法保證下一次還能夠運行的。因為AirtestIDE里的命令行,將會有這樣的參數內容--device Windows:///
句柄,而下次再打開窗口,可能句柄已經發生了變化。
因此,我們也可以不使用句柄,而是通過其它的方式來連接窗口。Airtest的Windows模塊,使用了pywinauto的connect接口來連接窗口,因此除了句柄以外,我們可以通過窗口標題來連接:
# 連接一個Windows窗口,窗口句柄為123456 Windows:///123456 # 連接一個Windows窗口,窗口名稱匹配某個正則表達式 Windows:///?title_re=Unity.* # 連接windows桌面,不指定任何窗口,對應IDE的桌面模式 Windows:///
在命令行中假如想使用窗口名稱連接,不需要添加引號等符號,直接這樣寫:
airtest run test.air --device Windows:///?title_re=Unity.*
7.6 Poco支持
7.6.1 接入了Poco-SDK的Windows窗口
有一些Windows-App已經接入了Poco(例如Unity游戲窗口),我們同樣能夠使用AirtestIDE來方便地查看和選中UI節點。但是在使用這個功能前,需要事先告訴AirtestIDE這個Windows窗口所在位置以及窗口大小。
在“選項”-“設置”-“Poco”,選擇“Windows Content Area Rect”,框選窗口主畫面后雙擊確認(右鍵/esc可取消),隨后即可開始使用Poco相關功能了,如圖所示:
7.6.2 Poco-Windows支持
針對Windows窗口的Poco支持,我們正在完善文檔和功能,敬請期待。