【转帖】QTP中sendkeys方法使用

1、标准的按键放到大括号中,这个很象LAScript中的使用的键名
例如entern键是 {ENTER} esc键是{ESC}

2、普通字符直接写就行了,
例如 abcd 表示按下连续输入abcd,用这个方法可以直接发送字符串了

3、一些特殊字符

+ 表示 shift键
^ 表示 ctrl键
% 表示 alt键
^ ab 表示按下 ctrl + a 释放按键,然后再按b
^ (ab) 表示同时按下 ctrl + a + b 然后释放,使用括号可以设置组合键

那么如何输出+^%等原始字符呢?放在大括号就行了
例如:wsh.sendkeys(“{+}{^}{%}”);

4、重复按键

如果需要发送多个重复的单字母按键,不必重复输入该字母,SendKeys允许使用简化格式进行描述,使用格式为“{按键 数字}”。例如要发送10个字母“x”,则输入“ wsh.SendKeys(“{x 10}”) ”即可。

【转帖】QTP]控制对象的方法

1.最普通的方法

Browser(“百度一下,你就知道”).Page(“百度一下,你就知道”).WebEdit(“wd”).Set “helloworld”

2.描述性编程

Browser(“百度一下,你就知道”).Page(“百度一下,你就知道”).webedit(“name:=wd”).Set “123”

3.对象自身接口

Browser(“百度一下,你就知道”).Page(“百度一下,你就知道”).WebEdit(“wd”).Object.value=“helloworld”

4.DOM技术

Browser(“百度一下,你就知道”).Page(“百度一下,你就知道”).Object.getElementById(“kw”).value=“helloworld”

5.childobject结合描述性编程循环遍历获取对象

‘描述对象
Set oDesc = Description.Create()

【转帖】QTP脚本同步

在编写脚本时,经常要考虑到2个步骤之间的时间间隔问题,例如,1. 打开www.baidu.com2. 输入avepoint。 由于网速的不同,打开百度网页之后会有一定的延迟,所以1,2两步之间要有一个短时间的等待,可以通过以下几种方法实现:

1. 对象的默认等待时间。
  QTP识别对象时,会有一个默认的等待时间,可以在File–>Settings–>Run–>Object synchronization中设置,默认时间是20秒,也就是说当执行到第2步时,网页还没有完全打开,这样的话QTP找不到第2步中需要的对象,那么它会在20秒内不断的尝试查找对象,如果百度这个网页在20秒之内完全打开,那么这个方法就可行(网页全部打开的话,第2步所需的对象就会被找到),如果超过20秒还不行的话,请参考下面几种方式

2. 使用.Sync方法。等待浏览器完成当前导航。
  还是打开百度,输入Avepoint,可用如下代码来实现
  Browser(“Browser”).Navigatehttp://www.baidu.com
  Browser(“Browser”).Page(“百度”).Sync
  Browser(“百度一下,你就知道”).Page(“百度一下,你就知道”).WebEdit(“wd”).Set “Avepoint”
  第2句的意思就是等待百度这个页面完全打开,才继续执行下面操作。

3. QTP系统自带的同步点功能
  第2种方法只能在Web中使用,那么如果其他类型的对象需要等待时间怎么办?可以使用QTP系统自带的同步点功能。
  还是上面的例子,在录制状态下,选择Insert–>Synchronization Point,选择要同步的对象,设置要同步的属性,我们可以对对象的Enable,visible一类表示状态的属性做同步点,生成如下脚本
  Browser(“百度一下,你就知道”).Page(“百度一下,你就知道”).WebEdit(“wd”).WaitProperty “visible”, True, 100000
  这句话的意思就是在100秒的时间内,等待WebEdit这个对象的visible属性,只要它的visible属性变为true,那么就执行下面操作,最后的100000单位是毫秒,如果在100000毫秒(100秒)后还没有等到visible = true,直接执行下面操作。

4. 利用VBS语句。
  Do until Browser(“百度一下,你就知道”).Page(“百度一下,你就知道”).WebEdit(“wd”).Exist(5)
  Wait(1)
  Loop
  判断WebEdite这个对象是否出现,如果没有出现,执行Wait(1),如果出现,跳出循环。

