注:本文最早发表在《51测试天地》第九期
揭秘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不会对应用程序造成影响。
如果需要组合热键,仅需要像人工执行的方式一样即可。
PressKey方法
描述
模拟通过键盘按下一个按键并立即释放。
语法
object.PressKey( key )
参数
object : Mercury.DeviceReplay对象。
key : 按键的数值码。可查阅后面的“Key Codes 参考”。
返回值
无。
例子
下面的例子会激活记事本并使用热键CTRL+O来模拟选择文件打开菜单,然后用ESCAPE按键关闭对话框。
Const VK_O = 24 : Const VK_F = 33
Const VK_CONTROL = 29 : Const VK_ESCAPE = 1 : Const VK_MENU = 56
Set deviceReplay = CreateObject( "Mercury.DeviceReplay" )
SystemUtil.Run "notepad.exe", "", "", "open"
Window( "nativeclass:=Notepad", "index:=0" ).Activate micLeftBtn
Wait 1
' ** Opening the menu Alt + F + O
deviceReplay.PressKey VK_MENU
deviceReplay.PressKey VK_F
deviceReplay.PressKey VK_O
Wait 2
' ** Closing the menu
deviceReplay.PressKey VK_ESCAPE
deviceReplay.SendString "Open menu was closed."
Set deviceReplay = Nothing
PressNKeys方法
描述
模拟通过键盘多次按下一个按键并立即释放。
语法
object.PressNKey( key, N )
参数
object : Mercury.DeviceReplay对象。
key : 按键的数值码。可查阅后面的“Key Codes 参考”。
N:重复的次数。
返回值
无。
例子
例1 – 美国的州
Option Explicit
Const VK_RETURN = 28 : Const VK_F = 33 : Const VK_O = 24
Const VK_TAB = 15 : Const VK_F5 = 63
Const VK_CAPITAL = 58 : Const VK_NUMLOCK = 69
Const VK_SUBTRACT = 74 : Const VK_MULTIPLY = 55
Const VK_MENU = 56
Dim deviceReplay
Private Sub SetupKeyboard()
Const CLASS_NAME = "Microsoft.VisualBasic.Devices.Keyboard"
Const ASSEMBLY = "Microsoft.VisualBasic"
Dim Keyboard
Set Keyboard = DotNetFactory.CreateInstance( CLASS_NAME, ASSEMBLY )
If CBool( Keyboard.CapsLock ) Then
deviceReplay.PressKey VK_CAPITAL
End If
If CBool( Keyboard.NumLock ) = False Then
deviceReplay.PressKey VK_NUMLOCK
End If
Set Keyboard = Nothing
End Sub
Private Sub SetupNotepad()
deviceReplay.PressKey VK_MENU
deviceReplay.PressKey VK_O
deviceReplay.PressKey VK_F
deviceReplay.SendString "Courier New"
deviceReplay.PressKey VK_TAB
deviceReplay.PressKey VK_TAB
deviceReplay.SendString "14"
deviceReplay.PressKey VK_RETURN
Wait 1
End Sub
Private Sub PrintRow( ByVal state, ByVal usps, byVal capital )
deviceReplay.SendString state
deviceReplay.PressKey VK_TAB
If Len( state ) < 8 Then
deviceReplay.PressKey VK_TAB
End If
deviceReplay.SendString usps
deviceReplay.PressKey VK_TAB
deviceReplay.SendString capital
deviceReplay.PressKey VK_RETURN
End Sub
Set deviceReplay = CreateObject( "Mercury.DeviceReplay" )
SystemUtil.Run "notepad.exe", "", "", "open", 3
Window( "nativeclass:=Notepad", "index:=0" ).Activate micLeftBtn
' ** Setup Notepad - Font courier new, size 14,
' ** NUM-LOCK pressed and CAPS-LOCK unpressed
Call SetupKeyboard()
Call SetupNotepad()
' ** inserting date
deviceReplay.PressKey VK_F5
deviceReplay.PressKey VK_RETURN
' ** Inserting Title
deviceReplay.PressNKeys VK_TAB, 3
deviceReplay.SendString "<country-region><place><span lang="EN-US">United States of America</span></place></country-region>"
deviceReplay.PressKey VK_RETURN
deviceReplay.PressNKeys VK_TAB, 3
deviceReplay.PressNKeys VK_MULTIPLY, Len( "<country-region><place><span lang="EN-US">United States of America</span></place></country-region>" )
deviceReplay.PressNKeys VK_RETURN, 2
' ** Table Headers
deviceReplay.SendString "State"
deviceReplay.PressKey VK_TAB
deviceReplay.PressKey VK_TAB
deviceReplay.SendString "USPS"
deviceReplay.PressKey VK_TAB
deviceReplay.SendString "Capital"
deviceReplay.PressKey VK_RETURN
deviceReplay.PressNKeys VK_SUBTRACT, 31
deviceReplay.PressKey VK_RETURN
' ** Print Data
Call PrintRow( "<state><place><span lang="EN-US">Alabama</span></place></state>", "AL", "Montgomery" )
Call PrintRow( "<state><span lang="EN-US">Alaska</span></state>", "AK", "<city><place><span lang="EN-US">Juneau</span></place></city>" )
Call PrintRow( "<state><span lang="EN-US">Arizona</span></state>", "AZ", "<city><place><span lang="EN-US">Phoenix</span></place></city>" )
Call PrintRow( "<state><span lang="EN-US">Arkansas</span></state>", "AR", "<city><place><span lang="EN-US">Little Rock</span></place></city>" )
Call PrintRow( "<state><span lang="EN-US">California</span></state>", "CA", "<city><place><span lang="EN-US">Sacramento</span></place></city>" )
Call PrintRow( "<state><span lang="EN-US">Colorado</span></state>", "CO", "<city><place><span lang="EN-US">Denver</span></place></city>" )
Call PrintRow( "<state><span lang="EN-US">Connecticut</span></state>", "CT", "<city><place><span lang="EN-US">Hartford</span></place></city>" )
Call PrintRow( "<state><span lang="EN-US">Delaware</span></state>", "DE", "<city><place><span lang="EN-US">Dover</span></place></city>" )
Call PrintRow( "<state><span lang="EN-US">Florida</span></state>", "FL", "<city><place><span lang="EN-US">Tallahassee</span></place></city>" )
Call PrintRow( "Georgia", "GA", "<city><place><span lang="EN-US">Atlanta</span></place></city>" )
Call PrintRow( "<state><span lang="EN-US">Hawaii</span></state>", "HA", "<city><place><span lang="EN-US">Honolulu</span></place></city>" )
Call PrintRow( "<state><span lang="EN-US">Idaho</span></state>", "ID", "<city><place><span lang="EN-US">Boise</span></place></city>" )
Call PrintRow( "<state><span lang="EN-US">Illinois</span></state>", "IL", "<city><place><span lang="EN-US">Springfield</span></place></city>" )
Call PrintRow( "Indiana", "IN", "<city><place><span lang="EN-US">Indianapolis</span></place></city>" )
Call PrintRow( "<state><span lang="EN-US">Iowa</span></state>", "IA", "<city><place><span lang="EN-US">Des Moines</span></place></city>" )
Call PrintRow( "<state><span lang="EN-US">Kansas</span></state>", "KS", "<city><place><span lang="EN-US">Topeka</span></place></city>" )
Call PrintRow( "<state><span lang="EN-US">Kentucky</span></state>", "KY", "<city><place><span lang="EN-US">Frankfort</span></place></city>" )
Call PrintRow( "<state><span lang="EN-US">Louisiana</span></state>", "LA", "<city><place><span lang="EN-US">Baton Rouge</span></place></city>" )
Call PrintRow( "<state><place><span lang="EN-US">Maine</span></place></state>", "ME", "Augusta" )
Call PrintRow( "<state><span lang="EN-US">Maryland</span></state>", "MD", "<city><place><span lang="EN-US">Annapolis</span></place></city>" )
Call PrintRow( "<state><span lang="EN-US">Massachusetts</span></state>", "MA", "<city><place><span lang="EN-US">Boston</span></place></city>" )
Call PrintRow( "<state><place><span lang="EN-US">Michigan</span></place></state>", "MI", "Lansing" )
Call PrintRow( "<state><span lang="EN-US">Minnesota</span></state>", "MN", "<city><place><span lang="EN-US">Saint Paul</span></place></city>" )
Call PrintRow( "<state><place><span lang="EN-US">Mississippi</span></place></state>", "MS", "Jackson" )
Call PrintRow( "<state><span lang="EN-US">Missouri</span></state>", "MO", "<city><place><span lang="EN-US">Jefferson City</span></place></city>" )
Call PrintRow( "<state><place><span lang="EN-US">Montana</span></place></state>", "MT", "Helena" )
Call PrintRow( "<state><place><span lang="EN-US">Nebraska</span></place></state>", "NE", "Lincoln" )
Call PrintRow( "<state><span lang="EN-US">Nevada</span></state>", "NV", "<city><place><span lang="EN-US">Carson City</span></place></city>" )
Call PrintRow( "<state><span lang="EN-US">New Hampshire</span></state>", "NH", "<city><place><span lang="EN-US">Concord</span></place></city>" )
Call PrintRow( "<state><span lang="EN-US">New Jersey</span></state>", "NJ", "<city><place><span lang="EN-US">Trenton</span></place></city>" )
Call PrintRow( "<state><span lang="EN-US">New Mexico</span></state>", "NM", "<city><place><span lang="EN-US">Santa Fe</span></place></city>" )
Call PrintRow( "<state><span lang="EN-US">New York</span></state>", "NY", "<city><place><span lang="EN-US">Albany</span></place></city>" )
Call PrintRow( "<state><place><span lang="EN-US">North Carolina</span></place></state>", "NC", "Raleigh" )
Call PrintRow( "<state><place><span lang="EN-US">North Dakota</span></place></state>", "ND", "Bismarck" )
Call PrintRow( "<state><span lang="EN-US">Ohio</span></state>", "OH", "<city><place><span lang="EN-US">Columbus</span></place></city>" )
Call PrintRow( "<state><span lang="EN-US">Oklahoma</span></state>", "OK", "<city><place><span lang="EN-US">Oklahoma City</span></place></city>" )
Call PrintRow( "<state><span lang="EN-US">Oregon</span></state>", "OR", "<city><place><span lang="EN-US">Salem</span></place></city>" )
Call PrintRow( "<state><span lang="EN-US">Pennsylvania</span></state>", "PA", "<city><place><span lang="EN-US">Harrisburg</span></place></city>" )
Call PrintRow( "<state><span lang="EN-US">Rhode Island</span></state>", "RI", "<city><place><span lang="EN-US">Providence</span></place></city>" )
Call PrintRow( "<state><span lang="EN-US">South Carolina</span></state>", "SC", "<city><place><span lang="EN-US">Columbia</span></place></city>" )
Call PrintRow( "<state><place><span lang="EN-US">South Dakota</span></place></state>", "SD", "Pierre" )
Call PrintRow( "<state><span lang="EN-US">Tennessee</span></state>", "TN", "<city><place><span lang="EN-US">Nashville</span></place></city>" )
Call PrintRow( "<state><place><span lang="EN-US">Texas</span></place></state>", "TX", "Austin" )
Call PrintRow( "<state><span lang="EN-US">Utah</span></state>", "UT", "<city><place><span lang="EN-US">Salt Lake City</span></place></city>" )
Call PrintRow( "<state><span lang="EN-US">Vermont</span></state>", "VT", "<city><place><span lang="EN-US">Montpelier</span></place></city>" )
Call PrintRow( "Virginia", "VA", "<city><place><span lang="EN-US">Richmond</span></place></city>" )
Call PrintRow( "Washington", "WA", "<city><place><span lang="EN-US">Olympia</span></place></city>" )
Call PrintRow( "<state><span lang="EN-US">West Virginia</span></state>", "WV", "<city><place><span lang="EN-US">Charleston</span></place></city>" )
Call PrintRow( "<state><place><span lang="EN-US">Wisconsin</span></place></state>", "WI", "Madison" )
Call PrintRow( "<state><span lang="EN-US">Wyoming</span></state>", "WY", "<city><place><span lang="EN-US">Cheyenne</span></place></city>" )
Set deviceReplay = Nothing
例2 – 拉丁文和字符
Option Explicit
Const VK_NUMPAD0 = 82
Const VK_NUMPAD1 = 79
Const VK_NUMPAD2 = 80
Const VK_NUMPAD3 = 81
Const VK_NUMPAD4 = 75
Const VK_NUMPAD5 = 76
Const VK_NUMPAD6 = 77
Const VK_NUMPAD7 = 71
Const VK_NUMPAD8 = 72
Const VK_NUMPAD9 = 73
Const VK_MENU = 56
Const VK_SHIFT = 42
Const VK_RETURN = 28
Const VK_F = 33
Const VK_O = 24
Const VK_TAB = 15
Const VK_F5 = 63
Const VK_NUMLOCK = 69
Dim deviceReplay
Private Sub SetupKeyboard()
Const CLASS_NAME = "Microsoft.VisualBasic.Devices.Keyboard"
Const ASSEMBLY = "Microsoft.VisualBasic"
Dim Keyboard
Set Keyboard = DotNetFactory.CreateInstance( CLASS_NAME, ASSEMBLY )
If CBool( Keyboard.CapsLock ) Then
deviceReplay.PressKey VK_CAPITAL
End If
If CBool( Keyboard.NumLock ) = False Then
deviceReplay.PressKey VK_NUMLOCK
End If
Set Keyboard = Nothing
End Sub
Private Sub SetupNotepad()
deviceReplay.PressKey VK_MENU
deviceReplay.PressKey VK_O
deviceReplay.PressKey VK_F
deviceReplay.SendString "Courier New"
deviceReplay.PressKey VK_TAB
deviceReplay.PressKey VK_TAB
deviceReplay.SendString "14"
deviceReplay.PressKey VK_RETURN
Wait 1
End Sub
Private Sub PrintCharacter( ByVal code )
Dim i, digit
deviceReplay.KeyDown VK_MENU
For i = 1 To Len( code )
digit = Mid( code, i, 1 )
Execute "deviceReplay.PressKey VK_NUMPAD" & digit
Next
deviceReplay.KeyUp VK_MENU
deviceReplay.PressKey VK_RETURN
End Sub
Set deviceReplay = CreateObject( "Mercury.DeviceReplay" )
SystemUtil.Run "notepad.exe", "", "", "open", 3
Window( "nativeclass:=Notepad", "index:=0" ).Activate micLeftBtn
' ** Setup Notepad - Font courier new, size 14,
' ** NUM-LOCK pressed and CAPS-LOCK unpressed
Call SetupKeyboard()
Call SetupNotepad()
' ** inserting date
deviceReplay.PressKey VK_F5
deviceReplay.PressKey VK_RETURN
' ** a grave character
deviceReplay.SendString "A grave: "
Call PrintCharacter( "0192" )
' ** O circumflex character
deviceReplay.SendString "O circumflex: "
Call PrintCharacter( "0212" )
' ** s caron character
deviceReplay.SendString "s caron: "
Call PrintCharacter( "0154" )
' ** n tilde character
deviceReplay.SendString "n tilde: "
Call PrintCharacter( "164" )
' ** Y umlaut character
deviceReplay.SendString "Y umlaut: "
Call PrintCharacter( "0159" )
' ** c cedila character
deviceReplay.SendString "c cedila: "
Call PrintCharacter( "0231" )
' ** O with accent character
deviceReplay.SendString "O with accent: "
Call PrintCharacter( "0211" )
' ** Inverted question mark character
deviceReplay.SendString "Inverted question mark: "
Call PrintCharacter( "168" )
' ** Euro character
deviceReplay.SendString "Euro: "
Call PrintCharacter( "0128" )
' ** i with accent character
deviceReplay.SendString "i with accent : "
Call PrintCharacter( "0237" )
' ** Male Sign character
deviceReplay.SendString "Male Sign: "
Call PrintCharacter( "11" )
' ** AE ligature character
deviceReplay.SendString "AE ligature: "
Call PrintCharacter( "0198" )
' ** aa character
deviceReplay.SendString "aa: "
Call PrintCharacter( "0197" )
' ** oethel character
deviceReplay.SendString "oethel: "
Call PrintCharacter( "0156" )
' ** Eth character
deviceReplay.SendString "Eth: "
Call PrintCharacter( "0208" )
' ** Uppercase Sigma character
deviceReplay.SendString "Uppercase Sigma: "
Call PrintCharacter( "228" )
Set deviceReplay = Nothing
DragAndDrop方法
描述
用于执行从一点拖动到另外一点的操作。
语法
object.DragAndDrop( dragX, dragY, dropX, dropY, Button )
参数
object : Mercury.DeviceReplay对象。
dragX :起点坐标的X轴的值。
dragY :起点坐标的Y轴的值。
dropX :终点坐标的X轴的值。
dropY :终点坐标的Y轴的值。
Button :可能的值包括
LEFT_MOUSE_BUTTON = 0
MIDDLE_MOUSE_BUTTON = 1
RIGHT_MOUSE_BUTTON = 2
返回值
无。
提示
可以组合使用MouseDown、MouseMove和MouseUp方法。
MouseClick方法
描述
在指定的屏幕位置执行鼠标左键或右键的单击操作。
语法
object.MouseClick( x, y, Button )
参数
object : Mercury.DeviceReplay对象。
x :屏幕坐标X轴的值。
y :屏幕坐标Y轴的值。
Button :可能的值包括
LEFT_MOUSE_BUTTON = 0
MIDDLE_MOUSE_BUTTON = 1
RIGHT_MOUSE_BUTTON = 2
返回值
无。
例子
下面的例子在执行之前需要做一定的准备工作。例子的目的是在www.advancedqtp.com网站上执行DragAndDrop操作,如果在录制时执行拖拽操作,则不会被录制下来。因此这个例子是支持某些操作的例子。这个例子在IE环境下测试通过。
打开IE浏览器并导航到www.advancedqtp.com。这个例子会交换dbxhandle项,这些对象可以被拖拽以便满足个性化显示的要求。
<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 203.25pt; HEIGHT: 423.75pt" type="#_x0000_t75"><imagedata o:title="" src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image001.emz"></imagedata></shape>
打开QTP(加载Web插件),新建一个测试,打开对象库(object repository)并添加浏览器中的页面对象到本地对象库(local object repository)中。
<shape id="_x0000_i1026" style="WIDTH: 414.75pt; HEIGHT: 300.75pt" type="#_x0000_t75"><imagedata o:title="" src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image003.emz"></imagedata></shape>
重命名对象…
<shape id="_x0000_i1027" style="WIDTH: 414.75pt; HEIGHT: 300.75pt" type="#_x0000_t75"><imagedata o:title="" src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image005.emz"></imagedata></shape>
Option Explicit
Const LEFT_MOUSE_BUTTON = 0
Dim oWebElemDesc1, oWebElemDesc2
Dim oWebElem1, oWebElem2
Dim devRep
Dim nX1, nX2, nY1, nY2, nH1, nH2, hwnd
Dim point1, point2
' ** This class holds a point coordinate
Class Point
Private mX, mY
Property Let X( ByVal value )
mX = value
End Property
Property Get X()
X = mX
End Property
Property Let Y( ByVal value )
mY = value
End Property
Property Get Y()
Y = mY
End Property
End Class
' ** Retrieving the handle of the browser
hwnd = Browser("QTP").GetROProperty( "hwnd" )
Window( "hwnd:=" & hwnd ).Activate
' ** Create a description for 'Program Professionally'
Set oWebElemDesc1 = Description.Create()
oWebElemDesc1( "micclass" ).Value = "WebElement"
oWebElemDesc1( "html tag" ).Value = "H3"
oWebElemDesc1( "innertext" ).Value = "Program Professionally"
oWebElemDesc1( "class" ).Value = "dbx-handle dbx-handle-cursor"
' ** Create a description for 'Links'
Set oWebElementDesc2 = Description.Create()
oWebElemDesc2( "micclass" ).Value = "WebElement"
oWebElemDesc2( "html tag" ).Value = "H3"
oWebElemDesc2( "innertext" ).Value = "Links"
oWebElemDesc2( "class" ).Value = "dbx-handle dbx-handle-cursor"
' ** Searching for the elements
With Browser( "QTP" ).Page( "QTP" )
If .ChildObjects( oWebElemDesc1 ).Count = 1 Then
Set oWebElem1 = .WebElement( oWebElemDesc1 )
If .ChildObjects( oWebElemDesc2 ).Count = 1 Then
Set oWebElem2 = .WebElement( oWebElemDesc2 )
Else
Print "Web Element 'Program Professionally' was not found."
ExitTest( micFail )
End If
Else
Print "Web Element 'Program Professionally' was not found."
ExitTest( micFail )
End If
End With
' ** Retrieve elements dimensions
nX1 = oWebElem1.GetROProperty( "abs_x" )
nH1 = oWebElem1.GetROProperty( "height" )
nY1 = oWebElem1.GetROProperty( "abs_y" )
nX2 = oWebElem2.GetROProperty( "abs_x" )
nH2 = oWebElem2.GetROProperty( "height" )
nY2 = oWebElem2.GetROProperty( "abs_y" )
Set point1 = New Point
point1.X = nX1 + 10
point1.Y = nY1 + nH1 - 10
Set point2 = New Point
' ** Dragging up
If nY1 > nY2 Then
point2.X = nX2 + 20
point2.Y = nY2 + nH2 - 20
Else
' ** Dragging down
point2.X = nX2 + 20
point2.Y = nY2 + nH2 + 20
End If
Set devRep = CreateObject( "Mercury.DeviceReplay" )
devRep.DragAndDrop point1.X, point1.Y, _
point2.X, point2.Y, LEFT_MOUSE_BUTTON
MouseDbClick方法
描述
在指定的屏幕位置中执行鼠标左键或右键的双击事件。
语法
object.MouseDblClick( x, y, Button )
参数
object : Mercury.DeviceReplay对象。
x :屏幕坐标X轴的值。
y :屏幕坐标Y轴的值。
Button :可能的值包括
LEFT_MOUSE_BUTTON = 0
MIDDLE_MOUSE_BUTTON = 1
RIGHT_MOUSE_BUTTON = 2
返回值
无
MouseDown方法
描述
在屏幕指定位置按下鼠标左键或右键,并保持按下状态。
语法
object.MouseDown( x, y, Button )
参数
object : Mercury.DeviceReplay对象。
x :屏幕坐标X轴的值。
y :屏幕坐标Y轴的值。
Button :可能的值包括
LEFT_MOUSE_BUTTON = 0
MIDDLE_MOUSE_BUTTON = 1
RIGHT_MOUSE_BUTTON = 2
返回值
无
提示
应该在MouseDown后使用对应的MouseUp方法。
MouseUp方法
描述
用于释放之前执行的MouseDown方法所按下的鼠标按键。
语法
object.MouseDown( x, y, Button )
参数
object : Mercury.DeviceReplay对象。
x :屏幕坐标X轴的值。
y :屏幕坐标Y轴的值。
Button :可能的值包括
LEFT_MOUSE_BUTTON = 0
MIDDLE_MOUSE_BUTTON = 1
RIGHT_MOUSE_BUTTON = 2
返回值
无
提示
应该让MouseUp和MouseDowun方法配对使用。
MouseMove方法
描述
用于释放之前执行的MouseDown方法所按下的鼠标按键。(译者注:这里怀疑是作者笔误,应该是:用于模拟鼠标移动。)
语法
object.MouseDown( x, y ) (译者注:这里怀疑是作者笔误,应该是:object.MouseMove( x, y )。)
参数
object : Mercury.DeviceReplay对象。
x :屏幕坐标X轴的值。
y :屏幕坐标Y轴的值。
返回值
无
提示
调试脚本查看在运行时获取到的坐标位置。
在执行键盘操作之前移动鼠标到指定的位置并设置焦点。
SetSynchronizationTimeout方法
描述
设置一个新的同步超时的时间值。
语法
object.MouseDown( x, y ) (译者注:这里怀疑是作者笔误,应该是:object. SetSynchronizationTimeout(nSyncTimeout , is_sec)。)
参数
object : Mercury.DeviceReplay对象。
nSyncTimeout : 同步超时的时间值。
is_sec : 指定设置的时间值是否以秒为单位。
返回值
无
提示
建议不要修改这个值。
Key Codes参考
<shape id="_x0000_i1028" style="WIDTH: 415.5pt; HEIGHT: 183.75pt" type="#_x0000_t75"><imagedata o:title="" src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image007.emz"></imagedata></shape>
常量
| #
| 描述
|
VK_ESCAPE | 1 | 主要用于取消命令操作,或者从一个处理过程中退出。 |
VK_1 | 2 | 数字键1,与VK_SHIFT键组合将输入某个特殊字符(取决于键盘布局)。 |
VK_2 | 3 | 数字键2,与VK_SHIFT键组合将输入某个特殊字符(取决于键盘布局) |
VK_3 | 4 | 数字键3,与VK_SHIFT键组合将输入某个特殊字符(取决于键盘布局)。 |
VK_4 | 5 | 数字键4,与VK_SHIFT键组合将输入某个特殊字符(取决于键盘布局) |
VK_5 | 6 | 数字键5,与VK_SHIFT键组合将输入某个特殊字符(取决于键盘布局)。 |
VK_6 | 7 | 数字键6,与VK_SHIFT键组合将输入某个特殊字符(取决于键盘布局)。 |
VK_7 | 8 | 数字键7,与VK_SHIFT键组合将输入某个特殊字符(取决于键盘布局)。 |
VK_8 | 9 | 数字键8,与VK_SHIFT键组合将输入某个特殊字符(取决于键盘布局)。 |
VK_9 | 10 | 数字键9,与VK_SHIFT键组合将输入某个特殊字符(取决于键盘布局)。 |
VK_0 | 11 | 数字键0,与VK_SHIFT键组合将输入某个特殊字符(取决于键盘布局)。 |
VK_MINUS | 12 | 减号(-)或下划线(_),(取决于键盘布局)。 |
VK_EQUAL | 13 | 等号(=)或加号(+),(取决于键盘布局)。 |
VK_BACKSPACE | 14 | 用于删除光标左边的字符,可通过组合单击和拖拽操作来高亮显示文本,然后单击BACKSPACE键来删除所选文本。 |
VK_TAB | 15 | TAB按键可用于在文档中设置TAB位置,移动光标到指定位置,与SHIFT键组合可以跳转到前一个TAB位置。 |
VK_Q | 16 | 与SHIFT按键组合或按下CAPS-LOCK表示大写字母Q。 |
VK_W | 17 | 与SHIFT按键组合或按下CAPS-LOCK表示大写字母W。 |
VK_E | 18 | 与SHIFT按键组合或按下CAPS-LOCK表示大写字母E。 |
VK_R | 19 | 与SHIFT按键组合或按下CAPS-LOCK表示大写字母R。 |
VK_TAB | 20 | 用于在文档中设置TAB位置,移动光标到指定位置,与SHIFT键组合可以跳转到前一个TAB位置。 |
VK_Y | 21 | 与SHIFT按键组合或按下CAPS-LOCK表示大写字母Y。 |
VK_U | 22 | 与SHIFT按键组合或按下CAPS-LOCK表示大写字母U。 |
VK_I | 23 | 与SHIFT按键组合或按下CAPS-LOCK表示大写字母I。 |
VK_O | 24 | 与SHIFT按键组合或按下CAPS-LOCK表示大写字母O。 |
VK_P | 25 | 与SHIFT按键组合或按下CAPS-LOCK表示大写字母P。 |
VK_OBRACKET | 26 | 左中括号[或左大括号{,取决于键盘布局。 |
VK_CBRACKET | 27 | 右中括号[或右大括号{,取决于键盘布局。 |
VK_RETURN | 28 | 回车键用于把光标设置到下一行的开头。也被用于完成一个命令并告诉计算机执行下一条命令。 |
VK_CONTROL | 29 | CTRL键,用于与其它按键组合来执行特定的命令,例如CRL/ALT/DEL执行系统重启命令。 |
VK_A | 30 | 与SHIFT按键组合或按下CAPS-LOCK表示大写字母A。 |
VK_S | 31 | 与SHIFT按键组合或按下CAPS-LOCK表示大写字母S。 |
VK_D | 32 | 与SHIFT按键组合或按下CAPS-LOCK表示大写字母D。 |
VK_F | 33 | 与SHIFT按键组合或按下CAPS-LOCK表示大写字母F。 |
VK_G | 34 | 与SHIFT按键组合或按下CAPS-LOCK表示大写字母G。 |
VK_H | 35 | 与SHIFT按键组合或按下CAPS-LOCK表示大写字母H。 |
VK_J | 36 | 与SHIFT按键组合或按下CAPS-LOCK表示大写字母J。 |
VK_K | 37 | 与SHIFT按键组合或按下CAPS-LOCK表示大写字母K。 |
VK_L | 38 | 与SHIFT按键组合或按下CAPS-LOCK表示大写字母L。 |
VK_SEMICOLON | 39 | 分号(;)或冒号(:),取决于键盘布局。 |
VK_SINGLE_QUOTE | 40 | 单引号(‘)或双引号(“) ,取决于键盘布局。 |
VK_APOSTROPHE | 41 | 波浪号(~)或(`),取决于键盘布局。 |
VK_SHIFT | 42 | 把小写字母换成大写字母,把数字换成特殊字符。 |
VK_PIPE | 43 | 斜线(/)或竖线(|),取决于键盘布局。 |
VK_Z | 44 | 与SHIFT按键组合或按下CAPS-LOCK表示大写字母Z。 |
VK_X | 45 | 与SHIFT按键组合或按下CAPS-LOCK表示大写字母X。 |
VK_C | 46 | 与SHIFT按键组合或按下CAPS-LOCK表示大写字母C。 |
VK_V | 47 | 与SHIFT按键组合或按下CAPS-LOCK表示大写字母V。 |
VK_B | 48 | 与SHIFT按键组合或按下CAPS-LOCK表示大写字母B。 |
VK_N | 49 | 与SHIFT按键组合或按下CAPS-LOCK表示大写字母N。 |
VK_M | 50 | 与SHIFT按键组合或按下CAPS-LOCK表示大写字母M。 |
VK_COMMA | 51 | 逗号(,)或左尖括号(<),取决于键盘布局。 |
VK_DOT | 52 | 点号(.)或右尖括号(>),取决于键盘布局。 |
VK_SLASH | 53 | 反斜杠号(/)或问号(?),取决于键盘布局。 |
VK_RSHIFT | 54 | 把小写字母换成大写字母,把数字换成特殊字符。 |
VK_MULTIPLY | 55 | 乘号(*) |
VK_MENU | 56 | 用于与其它键组合输入关键字。也用于组合数字键盘上的按键来输入ASCII码。 |
VK_SPACE | 57 | 空格键 |
VK_CAPITAL | 58 | CAPS LOCK键 |
VK_F1 | 59 | 在DOS时代,F1通常用于调出帮助菜单,显示帮助信息。在Windows操作系统中也作为显示帮助信息的热键。 |
VK_F2 | 60 | 在Windows中可用于重命名、高亮显示文件夹或文件并输入新的名字。 |
VK_F3 | 61 | 在Windows中可用于查找文件。 |
VK_F4 | 62 | 在IE中可以按F4打开地址栏,组合ALT和F4将关闭窗口。 |
VK_F5 | 63 | 刷新按钮。 |
VK_F6 | 64 | 把光标移动到程序的其它可停留的位置。 |
VK_F7 | 65 | 在Windows中F7没有任何功能,在某些程序中可能会用上,可以打开程序的帮助文档查看F7的功能。 |
VK_F8 | 66 | 在计算机启动过程中可以使用F8来进入安全模式。 |
VK_F9 | 67 | 在Windows中F9没有任何功能,在某些程序中可能会用上,可以打开程序的帮助文档查看F7的功能。 |
VK_F10 | 68 | 在很多程序中F10被用于激活菜单栏,可以使用F10来定位到第一个菜单选择项,然后用方向键来移动并选择菜单。组合SHIFT键与F10将打开快捷菜单,相当于右键弹出菜单。 |
VK_NUMLOCK | 69 | 允许数字键盘中的数字按键可用,而不是光标控制键可用。按下一次NUMLOCK键,则激活NUMLOCK,并且键盘板上的灯会亮;再按一次NUMLOCK键则回到正常模式。 |
VK_SCROLL | 70 | 在某些程序中能控制光标控制键。很多应用程序忽略这个设置。按下一次ScrollLock键将激活ScrollLock模式,并且键盘板上相应的灯会亮;再按一次ScrollLock键则回到正常模式。 |
VK_HOME | 71 | 把光标移动到当前行的开头。 |
VK_NUMPAD7 | 71 | 只有VK_NUMLOCK被按下时才生效。 |
VK_UP | 72 | 向上键 |
VK_NUMPAD8 | 72 | 只有VK_NUMLOCK被按下时才生效。 |
VK_PRIOR | 73 | 把光标移动到上一页。 |
VK_NUMPAD9 | 73 | 只有VK_NUMLOCK被按下时才生效。 |
VK_SUBTRACT | 74 | 减号键。 |
VK_LEFT | 75 | 向左键。 |
VK_NUMPAD4 | 75 | 只有VK_NUMLOCK被按下时才生效。 |
VK_CLEAR | 76 |
|
VK_NUMPAD5 | 76 | 只有VK_NUMLOCK被按下时才生效。 |
VK_RIGHT | 77 | 向右键。 |
VK_NUMPAD6 | 77 | 只有VK_NUMLOCK被按下时才生效。 |
VK_ADD | 78 | 加号键。 |
VK_END | 79 | 移动光标到当前行的最后。 |
VK_NUMPAD1 | 79 | 只有VK_NUMLOCK被按下时才生效。 |
VK_DOWN | 80 | 向下键。 |
VK_NUMPAD2 | 80 | 只有VK_NUMLOCK被按下时才生效。 |
VK_NEXT | 81 | 移动光标到下一页。 |
VK_NUMPAD3 | 81 | 只有VK_NUMLOCK被按下时才生效。 |
VK_INSERT | 82 | 在一行文本中插入字符,每插入一个字符,剩下的文字向右移动一个光标位置。 |
VK_NUMPAD0 | 82 | 只有VK_NUMLOCK被按下时才生效。 |
VK_DELETE | 83 | 在一行文本中删除一个字符,每删除一个字符,剩下的文字向左移动一个光标位置。 |
VK_SNAPSHOT | 84 | 打印屏幕。 |
VK_BACKSLASH | 86 | 斜杠号(/)。 |
VK_F11 | 87 | 在IE中按下F11会把窗口打开到全屏状态,并且把工具栏隐藏以便查看更多的信息,再次按下F11则回到正常状态。 |
VK_F12 | 88 | 在Windows中F12没有任何功能,在某些程序中可能会用上,可以打开程序的帮助文档查看F7的功能。 |
VK_NUMPAD5 | 89 |
|
VK_ZOOM | 98 |
|
VK_HELP | 99 |
|
VK_F13 | 100 |
|
VK_F14 | 101 |
|
VK_F15 | 102 |
|
VK_F16 | 103 |
|
VK_F17 | 104 |
|
VK_F18 | 105 |
|
VK_F19 | 106 |
|
VK_F20 | 107 |
|
VK_F21 | 108 |
|
VK_F22 | 109 |
|
VK_F23 | 110 |
|