(转)揭秘QTP的DeviceReplay对象

上一篇 / 下一篇  2009-02-16 08:46:21 / 个人分类:QTP

不知道为什么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

  当我想对UI上的控件做一些特定的操作的时候,例如鼠标左右键点击,键盘输入字符串等,特别是在Object.Set和Object.Type没法使用的时候,DeviceReplay就显得非常有用。]L%}2FB1A |N(^Z ^13871151Testing软件测试网1so3LU!lJ DMq~ P

DeviceReplay使用的前提是:51Testing软件测试网6m4Ks?1`m

51Testing软件测试网Po\HmB o

1. 应用程序窗口被激活。

;Ee{J:zR13871151Testing软件测试网 |0`5vE'`9[ J*R

对窗口应用程序: 可以使用Window("W").ActivatemicLeftBtn

$[3R"\G$_^)CIA13871151Testing软件测试网7j0F)R8C2g-f|

对网页应用程序: 可以使用

o(gs4X/q138711

hwnd = Browser("B").GetROProperty("hwnd")51Testing软件测试网)j*lB XoW/\

Window("hwnd:="& hwnd ).ActivatemicLeftBtn51Testing软件测试网0Sf5?ho/A6rd;L v

c-Ik1UP0x!H1387112. 目标控件为焦点。51Testing软件测试网3FOH"Xp!] G)A

51Testing软件测试网u!@ w0k+rj;B7q/i

WebEdit( "WE" ).object.focus 或者WebEdit( "WE" ).FireEvent "onfocusin"

h7smk7\ k8Ee2~%x138711

W.G.c-g(\r[yk8W138711使用以下方法可以判断当前哪些键是否按下:(Microsoft.VisualBasic.Devices.Keyboard

#H3ee!x_ s Rf138711

Set Keyboard = DotNetFactory.CreateInstance("Microsoft.VisualBasic.Devices.Keyboard", "Microsoft.VisualBasic")51Testing软件测试网5Y"r'Z^.r7_ L

PrintCBool( Keyboard.AltKeyDown )

d,r&AT8HJ138711

PrintCBool( Keyboard.CapsLock )

R{.cL7PM(J-\s138711

PrintCBool( Keyboard.CtrlKeyDown )

;pGee%n(t,u138711

PrintCBool( Keyboard.NumLock )

o3e@;G,h"y138711

PrintCBool( Keyboard.ScrollLock )51Testing软件测试网/e8p5tP p)]T$j(N%g]

PrintCBool( Keyboard.ShiftKeyDown )

&v^4y)lb/~X138711

+B+T+sf@$|138711注意:使用DotNetFactory的时候要注意数据类型的转换

\,XX5iSm:Y138711

Fy2w-f1GU,bi138711使用以下方法可以判断当前鼠标的位置:(System.Windows.Forms.Control)

0t3kOsS&K(i138711

Setctlr = DotNetFactory.CreateInstance("System.Windows.Forms.Control")51Testing软件测试网D c"RWr0w;{^S

Fori = 1To10

l ~ zi8TS:d138711

  Wait251Testing软件测试网5Aa'F5e7e

  Print"1. X="& ctlr.MousePosition.X &"; Y="& ctlr.MousePosition.Y51Testing软件测试网l]*RQ"Urk9HT\d ?

Next51Testing软件测试网.?/h$k(r'P$@0oieG?

 51Testing软件测试网 P|e*a-iB s

DeviceReplay有以下常用方法:

M$P|AFIa6e138711

1。object.SendString( str )

v@r,S9YZ&[138711

SetdeviceReplay =CreateObject("Mercury.DeviceReplay")51Testing软件测试网 d[P)MH8B

SystemUtil.Run"notepad.exe", "", "","open"51Testing软件测试网Bz7b5]^

' ** this line always identifies the notepad window.

HLa(Y@6J138711

Window("nativeclass:=Notepad","index:=0″).ActivatemicLeftBtn

'U:|6hfAm8[EagH138711

deviceReplay.SendString("DeviceReplay")

#N)|_2HC3ftP-u138711

SetdeviceReplay =Nothing

;O&Tw!r Le|0H138711

2。object.KeyDown( key )|object.KeyUp( key )

h$p*h M ?JC138711

ConstVK_SHIFT = 42

(bk"]v)y|@#qw138711

ConstVK_RETURN = 28

'h.mN ot'u3y E:G|138711

SetdeviceReplay =CreateObject("Mercury.DeviceReplay")

k{JRO@#P(pR138711

SystemUtil.Run"notepad.exe", "", "","open"51Testing软件测试网 r'HC.~0uq ^

Window("nativeclass:=Notepad","index:=0″).ActivatemicLeftBtn

y+K`BN)wxWS }u138711

' ** Typing uppercase51Testing软件测试网.D1@7N?+}&vw

deviceReplay.KeyDown VK_SHIFT51Testing软件测试网/y4t&{!I+g9C0P

deviceReplay.SendString("devicereplay")

#k7w |%DNF#G138711

deviceReplay.PressKey VK_RETURN

-~%]'f1Nz&h9e138711

deviceReplay.KeyUp VK_SHIFT51Testing软件测试网f$e }'`TH ~#v

' ** Typing in lower case51Testing软件测试网a9w.[Ju*`1k9b

deviceReplay.SendString("devicereplay")

:r?:`l O#F138711

SetdeviceReplay =Nothing

UIx0{ l+BOr s138711

!H}0pbZ6v;m8n1387113。object.PressKey( key )51Testing软件测试网9]i5c(A|(E;i/iW

ConstVK_O = 24 :ConstVK_F = 33

#kFC Gl,oHM138711

ConstVK_CONTROL = 29 :ConstVK_ESCAPE = 1 :ConstVK_MENU = 56

9X?&|.sV4oxq138711

SetdeviceReplay =CreateObject("Mercury.DeviceReplay")51Testing软件测试网cWJsv

SystemUtil.Run"notepad.exe", "", "","open"51Testing软件测试网:pG*B UO

Window("nativeclass:=Notepad","index:=0″).ActivatemicLeftBtn

|kV'QFQ*}T)t138711

Wait1

B'Wl4yP:W"C138711

' ** Opening the menu Alt + F + O51Testing软件测试网X(V%Tq*SXG

deviceReplay.PressKey VK_MENU51Testing软件测试网]kV!^#a.c5x CfpJ;`

deviceReplay.PressKey VK_F

:C0S9`\8]#b)x138711

deviceReplay.PressKey VK_O

9A NJ+C(e&F138711

Wait2

0C%I D:j A+Gp:v138711

' ** Closing the menu

Th-N;Txe%q138711

deviceReplay.PressKey VK_ESCAPE51Testing软件测试网QK u%Fk,x+z k

deviceReplay.SendString"Open menu was closed."

^4b3Qz-{P B138711

SetdeviceReplay =Nothing51Testing软件测试网ED/a6U8Dpz

4.object.PressNKeys( key, N )

R;n+]}$@7}138711


2`;wI9yAAv |Y138711用于模拟连续多次按某个键。51Testing软件测试网Fl)~C,T]|Fh

5.object.DragAndDrop( dragX, dragY, dropX, dropY, Button )51Testing软件测试网@'^8GqR_+yw3L

LEFT_MOUSE_BUTTON = 051Testing软件测试网1H*i @x_

MIDDLE_MOUSE_BUTTON = 1

uu'G*AsC!HCT,y138711

RIGHT_MOUSE_BUTTON = 251Testing软件测试网)gJ,@ |.sg7_5t$B

等同于object.MouseDown( x, y, Button ),object.MouseDown( x, y ),object.MouseUp( x, y, Button )的组合

tz#N[)o(y138711

6.object.MouseClick( x, y, Button )51Testing软件测试网 Fv3l1Ewu!Bw c {Z

7.object.MouseDblClick( x, y, Button )

0o'Y%N3BdB"j138711

8。object.SetSynchronizationTimeout(object,nSyncTimeout,is_sec)


TAG:

 

评分:0

我来说两句

Open Toolbar