5. 死等大法。
  就是用Wait()语句设置等待时间,死等,比如Wait(10),就是脚本停止10秒,任何操作都不做,10秒之后继续往下执行操作。

【转帖】GetROProperty、GetTOProperty的区别

为了便于记忆可以这样理解:R,就是Runtime,T就是Testtime,O就是Object。因此顾名思义,RO就是在测试执行时的对象,TO就是录制/编写测试时的对象。是同一个类在不同的时间生成的不同的实例,一般来说TO是静态的,而RO是动态的(每次执行测试都会生成新的实例)。
TO是仓库文件里定义的仓库对象,RO是被测试软件的实际对象
QTP要求先在仓库文件里定义仓库对象,里面存有实际对象的特征属性的值,
运行的时候,QTP会根据仓库对象的特征属性描述,寻找到实际对象,然后操作实际对象。

仓库对象TO一般在录制/编写脚本时加入仓库文件,它不仅可以在编写时进行修改,
也可以在运行过程中进行动态修改,以匹配实际对象。

相关的几个函数有:

GetTOProperty():取得仓库对象的某个属性的值
GetTOProperties():取得仓库对象的所有属性的值
SetTOProperty():设置仓库对象的某个属性的值

GetROProperty():取得实际对象的某个属性的值

理解了TO的含义,你就可以自由的用SetTOProperty()定义TO,以灵活的操作RO

比如有个测试任务,窗口上有很多待检查的记录,每条记录右边都有一个Check按钮,用来检查各条记录。
记录个数不定,所以Check按钮个数也就不定,只有一个Edit显示记录个数。
我们要对每条记录进行检查,也就是要点击每个Check按钮。
但是Check按钮个数不定,不好录制,而且个数可能也很多(上百个),即使能一一录制,那也很麻烦。

那我有一个好办法,只录制一个按钮对象,它设有两个特征属性 label=OK, index=0
然后用下面的脚本,就可以完成测试

buttonNum = CInt(JavaWindow(“Test”).JavaEdit(“Record Num”).GetROProperty(“value”))
For buttonIndex = 0 to buttonNum – 1
  JavaWindow(“Test”).JavaButton(“Check”).SetTOProperty(“index”, buttonIndex)
  JavaWindow(“Test”).JavaButton(“Check”).Click
Next

或者窗口上有New、Modify、Delete、Check等好几个按钮,要把这几个按钮一一按过去
我在对象仓库里只设置一个按钮对象AnyButton,label特征属性值填任意值,然后用下面脚本执行测试

JavaWindow(“Test”).JavaButton(“AnyButton”).SetTOProperty(“label”, “New”)
JavaWindow(“Test”).JavaButton(“AnyButton”).Click

JavaWindow(“Test”).JavaButton(“AnyButton”).SetTOProperty(“label”, “Modify”)
JavaWindow(“Test”).JavaButton(“AnyButton”).Click

JavaWindow(“Test”).JavaButton(“AnyButton”).SetTOProperty(“label”, “Delete”)
JavaWindow(“Test”).JavaButton(“AnyButton”).Click

JavaWindow(“Test”).JavaButton(“AnyButton”).SetTOProperty(“label”, “Check”)
JavaWindow(“Test”).JavaButton(“AnyButton”).Click

另外,QTP还支持脚本描述的方法来定义和访问对象,即不需要在仓库里定义,也能访问和操作实际对象

如上面两个任务,可以如下实现

1. 不需要在仓库里定义Check按钮对象,直接用下面脚本来实现测试

buttonNum = CInt(JavaWindow(“Test”).JavaEdit(“Record Num”).GetROProperty(“value”))
For buttonIndex = 0 to buttonNum – 1
  JavaWindow(“Test”).JavaButton(“label:=Check”, “index:=”+CStr(buttonIndex)).Click
Next

2. 不需要在仓库里定义New、Modify、Delete、Check按钮对象,直接用下面脚本来实现测试

