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

UI測試之遠端桌面連線的困擾

一、遇到的問題   在 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個甚至更多,這時我們最好藉助開源遠端連線軟體了。對於大規模的虛機管理,我們推薦使用開源遠端連線軟體來進行管理。