之前已經介紹過如何連接Windows窗口:Airtest連接Windows窗口(應用)
在成功連接上Windows窗口后,就相當於我們已經連接上了一台設備,接下來可以對它進行腳本的錄制與回放了。
生成截圖語句
首先,touch
/ wait
/ exists
/ assert_exists
/ assert_not_exists
等Airtest帶有截圖的語句,與在Android/iOS設備上錄制並沒有太大區別:
但是需要注意的是,在使用鼠標拖拽框選好想要截圖的位置后,需要雙擊該截圖區域才能完成截圖,而不會在鼠標松開時自動完成截圖,這也是Windows下截圖的最大區別。
因此截圖的步驟是:
-
拖動鼠標框選合適的區域
-
雙擊鼠標完成截圖
-
點擊鼠標右鍵可以重新進行框選
-
按
Esc
按鈕可以退出本次截圖操作
以及,在錄制swipe
語句時,在完成截圖區域框選后,需要單擊滑動終點完成語句錄制。
調用Windows接口
和Android/iOS一樣,Airtest也對Windows下的常用操作進行了封裝,底層操作接口使用的是pywinauto庫。
因此,在編寫Windows應用的測試腳本時,我們可能需要查閱以下幾個API文檔:
-
Airtest的跨平台API,這里的所有API都可以在腳本里直接調用
-
Airtest的Windows專屬API,請查閱后面提供的代碼示例來了解如何調用Windows設備的專屬接口
-
如果需要更復雜的操作,可能需要查閱pywinauto提供的API
一個簡單的示例
為了方便演示,我們假設這個腳本沒有在命令行中傳入參數,而是在腳本里使用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)
在pywinauto.mouse
這個模塊里,還提供了很多常用的鼠標操作的方法:
# 鼠標點擊操作,可以修改coords來指定點擊位置
pywinauto.mouse.click(button='left', coords=(0, 0))
# 鼠標雙擊操作,可以修改coords來指定雙擊位置
pywinauto.mouse.double_click(button='left', coords=(0, 0))
# 移動鼠標,可以修改coords使鼠標移動到指定位置
pywinauto.mouse.move(coords=(0, 0))
# 鼠標右鍵點擊,可以修改coords來指定右鍵點擊位置
pywinauto.mouse.right_click(coords=(0, 0))
# 鼠標滾動操作,可以修改coords來指定滾動位置,修改wheel_dist來指定滾動距離
pywinauto.mouse.scroll(coords=(0, 0), wheel_dist=1)
輸入keyevent
在Android中,我們可以通過keyevent("HOME")
來實現按下HOME鍵的操作,而在Windows中,我們同樣可以通過keyevent
接口發送一些按鍵響應。Android的按鍵碼是基於ADB的,而Airtest的Windows模塊則封裝使用了pywinauto支持的按鍵碼,請查閱pywinauto.keyboard文檔內容來編寫Windows下的keyevent
接口參數:
# 在pywinauto中,符號^也代表了CTRL鍵,因此^a即為全選(Ctrl+A)
keyevent("^a")
# 例如這是刪除鍵的輸入方式,需要加上括號{}
keyevent("{DELETE}")
注意,這里的keyname
需要用""
括起來。更多keyname
可以參考下圖:
如何在連接腳本時,指定連接某個窗口
在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.