JavaWindow(“Test”).JavaButton(“label:=New”).Click
JavaWindow(“Test”).JavaButton(“label:=Modify”).Click
JavaWindow(“Test”).JavaButton(“label:=Delete”).Click
JavaWindow(“Test”).JavaButton(“label:=Check”).Click

现在讲讲QTP操作对象的原理!

QTP为用户提供了两种操作对象的接口,一种就是对象的封装接口,另一种是对象的自身接口。
对象的自身接口是对象控件本身的接口,只要做过软件开发,使用过控件的人应该很清楚。
对象的封装接口是QTP为对象封装的另一层接口,它是QTP通过调用对象的自身接口来实现的。

两种接口的脚本书写格式的差别在于:
  自身接口需要在对象名后面加object再加属性名或方法名,
  封装接口就不用在对象名后面加object。

比如操作JavaEdit对象,通过QTP封装的封装接口,脚本如下:
  设置JavaEdit的内容:
     JavaDialog(“Add NE”).JavaEdit(“NE Name”).Set “NE1”
  读取JavaEdit的内容:
     msgbox JavaDialog(“Add NE”).JavaEdit(“NE Name”).GetROProperty(“value”)

如果通过JavaEdit的自身接口,脚本如下:
  设置JavaEdit的内容:
     JavaDialog(“Add NE”).JavaEdit(“NE Name”).object.setText(“NE1”)
  读取JavaEdit的内容:
     Msgbox JavaDialog(“Add NE”).JavaEdit(“NE Name”).object.getText()

QTP执行JavaEdit().Set语句时,是通过执行JavaEdit().object.setText()来实现的。
QTP执行JavaEdit().GetROProperty(“value”),是通过执行JavaEdit().object.getText()来实现的。
JavaEdit对象的封装接口Set()和GetROProperty(“value”),是QTP封装JavaEdit对象的自身接口setText()和getText()而得来的。

对象的封装接口是QTP使用的缺省接口,我们录制出来的脚本都是使用封装接口,大家用的也都是封装接口。
但是封装接口不如自身接口丰富,因为QTP只是封装了部分常用的自身接口嘛。
所以我们在需要时,可以绕过封装接口,直接调用对象的自身接口。
不过有些自身接口不够稳定,在实践中偶尔会出现问题,但是概率很少。
封装接口有相应功能的话,就尽量用封装接口吧!

理解了封装接口和自身接口的原理,我们就可以更加灵活的操作对象了。

但是我们怎么知道对象都有哪些封装接口和自身接口呢?
其实很简单,用对象查看器(Object Spy)查看对象,在查看窗口里有列出这些接口,包括属性和方法。
窗口中间有选择栏让你选择Run-time Object或者Test Object,
当你选择Run-time Object时,它显示的就是对象的自身接口(自身的属性和方法)
当你选择Test Object时,它显示的就是对象的封装接口(封装的属性和方法)

明白了这些,你还等什么呢?快拿起对象查看器,看看对象都有哪些封装接口和自身接口,肆意的操作它,玩弄它吧!

比如执行
  JavaDialog(“Add NE”).JavaEdit(“NE Name”).object.setVisible(false)
哈哈,你的JavaEdit对象就当场消失不见了!!!

你可以拿这个做恶作剧,指着这个窗口逼问开发人员,JavaEdit对象哪去了?
开发人员肯定瞪大眼睛看着这个窗口,当场翘掉!!

【QTP自动化测试(三)】鼠标点击桌面任意坐标

Function Mouse_Click(x , y)
    Dim device
    Set device = CreateObject(“Mercury.DeviceReplay”)
    device.MouseMove x , y
    device.MouseClick x , y , LEFT_MOUSE_BUTTON
End Function

Mercury.DeviceReplay这个对象用来模拟鼠标的单击和移动、键盘输入等,但有个前提,实用该对象前,需要保证键盘状态正确。如NUMLOCK是否打开等,因为DeviceReplay不能检测键盘状态。

Mercury.DeviceReplay包括如下方法:

1、SendString方法
向激活的窗口发送一个或多个键盘按键:object.SendString( str )

