Airtest自動化測試實操案例 | Windows應用篇

轉自公衆號:AirtestProject

前言

之前有同學留言說想看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 這個模塊給出的鍵碼合集:

  

keyevent詳解:Airtest API精講之keyevent()

③ 多種截圖技巧

實操示例中,我們使用了多條截圖語句幫助我們在網易雲音樂上進行定位。其中有幾個截圖的小技巧想分享給大家:

第一點,截圖的時候,希望大家 儘量減少截入過多的空白背景 ,空白背景過多容易導致特徵點稀少,進而出現截圖識別位置錯誤的問題。

第二點,截圖並不一定是越小越精準。當畫面中存在多個相似的目標截圖時,我們需要靈活地加入一些輔助內容,幫助我們順利定位到目標。就拿上述示例來說,輸入“薛之謙”後,我們想要點擊下拉列表的第二個薛之謙,但是列表中有很多個干擾元素:

  

此時,細細地去摳含有薛之謙三個文字的截圖就非常不明智了,因爲你很難確保程序最終幫你匹配到列表中哪一個位置。但我們嘗試換一下思路,適當地將截圖擴大一些,增加更多的特徵點,讓我們的點擊目標依然處於截圖中心 ,不就可以更準確地定位到我們的目標了嗎?

  

最後一點,巧用 target_pos 幫助我們點擊截圖的不同位置 。默認情況下,程序在畫面上找到截圖目標後,會點擊截圖的中心位置,但實際操作中,我們可能需要點擊截圖的右下角、中心偏右位置等等,這時候我們只需要設置截圖 target_pos 的值即可(取值範圍1~9)。

  

更多截圖技巧:Airtest腳本編寫技巧及經驗總結

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章