[PLAYING QTP] PART 05 – OBJECT

part05

PART – 05
OBJECT

对象是QTP中算是最重要也是最基础的一个部分。这节主要介绍SPY、一些常见的控件,和这些控件的一些特殊的方法例子。关于识别、设置和对象库,会在下一节详细阐述。


使用Object Spy:

关于SPY的使用就不多做介绍了,这个是基础了,也很简单。入口是界面上的一个小人标志。

从下面的图中可以注意到,在QTP 11.0和QTP 10.0上的一点小区别,就是在手指标志后面,多了三个按钮,可以在观察对象属性的同时,将该对象直接添加到对象库中,更加方便快捷。

QTP10.0 和 QTP11.0 的Object Spy对比:

part05_01

  • 模块1:捕获手指。
  • 模块2:保持置顶,捕获时该设置框是否置顶。
  • 模块3:显示对象区域。
  • 模块4:Native Properties: 自身属性,一个对象的自身的接口属性。
  • 模块5:Identification Properties: 封装属性。QTP自己对控件进行封装的属性。
  • 模块6:QTP11.0开始出现的在观察控件属性时,就能直接添加至对象库的按钮。

如果你观察的控件是BS结构的控件,那 Native 和 Identification 是都能看到的。如果观察的是CS结构的控件,那 Native 就看不到了。也无法对CS结构的自身接口进行操作。

使用SPY进行控件的观察中,还会遇到有的控件需要鼠标点击后才会出现,但是在第一下点击后,SPY就完成了对象属性的抓取工作,跳回了QTP,这是时候,就需要用到SPY抓取的模式切换:

  • 半操作模式—CTRL键
  • 全操作模式—CTRL+ALT键


调用自身接口的属性 :

属性可以通过SPY的 Native Properties 里查看。

含义:改变对象在运行时的属性。
公式:对象.Object.自身属性 ,如:
Browser(“百度一下,你就知道”).Page(“百度一下,你就知道”).WebButton(“百度一下”).Object.innerText = “百度一万下”

公式:对象.Object.自身方法 ,如:
Browser(“百度一下,你就知道”).Page(“百度一下,你就知道”).WebButton(“百度一下”).Object.Click


不得不说的TO和RO:

不管是TO,还是RO,看的都是SPY里的?Identification Properties 属性。

  • Test Object(测试时对象,TO):被添加到对象库的测试对象。
  • Run-Time Object(运行时对象,RO): 运行时对象?。

他们关系:都是QTP封装好的属性,测试对象(TO)是为了识别运行时对象(RO)而存在的。

对象属性处理方法:

GetTOProperty():
含义:获取对象库中某个对象的某个属性值。
公式:Value = 对象.GetTOProperty(“属性名”)
如:

Msgbox Browser("百度一下,你就知道").GetTOProperty("name")

GetTOProperties() :
含义:获取对象库中某个对象的所有属性的值。
公式:Set Value = 对象.GetTOProperties()
如:

Set oBaidu = Browser("百度一下,你就知道")
n = oBaidu.count
For i = 0 to n-1
      print Value(i).name
      print Value(i).value
Next
Set Value = Nothing

SetTOProperty() :
含义:设置对象库中某个对象的某个属性的值。
公式:对象.SetTOProperty “Name”,”值” (不要括号)
如:

Browser("百度一下,你就知道").SetTOProperty "name","百度"

GetROProperty() :
含义:获取实际运行中某个对象的某个属性值。
公式:Value = 对象.GetROProperty(“属性名”)
如:

Msgbox Browser("百度一下,你就知道"). GetROProperty("name")

TO属性是可以Set的,因为是保存在本地的对象库中,而RO属性是不能Set的,你不能网页上当前的表现样子。

说的白话点,打个比方:

有一哥们叫”P”,发型洗剪吹,衣着很前卫,这时候在脑子里记录了他的特征。
几年后,你再看到他的时候,短发,黑发,衬衫,西装。
OK,以前记住的样貌,相当于TO,而现在看到的样子相当于RO。

man.GetTOProperty(“发型”) 的值为: “洗剪吹”
man.GetROProperty(“发型”) 的值为: “短发”