2、KeyDown方法
模拟一个按键的按下并保持:object.KeyDown( key )  
key :按键的数值码

3、KeyUp方法
模拟通过键盘释放某个按下的按键:object.KeyUp( key )

4、PressKey方法
模拟通过键盘按下一个按键并立即释放:object.PressKey( key )

5、PressNKeys方法
模拟通过键盘多次按下一个按键并立即释放:object.PressNKey( key, N )  
N:重复次数

6、DragAndDrop方法
用于执行从一点拖动到另外一点的操作:object.DragAndDrop( dragX, dragY, dropX, dropY, Button)
Button 的值包括:
LEFT_MOUSE_BUTTON = 0
MIDDLE_MOUSE_BUTTON = 1
RIGHT_MOUSE_BUTTON = 2

7、MouseClick方法
在指定的屏幕位置执行鼠标左键或右键的单击操作:object.MouseClick( x, y, Button )

8、MouseDbClick方法
在指定的屏幕位置中执行鼠标左键或右键的双击事件:object.MouseDblClick( x, y,Button)

9、MouseDown方法
在屏幕指定位置按下鼠标左键或右键,并保持按下状态:object.MouseDown( x, y, Button)

10、MouseUp方法
用于释放之前执行的MouseDown方法所按下的鼠标按键:object.MouseDown( x, y, Button)

11、MouseMove方法
用于模拟鼠标移动:object.MouseMove( x, y)

12、SetSynchronizationTimeout方法
设置一个新的同步超时的时间值:object. SetSynchronizationTimeout(nSyncTimeout , is_sec)
nSyncTimeout : 同步超时的时间值。
is_sec : 指定设置的时间值是否以秒为单位

【QTP自动化测试(二)】VB调用QTP自动测试

‘************************************************************************************************************************
‘描述:


‘该示例打开测试,配置运行选项和设置,
‘运行该测试,然后检查测试运行的结果。

‘假定:
‘QuickTest 中当前未打开没有保存的测试。
‘有关详细信息,请参阅 Test.SaveAs 方法的示例。
‘打开 QuickTest 时,将加载测试所必需的加载项。
‘有关详细信息,请参阅 Test.GetAssociatedAddins 方法的示例。
‘************************************************************************************************************************

Dim qtApp ‘ As QuickTest.Application ‘ 声明 Application 对象变量
Dim qtTest ‘As QuickTest.Test ‘ 声明 Test 对象变量
Dim qtResultsOpt ‘As QuickTest.RunResultsOptions ‘ 声明 Run Results Options 对象变量

Set qtApp = CreateObject(“QuickTest.Application”) ‘ 创建 Application 对象
qtApp.Launch ‘ 启动 QuickTest
qtApp.Visible = True ‘ 使 QuickTest 应用程序可见

‘ 设置 QuickTest 运行选项
qtApp.Options.Run.CaptureForTestResults = “OnError”
qtApp.Options.Run.RunMode = “Fast”
qtApp.Options.Run.ViewResults = False

qtApp.Open “C:\Tests\Test1”, True ‘ 以只读模式打开测试

‘ 为测试设置运行设置
Set qtTest = qtApp.Test
qtTest.Settings.Run.IterationMode = “rngIterations” ‘ 仅运行循环 2 到 4
qtTest.Settings.Run.StartIteration = 2
qtTest.Settings.Run.EndIteration = 4
qtTest.Settings.Run.OnError = “NextStep” ‘ 指示 QuickTest 在发生错误时执行下一步骤

Set qtResultsOpt = CreateObject(“QuickTest.RunResultsOptions”) ‘ 创建 Run Results Options 对象
qtResultsOpt.ResultsLocation = “C:\Tests\Test1\Res1” ‘ 设置结果位置

qtTest.Run qtResultsOpt ‘ 运行测试

MsgBox qtTest.LastRunResults.Status ‘ 检查测试运行的结果
qtTest.Close ‘ 关闭测试

Set qtResultsOpt = Nothing ‘ 释放 Run Results Options 对象
Set qtTest = Nothing ‘ 释放 Test 对象
Set qtApp = Nothing ‘ 释放 Application 对象