自動化測試實操案例詳解 | Windows應用篇
前言
之前有同學留言說想看Windows應用的自動化,那麼今天我們就用1個簡單的例子,帶大家一起來看一下Windows應用的自動化究竟有哪些坑。
不過在此之前,希望大家能認真看一下 “如何連線Windows應用視窗” 的教程,裡面詳細描述了多種連線Windows視窗的模式。
因為桌面應用的多樣化,IDE連線各種Windows視窗也會出現各種各樣的問題,同學們在連線Windows視窗時如果出現問題,比如無法嵌入、連線後閃退、連線後窗口被拉伸等等,建議同學們多嘗試幾種連線方式,總會找到一種比較好的連線方式。
另外,因為同學們平常多使用移動裝置進行測試,換成測試Windows應用時,很容易把一些移動裝置才有的介面用到Windows應用上面,導致介面失效,達不到預期效果的情況,下文我們也會詳細跟大家講述一下,幫助大家避坑。
實操
① 需求
我們以網易雲音樂的Windows客戶端為例,實現在網易雲音樂中搜索“薛之謙”,然後找到他的歌單排名,將排名前10的歌曲加入“我喜歡的音樂”列表,之後刪除搜尋框的內容,最後回到網易雲音樂的首頁。
② 在IDE中連線網易雲音樂的應用視窗
為防止其它應用窗口乾擾連線,我們在桌面上只留下IDE視窗和待測的網易雲音樂視窗。然後我們在Windows視窗連線裡選擇 “選定視窗”,再單擊選中網易雲音樂的視窗,嵌入之後發現,網易雲音樂的視窗被嚴重拉伸:
所以我們再嘗試一下另外一種嵌入方法,“搜尋視窗”。點選“搜尋視窗”,在彈出的視窗列表中,選擇網易雲音樂的視窗,再點選連線:
發現可以正常嵌入,所以以後我們可以使用搜索視窗這種模式,來嵌入網易雲音樂的Windows視窗。
③ 需求分析和預期效果
- 點選搜尋框
- 輸入“薛之謙”
- 進入薛之謙的歌曲列表
- 按排名順序播放排名前10的歌曲
- 將當前播放的歌曲加入“我喜歡的音樂”列表
- 再次點選搜尋框,全選文字然後刪除
- 返回應用首頁
④ 實現的程式碼
知識點分析
① 模擬鍵盤/滑鼠操作
AirtestIDE對普通Windows應用程式的測試支援,主要依靠影象識別框架(Airtest)進行位置定位,使用pywinauto
的操作介面進行模擬操作。
最常見的就是模擬鍵盤/滑鼠操作了。上述案例中,我們主要使用了模擬鍵盤操作,幫助我們在應用上輸入關鍵詞、使用快捷鍵以及進行全選刪除等操作。
dev = device()
# 輸入搜尋詞,等同於 text("薛之謙")
dev.keyboard.SendKeys("薛之謙")
# 刪除輸入框的內容,等同於 keyevent("^a"),keyevent("{BACK}")
dev.keyboard.SendKeys("^a")
dev.keyboard.SendKeys("{DELETE}")
其中'^' 等同於 {VK_CONTROL}
,所以"^a"
代表的是"ctrl+a"
,另外pywinauto.keyboard
這個模組的詳細內容可以參考此連結:https://pywinauto.readthedocs.io/en/latest/code/pywinauto.keyboard.html#。
模擬滑鼠操作在上述示例中沒有涉及,但它的基本用法與pywinauto.keyboard
模組是相似的,給大家舉個簡單的例子,模擬滑鼠的右鍵點選操作:
dev = device()
dev.mouse.right_click(coords=(1180, 145))
pywinauto.mouse
模組的內容可以參考此連結:https://pywinauto.readthedocs.io/en/latest/code/pywinauto.mouse.html。
② 在Windows應用上使用keyevent
之前很多同學跟我們反饋過這樣的問題,為什麼他們在Windows應用上輸入各種keyevent
之後,都只是把鍵碼輸入到文字框中,而沒有實現鍵碼的效果呢?
如上圖所示,我們的預期是刪除輸入框的文字,但實際效果是把鍵碼一個個輸入到了輸入框中。其實原因就是我們文章開頭所說的,這個鍵碼是應用在安卓平臺上的,照抄到Windows平臺是不適用的:
而Windows平臺的鍵碼,我們可以參考pywinauto.keyboard
這個模組給出的鍵碼合集:
③ 多種截圖技巧
實操示例中,我們使用了多條截圖語句幫助我們在網易雲音樂上進行定位。其中有幾個截圖的小技巧想分享給大家:
第一點,截圖的時候,希望大家儘量減少截入過多的空白背景,空白背景過多容易導致特徵點稀少,進而出現截圖識別位置錯誤的問題。
第二點,截圖並不一定是越小越精準。當畫面中存在多個相似的目標截圖時,我們需要靈活地加入一些輔助內容,幫助我們順利定位到目標。就拿上述示例來說,輸入“薛之謙”後,我們想要點選下拉列表的第二個薛之謙,但是列表中有很多個干擾元素:
此時,細細地去摳含有薛之謙三個文字的截圖就非常不明智了,因為你很難確保程式最終幫你匹配到列表中哪一個位置。但我們嘗試換一下思路,適當地將截圖擴大一些,增加更多的特徵點,讓我們的點選目標依然處於截圖中心,不就可以更準確地定位到我們的目標了嗎?
最後一點,巧用target_pos
幫助我們點選截圖的不同位置。預設情況下,程式在畫面上找到截圖目標後,會點選截圖的中心位置,但實際操作中,我們可能需要點選截圖的右下角、中心偏右位置等等,這時候我們只需要設定截圖target_pos
的值即可(取值範圍1~9)。
小結
今天的教程內容就到這裡啦,如果同學們還有什麼想看的實操案例,歡迎在公眾號留言,另外需要上述指令碼練手的同學,也可以在公眾號 回覆“網易雲” 獲取示例程式碼。
Airtest官網:http://airtest.netease.com/
Airtest教程官網:https://airtest.doc.io.netease.com/
搭建企業私有云服務:https://airlab.163.com/b2b