man.GetTOProperty(“衣服”) 的值为: “大洞牛仔”
man.GetROProperty(“衣服”) 的值为: “西装”

RO会随着当前表现的不同,而改变,比如这哥们第二天又穿了件毛衣。

man.GetTOProperty(“衣服”) 的值为: “大洞牛仔”
man.GetROProperty(“衣服”) 的值为: “毛衣”

你可以
man.SetTOProperty(“发型”) = “短发”
man.SetTOProperty(“衣服”) = “毛衣”

但是,你不可以
man.SetROProperty(“衣服”) = “夹克”
应为你不能控制他每天穿什么衣服。


真正的属性名称:

封装属性中,我们能使用 GetROProperty(“name”) 之类的方法,来获取对象。但是,有时候上面的名字并不是真正的名字,比如Class Name,所以如果想使用 GetROProperty(“Class Name”) 来获取Class Name,是获取不到值的。

真正的属性名称可以在注册表 HKEY_CURRENT_USER -> software -> Mercury Interactive -> QuickTest Professional -> MicTest -> Attributes 中查看到。

part05_02

不但能看到在SPY列表中能看到的属性名,还能找到很多SPY中未罗列出来的隐藏属性名。


首先对常见的WEB控件进行个简单的介绍:

  • Page:页面,的主体对象,包含各种控件
  • Frame:页面框架,同page一样,包含各种控件
  • Image:图片对象,通过Object属性访问图片的来源地址、图片大小等属性
  • WebButton:按钮,该控件的主要的事件是Click事件
  • WebCheckBox:复选框,该控件的主要方法是:.Set “ON”/“OFF”
  • WebEdit:输入框,主要方法是:.Set “abc”
  • WebFile:文件选择,主要方法是:.Set “D:\Document and Settings”
  • WebList:下拉菜单,主要方法是:.Select “#1”
  • WebRadioGroup:单选,如选择男或者女,主要方法是:.Select “1”
  • WebTable:表格,利用childobjects和childitem方法读取WebTable中任意单元格的对象
  • WebElement:以上10种控件识别不出来的,都会识别成WebElement,主要方法: Check,Click,FireEvent,GetROProperty,GetTOProperties,GetTOProperty,Output,SetTOProperty,Submit,WaitProperty 等。

QTP利用这些WebElement、WebList对象类型和类来表示Web页面中的对象。每个测试对象类都有一个可以唯一标识对象的属性列表。

下面的介绍,会以非常实用的小方法和一些冷僻的方法为主,简单的一搜就搜到的就不阐述了。


好用的对象高亮:

object.highlight

简单快捷,非常好用的高亮对象的脚本。
如果你不确定你描述的对象或者不确定对象库里对象定位到页面上的那个控件的时候,完全可以使用这个简单的小方法。


Page控件下的一些常用操作:

Capture Bitmap 截图 :
绝对的常用,可写入报告,如:

Browser(":=").CaptureBitmap "D:\test.png", True

或:

Reporter.ReportEvent micFail,"错误截图","功能","D:\test.png"

FullScreen (Browser) :
最大化测试页面。

browser(":=").FullScreen

Navigate :
Navigate的用法则是在当前窗口中直接跳转到其他页面,和SystemUtil.Run有区别。
它只是打开一个网页,没有后续页面和该步骤关联,所以并没有将Browser和Page对象加入到对象库中,此时使用描述性编程实质上比使用对象库编程更好维护,因为使用了描述性编程,无论Browser和Page对象如何改变,它永远都可以被执行,而对象库编程则还需要维护对象。


使用ChildObjects获取某类型所有对象的方法:

实际测试中,有时候会遇到这样的测试需要,勾选上页面上所有的复选框后提交表单,这时候如果靠录制和添加对象到对象库,那这个工作量太大了。这时候 ChildObjects 就派上了用场,ChildObjects?多用于批量操作页面上的某一类的控件。

Dim oDesc
Set oDesc = Description.Create()
'写需要描述的属性
oDesc("micclass").Value = "Link"

Dim oLink
Set oLink = Browser(":=").Page(":=").ChildObjects(oDesc)

'获得Link对象在页面上的总数。
LinkTotal = oLink.Count()
msgbox "页面上有" &  LinkTotal & "个Link对象"

