MILY: 宋體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">揭秘QTP的DeviceReplay對象
原文:The Undocumented DeviceReplay(http://www.advancedqtp.com/2008/03/undocumented-devicereplay/www.advancedqtp.com)
不知道為什么HP的幫助文檔中沒有提供關于DeviceReplay的強大功能的信息描述。你可以在Java插件中卻可以找到DeviceReplay的屬性,但是對于那些不使用Java插件的人可能會覺得這個對象僅在Java程序的測試中可用。
為什么要用DeviceReplay?
有些時候我們需要針對界面做一些指定的動作,例如右鍵單擊一個對象,使用功能鍵(Fx)來激活某些熱鍵的功能,這時候就可以使用DeviceReplay對象,或者在Object.Set和Object.Type方法不生效時使用DeviceReplay。
并且DeviceReplay在輸入特殊符號以及不同語言的文字時會很有用,因為不需要安裝指定的字體或改變鍵盤布局,這對于測試多語言環境的應用程序會非常有用。
在鼠標操作方面,我發現DragDrop方法非常有用,可以使用它來執行拖拽的操作,把一個Item從一個Frame拖動到另外一個Frame,或者在應用程序之間拖動。
Mercury.DeviceReplay對象
Mercury.DeviceReplay對象用于模擬鼠標單擊和移動,還有鍵盤輸入等操作。要使用DeviceReplay,你必須確保被測試的應用程序(AUT)是處于激活狀態的窗口。如果你想對某個對象執行一項操作,則該對象必須擁有焦點(focus)。對于Windows應用程序,可以使用Activate方法:
Window( "W" ).Activate micLeftBtn
如果想把焦點設置到某個指定的對象上,通常使用Click方法可以完成。
對于Web環境的應用程序,Activate方法不被支持,因此可以使用下面的技巧來完成:
hwnd = Browser( "B" ).GetROProperty( "hwnd" )
Window( "hwnd:=" & hwnd ).Activate micLeftBtn
通?梢允褂FireEvent “onfocusin”或object.focus,例如WebEdit(“WE”).Object.focus或WebEdit(“WE”)。FireEvent “onfocusin”。
在調用DeviceReplay對象的方法之前,你需要首先創建DeviceReplay對象:
Set deviceReplay = CreateObject( "Mercury.DeviceReplay" )
Microsoft.VisualBasic.Devices.Keyboard類
為什么我要在介紹DeviceReplay對象之前介紹這個.NET的類呢?DeviceReplay是一個強大的未被文檔化的對象,但是有一定的局限性。其中一個局限就是不能判斷一個Control鍵是否已經被按下。在輸入一個大寫字母之前,我們需要知道CAPS-LOCK鍵是否已經按下。在使用數字鍵盤之前我們需要檢查NUM-LOCK鍵是否已經被按下。否則我們在切換鍵盤輸入狀態時可能得到的并不是我們想要的狀態。
Devices.Keyboard類提供了屬性,可用于獲取當前的鍵盤狀態,例如當前什么鍵被按下了,并且提供一個方法用于向激活的窗口發送鍵盤敲擊事件。
幾個有用的屬性包括:
AltKeyDown - 判斷ALT鍵是否處于按下狀態。
CapsLock - 判斷CAPS LOCK鍵是否處于打開狀態。
CtrlKeyDown - 判斷CTRL 鍵是否處于按下狀態。
NumLock - 判斷NUM LOCK鍵是否處于打開狀態。
ScrollLock - 判斷SCROLL LOCK鍵是否處于打開狀態。
ShiftKeyDown - 判斷SHIFT鍵是否處于按下狀態。
Set Keyboard = DotNetFactory.CreateInstance(
"Microsoft.VisualBasic.Devices.Keyboard", "Microsoft.VisualBasic" )
Print CBool( Keyboard.AltKeyDown )
Print CBool( Keyboard.CapsLock )
Print CBool( Keyboard.CtrlKeyDown )
Print CBool( Keyboard.NumLock )
Print CBool( Keyboard.ScrollLock )
Print CBool( Keyboard.ShiftKeyDown )
注意:在使用DotNetFactory時數據類型必須被轉換
System.Windows.Forms.Control 類
DeviceReplay的另外一個局限是不能獲取當前鼠標(光標)在屏幕的位置。而System.Windows.Forms.Control這個類定義了那些擁有視覺表現的控件的基類。
通過MousePosition屬性可以獲取當前鼠標光標在屏幕坐標的位置。訪問MousePosition屬性時,可以返回代表鼠標光標位置的Point數據。
我的鼠標在哪?
Set ctlr = DotNetFactory.CreateInstance("System.Windows.Forms.Control")
For i = 1 To 10
Wait 2
Print "1. X=" & ctlr.MousePosition.X & "; Y=" & ctlr.MousePosition.Y
Next
Mercury.DeviceReplay的方法
SendString方法
描述
向激活的窗口發送一個或多個鍵盤按鍵,就像敲擊鍵盤一樣。
語法
object.SendString( str )
參數
object : Mercury.DeviceReplay對象。
str : 敲擊的字符串。
返回值
無。
例子
下面的例子會激活記事本(notepad)并輸入一段字符:
Set deviceReplay = CreateObject( "Mercury.DeviceReplay" )
SystemUtil.Run "notepad.exe", "", "", "open"
' ** this line always identifies the notepad window.
Window( "nativeclass:=Notepad", "index:=0" ).Activate micLeftBtn
deviceReplay.SendString( "DeviceReplay" )
Set deviceReplay = Nothing
KeyDown方法
描述
模擬一個按鍵的按下并保持(相當于Win32的KEY_DOWN事件)。
語法
object.KeyDown( key )
參數
object : Mercury.DeviceReplay對象。
key : 按鍵的數值碼?刹殚喓竺娴摹Key Codes 參考”。
返回值
無。
例子
下面的例子會激活記事本(notepad)程序并使用大寫和小寫的方式輸入字符串。注意在發送第一個字符串時,SHIFT鍵保持被按下的狀態:
Const VK_SHIFT = 42
Const VK_RETURN = 28
Set deviceReplay = CreateObject( "Mercury.DeviceReplay" )
SystemUtil.Run "notepad.exe", "", "", "open"
Window( "nativeclass:=Notepad", "index:=0" ).Activate micLeftBtn
' ** Typing uppercase
deviceReplay.KeyDown VK_SHIFT
deviceReplay.SendString( "devicereplay" )
deviceReplay.PressKey VK_RETURN
deviceReplay.KeyUp VK_SHIFT
' ** Typing in lower case
deviceReplay.SendString( "devicereplay" )
Set deviceReplay = Nothing
提示
在KeyDown后應該有相應的KeyUp方法的調用。
KeyDown方法就像人工按下一個按鍵并保持按下的狀態。
KeyUp方法
描述
模擬通過鍵盤釋放某個按下的按鍵。
語法
object.KeyUp( key )
參數
object : Mercury.DeviceReplay對象。
key : 按鍵的數值碼?刹殚喓竺娴摹Key Codes 參考”。
返回值
無。
例子
下面的例子會激活并并使用熱鍵CTRL+O來打開記事本(notepad)的菜單,然后用ESC鍵關閉對話框。
Const VK_O = 24
Const VK_CONTROL = 29
Const VK_ESCAPE = 1
Set deviceReplay = CreateObject( "Mercury.DeviceReplay" )
SystemUtil.Run "notepad.exe", "", "", "open"
Window( "nativeclass:=Notepad", "index:=0" ).Activate micLeftBtn
' ** Typing uppercase
Wait 1
' ** Opening the menu Ctrl + O
deviceReplay.KeyDown VK_CONTROL
deviceReplay.PressKey VK_O
deviceReplay.KeyUp VK_CONTROL
Wait 2
' ** Closing the menu
deviceReplay.PressKey VK_ESCAPE
deviceReplay.SendString "Menu Open, was closed."
Set deviceReplay = Nothing
提示
KeyUp方法應該與KeyDown方法配對使用。
多個KeyUp不會對應用程序造成影響。
如果需要組合熱鍵,僅需要像人工執行的方式一樣即可。
文章來源于領測軟件測試網 http://www.kjueaiud.com/