再談 win32 程序的 UI 測試

接着上一篇的話題,因爲要爲 win32 程序寫 UI 測試,自已也摸索出來一個大致的框架。在這裏做一個小結:

 

以下代碼都發表在公有領域(http://zh.wikipedia.org/zh-cn/Public_domain),你可以自由地使用它們。

 

1. 首先,你需要創建進程:

 

 

創建進程後,PROCESS_INFORMATION 結構體中就有了進程 id 和主線程 id 。

 

2. 獲得主窗口句柄

 

主要通過 EnumWindows 來實現,如果窗口 title 是固定的,那麼也可以用 FindWindowEx 。我這裏由於 title 和 class name 都未知,用了一種比較搓的辦法:先通過線程 id 隨便找一個窗口,再用 GetParent 獲取最頂層的窗口

 

 

當然,如果你提前就知道窗口的 class name ,就可以直接在回調函數中指定這個條件。

 

順便說一下如何在 MFC 程序中指定 class name :讓你的 CMainFrame 繼承來自 CWnd 的 PreCreateWindow 函數,這個函數將在 MFC 調用 CreateWindow 之前調用:

 

 

另外,可以通過 VS 自帶的 spy++ 查看桌面上所有窗口的 class name 。

 

3. 模擬點菜單

 

 

hWnd 是你的窗口句柄,CM_PROJECTPURCHASES 是對應的菜單 ID 。注意要 Sleep 足夠的時間。

 

還要注意 PostMessage 和 SendMessage 的區別:SendMessage  必須要等相應程序處理完消息之後才返回,而 PostMessage 是異步的,立即返回。所以 PostMessage 需要 Sleep,而 SendMessage 則不需要。

 

4. 獲得最表面的窗口

 

 

與 GetFocus() 不同,這個直接獲得直觀上最表層的那個窗口(比如點了菜單後彈出來的一個窗口),相當 imba 。而 GetFocus() 得到的句柄可能會是一個編輯框控件。

 

5. 關閉窗口

 

 

然後就是 GetDlgItem() 之流了,再加上上篇文章介紹的模擬按鍵,基本上能搞定大部分的自動化 UI 測試任務。

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