Dim i
For i = 0 To  LinkTotal - 1
	'高亮对象,当然了,可以做别的操作。
	oLink(i).highlight
Next


对 WebTable 的操作:

在 WEB 测试中,WebTable 真是再常见不过的控件。很多初学者不太善用这个WebTable 控件,主要是录制过程中,并不会录制下WebTable这层的对象,也不会在录制脚本中,出现WebTable之类的字眼。

添加WebTable控件到对象库,QTP 11.0后的版本就比较简单了,可以直接使用SPY观察到想要的WebTable,然后点击手指旁边的添加至对象库按钮,就添加完毕了。QTP 10.0 的用户,Ctrl+R打开对象库后,点击[Add Objcets to Local]按钮,选到WebTable里的控件,在出现的层级框中,点击到你要添加的那个WebTable,[OK]一下就添加成功了。

对象添加成功后,来介绍WebTable中最常用的2个方法。

GetCellData:

GetCellData的作用是获取指定单元格(指定行,指定列)的值
用法:object.GetCellData(Row,Column)
如:

otable.GetCellData(2, 3)      '取出WebTable中,第2行,第3列的值

这段脚本只是打印出WebTable中所有的内容:

Dim otable
Set otable = Browser(":=").Page(":=").WebTable("XXXXX")

'得到行数
oRow = otable.RowCount
print "oRow = " & oRow
'得到列数
oCol = otable.ColumnCount(2)
print "oCol = " & oCol

Dim i,j,temp
For i = 1 to oRow
   temp = ""
   For j = 1 to oCol
       temp = temp & otable.GetCellData(i,j) & " | "
       Next
   print temp
Next

Set otable = Nothing

ChildItem:

ChildItem顾名思义就是子对象啦,比如需要勾选WebTable中的一个勾选框(WebCheckBox)。
用法:object.ChildItem (Row, Column, MicClass, Index)
MicClass:对象控件的类名,如List、WebButton等。
Index:一般就填写0就好了。
如:

'第3行第1列格子里的第1个复选框控件
Set oWebCheckBox =otable.ChildItem(3,1,"WebCheckBox",0)
oWebCheckBox.Set"on" '勾选
Set oWebCheckBox =Nothing


获取WinListView表中所有信息:

Dim Columns(100)
Set obj = Window("Window").Window("Window").WinListView("xxxxxx")
Col = Obj.ColumnCount()

'获取列表标题栏的信息
For i = 0 To Col - 1
     Columns(i) = Obj.GetColumnHeader(i)
    print "Columns("& i & ")" &  Columns(i)
Next

'获取列表中的所有信息
n = Obj.GetItemsCount
For i = 0 To n - 1
    print "i = " & i
    str = Cstr(i+1) & vbCr
    For j =0 To Col - 1
        str = str & Obj.GetSubItem(i ,Columns(j)) & vbCr
        print str
    Next
Next
Set obj = nothing


文本编辑控件的操作:

脚本编辑中,是不是经常会遇到如下图中的控件,这时候,使用正常的Type和Set都无法正常操作。

part05_03

这时候就可以使用这个控件的自身接口中的innerText属性,对它进行赋值。

part05_04

With Browser("个人空间管理").Page("个人空间管理").Frame("Frame")
    .WebElement("WebElement").Object.innerText = "CYDtest"
End With


滚动条控件的操作:

直接上段脚本吧:

Dim obj 'Page对象
Set obj = Browser("Browser").Page("Page") '//画面对象赋值
obj.Object.body.doScroll("scrollbarDown") '//操纵画面上的ScrollBar向上滚动。
obj.Object.body.doScroll("scrollbarUp") '//操纵画面上的ScrollBar向上滚动。

操作滚动条的方法很多,这里就不一一阐述了。


模拟键盘按键 Sendkeys:

犹豫了一下,最后还是把SendKeys的方法放到OBJECT这个PART来讲,主要是觉得使用Sendkeys的时候,更多的是遇到了控件操作上的一些问题,如:

  • 需要使用到一些按键的操作,如按Enter,F1什么的情况;
  • 需要模拟组合键的情况,如按Ctrl+A什么的;
  • 需要无法识别的控件中输入一些东西。

