1. 程式人生 > >UI測試之遠程桌面連接的困擾

UI測試之遠程桌面連接的困擾

虛擬機 窗口 後臺運行 更多 spa system term 完成 登陸

一、遇到的問題   在Windows桌面軟件進行UI自動化測試時,如果只為了替換手工,編寫的測試腳本只在實體機上運行的話,不會涉及到遠程桌面連接的問題。但在工作中,我們經常會將測試腳本部署到虛擬機上去執行,從而在自動化測試執行過程中,還可以進行一些其他的工作。這時,問題來了,如果只是在虛機後臺運行而沒有遠程桌面連接的話,鼠標點擊、鍵盤操作事件均是無效的,如何解決呢?   於是我們就在自己的工作機上,遠程連接上了虛機,執行測試腳本,ok,一切順利,但是當我們把遠程連接窗口最小化時,問題又出現了,鼠標鍵盤模擬又失效了!!為啥呢?   二、原因分析   當我們通過mstsc啟動遠程桌面連接時,被連接的Windows會啟動一個會話(Session)。此時你對遠程桌面窗口裏面的所有操作(鼠標,鍵盤)將會‘翻譯’成TCP包傳輸過去,被連接的Windows接收到這些包之後,‘還原’命令並且在當前的活動會話上面執行。而當你斷開連接時(點X關閉),會話變成斷開狀態,Windows會自動關閉會話(這裏這樣說是不準確的,事實上會話還是在的,只是狀態變成斷開的),也就導致了所有基於GUI的操作‘失效’了。而當最小化遠程桌面時,Windows為了節約網絡帶寬傳輸,會暫時‘關閉會話’,導致你的模擬操作程序失效。   三、問題解決
  為了能夠讓測試腳本正常執行,第一個想到的辦法就是,遠程連接上虛機,永遠不要關,也不要最小化。當然,我們如果能夠操作虛機所在的遠程機器的話,我們可以在遠程機器上登錄虛機,然後永遠不再遠程登錄虛機。這兩個方法最直接,但也是最弱的,有沒有更好的方案呢?   1、註冊表法   如果從A機器通過遠程桌面連接到機器B,則我們需要修改機器A上的註冊表項,步驟如下:   運行regedit   找到註冊表項HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client   創建一個類型為DWORD的註冊表值項RemoteDesktop_SuppressWhenMinimized並設置值為2   然後找到註冊表項HKEY_CURRENT_USER\Software\Wow6432Node\Microsoft\Terminal Server Client   創建一個類型為DWORD的註冊表值項RemoteDesktop_SuppressWhenMinimized並設置值為2   關閉註冊表編輯窗口   PS:如果你想針對所有用戶進行修改的話,只需要將HKEY_LOCAL_MACHINE下對應的項修改即可。完成以上操作後,如果在A機器上連接機器B後,窗口最小化後,鼠標鍵盤操作也可以正常模擬了。   2、自登陸法   我們遠程連接上虛機後,可以在遠程虛機上執行一個bat腳本,使得虛機能夠自己登陸自己,bat腳本如下:   @%windir%\System32\tscon.exe 0 /dest:console   @%windir%\System32\tscon.exe 1 /dest:console   @%windir%\System32\tscon.exe 2 /dest:console   將腳本內容,保存為Close_RDP.bat,在遠程虛機上雙擊運行,正常情況下,虛機會自動關閉,在虛機關閉的情況下,鼠標鍵盤的模擬仍然是生效的,不過此方法存在不太穩定的情況,不推薦使用。   3、開源遠程桌面連接軟件法   使用C#開源遠程桌面連接軟件Multi RDP Client .NET,當遠程連接上後,最小化的情況下,鼠標鍵盤模擬仍然是生效的。另外由於是開源軟件,所以我們可以在源碼基礎上,擴展自己的功能,比如說在自動化測試過程中,接收請求,自動遠程連接相應機器,來滿足自動化測試的需求。另外,使用第三方遠程連接軟件,我們可以將軟件的數據保存到遠程的數據庫
中,這樣,我們只需要有軟件,不需要知道機器密碼就可以使用執行機器了。   四、總結   以上幾種解決遠程桌面問題的方法,在工作中都有可能用到,比如說在腳本初期,我們使用到的機器不是太多的情況下,腳本的運行需要手工進行,這時,我們可以采用註冊表法,這樣就可以將遠程桌面的窗口最小化到任務欄了;而當我們機器不斷增多時,比如說自動化執行的機器超過了10個甚至更多,這時我們最好借助開源遠程連接軟件了。對於大規模的虛機管理,我們推薦使用開源遠程連接軟件來進行管理。

UI測試之遠程桌面連接的困擾