前言
很多同學反饋在測試Windows應用窗口的時候,經常遇到 窗口連接不上 、不知道窗口句柄是什么 ,發送 刪除/回車 等 keyevent
的時候總是 不生效 的情況,所以今天我們帶大家一起來看看用airtest測試Windows窗口的常見問題。
1.在IDE中連接Windows窗口
airtest提供了多種連接Windows應用窗口的方法,嵌入式連接和無嵌入式連接等,如果你使用嵌入式連接的方式不能正常連接待測的Windows窗口,比如出現 窗口被拉伸 、窗口黑屏、不能正常錄制腳本 等情況,你還可以選擇用無嵌入式連接或桌面模式。
嵌入式連接
而嵌入式連接又分兩種,一種是“選定窗口”,另外一種是“搜索窗口”。
“選定窗口”的方式很簡單,直接在IDE的Windows窗口連接那塊面板上點擊“選定窗口”,之后再把鼠標移動到待測窗口上,此時待測窗口會被一個綠色的矩形框圈住,單擊鼠標左鍵即可把待測窗口嵌入到我們的IDE
當然如果我們不使用“選定窗口”,而是使用其旁邊的“搜索窗口”,IDE則會彈出一個當前所有已打開窗口的title列表,此時我們只需要找到待測窗口的title,然后點擊右側對應的 連接
按鈕即可把應用窗口嵌入到我們的IDE中:
無嵌入式連接
無嵌入式連接,即 不用把應用窗口嵌入到IDE 上去,依舊可以對待測應用進行自動化測。在IDE的頂部菜單欄依次選擇 選項--設置--勾選上Windows窗口無嵌入連接--OK
,之后再點擊“選定窗口”,將鼠標移動到待測窗口上並單擊,此時應用窗口沒有被嵌入到IDE中,並且IDE的設備窗口也會自動隱藏起來。之后我們就可以像嵌入窗口那樣對待測應用進行自動化測試操作:
桌面模式
假如同學們想要測試的窗口不止一個(即擁有多個不同的窗口句柄),單獨 嵌入/選定 一個窗口可能無法滿足測試需求,此時我們就可以使用“桌面模式”。
點擊桌面模式按鈕,此時AirtestIDE右側的設備窗口將會完全隱藏,進入Windows桌面模式。在此模式下,錄制腳本與運行腳本都與正常情況下沒有區別,只不過執行時將會對整個桌面進行截圖識別,甚至可以識別到AirtestIDE代碼窗口里的截圖語句(因此在執行腳本時,請盡量縮小AirtestIDE的窗口,避免腳本界面里的截圖干擾執行結果)。
2.用代碼連接Windows窗口
使用窗口句柄
在AirtestIDE里連接的窗口,都是用窗口句柄連接的。窗口句柄是每個Windows窗口對象擁有的獨一無二的32位無符號整數,而且每次打開窗口,句柄的數值都會變化。
這就意味着,假如我們用某個窗口嵌入到AirtestIDE里寫出了一個腳本,雖然這次可以直接運行,但是通過復制AirtestIDE里的腳本命令行的方式,是無法保證下一次還能夠運行的。因為AirtestIDE里的命令行,將會有這樣的參數內容 --device Windows:///句柄
,而下次再打開窗口,可能句柄已經發生了變化。
使用句柄連接窗口的腳本我們可以這么寫:
auto_setup(__file__,devices=["Windows:///133194"])
但是該連接腳本僅對本次打開的Windows窗口有效,如果Windows窗口被關閉后重新打開,句柄也將會發生變化,該腳本失效。
使用正則表達式
上文我們提到,使用“搜索窗口”連接窗口的時候,IDE會列出當前所有打開窗口的title,我們可以 寫一個正則表達式去匹配到待測窗口的title,並使用這個正則表達式來連接該窗口:
# 例如匹配“吹夢到西洲”后面跟着換行符以外的任意字符的窗口title auto_setup(__file__,devices=["Windows:///?title_re=吹夢到西洲.*"])
大多數情況下,窗口的title比較不容易變化,所以使用正則表達式匹配窗口title來連接待測窗口的腳本,會相對穩定些。
連接整個桌面
如果不需要置頂某個窗口應用的話,我們還可以使用如下代碼直接連接整個桌面來做自動化:
auto_setup(__file__,devices=["Windows:///"])
3.在Windows應用上發keyevent
最后我們來看一下在Windows應用上發送 keyevent
的失效的問題。舉個很常見的例子:很多同學反饋,自己想在Windows窗口的某個輸入框內刪除一些字符,所以使用了 DELETE
這個鍵碼,但是實際運行效果是不僅沒有生效,而且還把鍵碼 DELETE
寫到了輸入框里面,這是為什么呢?
其實是因為同學們把Android的按鍵碼和Windows的按鍵碼混淆了。Android的按鍵碼是基於ADB的,而Airtest的Windows模塊則封裝使用了pywinauto
支持的按鍵碼,所以這就導致了 DELETE
鍵碼在Android設備中生效,而在Windows窗口就不生效。
在 pywinauto
庫中,刪除的鍵碼實際上是 {DELETE}
,所以我們想要在Windows窗口上實現刪除字符的效果,可以這么寫:
keyevent("{DELETE}")
更多Windows的鍵碼可以參照下圖,我們可以看到,Windows的鍵碼都是用 {}
框起來的:
在 keyevent()
中不使用 {}
框起來的字符,都會被當成需要輸入的字符串,被輸入到Windows窗口的輸入框上。
Airtest官網:http://airtest.netease.com/
Airtest教程官網:https://airtest.doc.io.netease.com/
搭建企業私有雲服務:https://airlab.163.com/b2b