在这时候就可以使用SendKeys来进行模拟按键的操作。
先上一个例子:

Dim WshShell
Set WshShell = CreateObject("WScript.Shell")
WshShell.SendKeys "{ENTER}"

如果要发送的是一个字符串,就可以:

WshShell.SendKeys "hello"

如果是一些组合按钮,如:Shift、Ctrl、Alt,可用特殊字符代替:

WshShell.SendKeys "+" '按Shift
WshShell.SendKeys "^" '按Ctrl
WshShell.SendKeys "%" '按Alt
WshShell.SendKeys "^s" '按Ctrl+S进行保存的操作

如果是一些特殊的按键,如空格什么的:

WshShell.SendKeys "{ENTER}" '按回车
WshShell.SendKeys "{UP}" '按光标向上
WshShell.SendKeys "{LEFT}" '按光标向左
WshShell.SendKeys "{F1}" '按F1

用这个方法就能模拟一些按键的操作。
但是这个方法好像无法模拟出输入中文,只能模拟键盘按英文键。


模拟鼠标操作:

说完键盘说鼠标,比如需要写一些鼠标左键点击、右键点击、中键点击、双击等操作的脚本,会用到一些下面的方法。

双击的话,如果你是CS结构的软件,那就简单了,直接在对象后面.dblClick:

object.dblClick

更多的动作,还可以使用FireEvent

object.FireEvent EventName, [x], [y], [BUTTON]
  • EventName参数可以是:onchange, onclick, ondblclick, onblur, onfocus, onmousedown, onmouseup, onmouseover, onmouseout, onsubmit, onreset, onpropertychange.
  • X,Y 是坐标。
  • BUTTON的参数为:0=点击左键;1=点击右键;2=点击中键


Setting对象:

使用下面的小脚本,能打印出所有Setting对象里的内容:

For each s in setting
    print s
Next

一些小例子吧,比如设置QTP是否存在一个对象的最大时间:

Milliseconds = 30000
Setting("DefaultTimeOut") = Milliseconds
DefaultTimeOut = Setting("DefaultTimeOut")
print  DefaultTimeOut    '检查作用

再来试试这段脚本,反复多运行几次看看,找出规律了么?

If Not Setting.Exists("IterNumItem") Then
    Setting.Add "IterNumItem",1
Else
    Setting.Item("IterNumItem") = Setting.Item("IterNumItem") + 1
END if
Msgbox Setting("IterNumItem")


Utility Object 保留对象:

保留对象就是QTP本身预留的一些可用对象。

Crypt:加密模块保留对象

print Crypt.Encrypt("123")

加密,每次密码都不一样。

Desktop:桌面保留对象

Desktop.CaptureBitmap?"D:\123.png"

MercuryTimers:计时保留对象

MercuryTimers("cyd").start
wait 1
MercuryTimers("cyd").stop
print MercuryTimers("cyd").ElapsedTime

作用是获取到参数中的完整绝对路径。

RandomNumber:随机数

print RandomNumber.Value(0,100)

还有一些保留对象如:RegisterUserFunc、WebUtil、UnregisterUserFunc等。

查看方法:
运行regedit,HKEY_CURRENT_USER\Software\Mercury Interactive\QuickTest Professional\MicTest\ReservedObjects目录下。
每一项下的key包含ProgID,ProgID代表着保留对象创建的COM字符串,
如:

Set oMercuryTimers = CreateObject("Mercury.MercuryTimers")

注:当在QTP中创建这些对象时,也就意味着自行创建了一个保留对象的实例,而此实例与原来QTP默认实例化的保留对象是没有任何关系的。

保留对象也是可以自定义的,绕的有点远了,这里就不阐述了,有兴趣的童鞋可以自行查找相关资料。

最后来回顾一下说的几点吧:

part05_05

写了这么多,难免会有疏漏。大家可以留言补充。
OK,下一个PART,要讲下对象识别的原理和对象库,尽情期待。
写了这么多,有人愿意为这次分享的知识买个单么?http://www.cydtest.com/?page_id=2648

PART – 05 END

转载请注明出处与原作者。
如果你觉得文章对你有所帮助,请留言。
如果你想请作者喝杯咖啡,请点这个超链接

发表评论

电子邮件地址不会被公开。