51Testing软件测试论坛

标题: QTP识别和操作对象的原理(http://www.yabest.net) [打印本页]

作者: yabest    时间: 2007-8-16 16:11
标题: QTP识别和操作对象的原理(http://www.yabest.net)
呵呵,这个文章本来是在给别人的帖《GetROProperty,GetTOProperties,GetTOProperty的区别 》回复时写的,没有独立出来。
http://bbs.51testing.com/viewthread.php?tid=13554&page=1#pid369327
写完后,在网上被多处转载。没想到今天又被转贴回51testing来了。

虽然在精华版里,也赚了几朵花,但没独立总是不方便。所以修整了一下,独立成帖,以方便大家阅读。
欢迎大家拍砖!(当然更欢迎大家送花sdlkfj5)


一、QTP识别对象的原理(by yabest, http://www.yabest.net

QTP里的对象有两个概念,一个是Test Object(简称TO),一个是Runtime Object(简称RO)。
这两个概念从字面上不大好理解,也容易混淆。
但从实际作用上来看,应该说TO就是是仓库文件里定义的仓库对象,RO是被测试软件的实际对象。

QTP识别对象,一般是要求先在对象仓库文件里定义仓库对象,里面存有实际对象的特征属性的值。
然后在运行的时候,QTP会根据脚本里的对象名字,在对象仓库里找到对应的仓库对象,
接着根据仓库对象的特征属性描述,在被测试软件里搜索找到相匹配的实际对象,最后就可以对实际对象进行操作了。

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

和TO、RO相关的几个函数有:

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

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

(注:这几个函数访问的都是对象的封装属性,不是对象的自身属性,封装属性和自身属性的区别详见后面第二章QTP操作对象的原理)

理解了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还支持脚本描述的方法来定义和访问对象,即不需要在仓库里定义,也能访问和操作实际对象
( Written by yabest,http://www.yabest.net

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

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操作对象的原理(by yabest, http://www.yabest.net

QTP为用户提供了两种操作对象的接口,一种就是对象的封装接口,另一种是对象的自身接口。

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


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

具体格式如下:
  对实际对象的操作:
      对象.object.自身属性
      对象.object.自身方法()
      对象.GetROProperty("封装属性")
      对象.封装方法()

  对仓库对象的操作:
      对象.GetTOProperty("封装属性")
      对象.GetTOProperties()      ’获取所有封装属性的值
      对象.SetTOProperty("封装属性", "封装属性值")

比如操作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只是封装了部分常用的自身接口嘛。
所以我们在需要时,可以绕过封装接口,直接调用对象的自身接口。
不过有些自身接口不够稳定,在实践中偶尔会出现问题,但是概率很少。
封装接口有相应功能的话,就尽量用封装接口吧!
( Written by yabest,http://www.yabest.net

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

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

(注意:GetROProperty访问的是实际对象的封装接口,GetTOProperty访问的是仓库对象的封装接口,
            两者访问的都是对象的封装接口,即Object Spy窗口里选Test Object时显示的属性。
            不要以为GetROProperty访问的是自身接口,即Object Spy窗口里选Run-time Object时显示的属性。
            QTP里的Test Object/Run-time Object的概念太容易让人混淆了!
            它既用来区分仓库对象和实际对象,又用来区分对象的封装接口和自身接口。



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

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

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

[ 本帖最后由 yabest 于 2008-8-1 10:37 编辑 ]
作者: winfood    时间: 2007-8-16 16:24
标题: 回复 #1 yabest 的帖子
支持一下,讲得很细致
作者: zengfanjin5588    时间: 2007-8-16 17:15
讲的很好,怎么没有人回帖?
作者: jukun_sun    时间: 2007-8-16 17:37
讲的很好哦.
作者: dionysus    时间: 2007-8-16 17:42
学到很多!lz对QTP的研究很深啊,以前是不是程序员啊?
作者: vickywang_no1    时间: 2007-8-16 17:53
请教:
如果直接在QTP的脚本中使用类似下面的语句,会提示找不到对象,是不是不能直接使用QTP脚本啊。
---------------------------------------
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
----------------------------------------

我的例子:(注:其中Browser、Page、Frame对象都是存在的,只是从仓库中删除了对象WebEdit。)
Browser("计费系统").Page("计费系统").Frame("mainFrame").WebEdit("name=names").Set "王平"
作者: vickywang_no1    时间: 2007-8-16 17:57
是不是先要通过 Description.Create() 来创建对象?
作者: yabest    时间: 2007-8-16 18:00
原帖由 vickywang_no1 于 2007-8-16 17:53 发表
请教:
...
Browser("计费系统").Page("计费系统").Frame("mainFrame").WebEdit("name=names").Set "王平"
...


你是不是写错了,少了个冒号啊? 应该是 WebEdit("name:=names")
如果不行,可能有多个对象符合条件,那就加上index条件,如 WebEdit("name:=names", "index:=0“)
作者: yabest    时间: 2007-8-16 20:22
原帖由 dionysus 于 2007-8-16 17:42 发表
学到很多!lz对QTP的研究很深啊,以前是不是程序员啊?


本来是做开发的,结果被骗来做了自动化 sdlkfj7
作者: dionysus    时间: 2007-8-16 21:48
怪不得,能看得出编程功底很强,对许多原理都了解的很清楚。开发的转来做自动化有先天的优势,也许会在这方面有更好的突破呢sdlkfj3
作者: walker1020    时间: 2007-8-16 23:44
谢谢 yabest  的共享! 这些资料对每一位学习和使用QTP的人都会很有帮助的
作者: vickywang_no1    时间: 2007-8-17 09:38
原帖由 yabest 于 2007-8-16 18:00 发表


你是不是写错了,少了个冒号啊? 应该是 WebEdit("name:=names")
如果不行,可能有多个对象符合条件,那就加上index条件,如 WebEdit("name:=names", "index:=0“)


真是少了冒号。第1次知道QTP还有这样的功能,很神奇。太谢谢楼主了。
作者: vickywang_no1    时间: 2007-8-17 09:48
请教:
--------------------------------------
“另外,QTP还支持脚本描述的方法来定义和访问对象,即不需要在仓库里定义,也能访问和操作实际对象”
---------------------------------------
这部分的QTP帮助在哪儿啊,我怎么没有找到呢?
作者: vickywang_no1    时间: 2007-8-17 14:09
已找到相关帮助:
Mercury QuickTest Professional User's Guide > Working with Advanced Testing Features > Working with the Expert View and Function Library Windows > Using Programmatic Descriptions

[ 本帖最后由 vickywang_no1 于 2007-9-3 11:45 编辑 ]
作者: yabest    时间: 2007-8-17 14:43
原帖由 vickywang_no1 于 2007-8-17 09:38 发表

第1次知道QTP还有这样的功能,很神奇。太谢谢楼主了。


还是有很多人不知道描述性编程啊?!
不过我是提倡多用对象库,少用描述性编程的哦!
作者: ppent    时间: 2007-8-17 15:05
不错,学习一下。
最后的恶作剧很搞笑,有没人找个时间试试,呵呵sdlkfj3
作者: 胡喜华    时间: 2007-8-17 17:50
强 ,狂dingsdlkfj3
作者: Banditu    时间: 2007-8-18 11:48
不错,希望LZ多发这类帖子sdlkfj1
作者: Banditu    时间: 2007-8-18 11:50
原帖由 yabest 于 2007-8-17 14:43 发表


还是有很多人不知道描述性编程啊?!
不过我是提倡多用对象库,少用描述性编程的哦!

为什么呢?
描述性编程我觉得挺不错啊sdlkfj5
作者: yabest    时间: 2007-8-18 14:15
原帖由 Banditu 于 2007-8-18 11:50 发表

为什么呢?
描述性编程我觉得挺不错啊sdlkfj5


唉,不说了!
之前我是逢人就劝,结果就被人家说是偏激了sdlkfj7

我也不想变成祥林嫂,唠叨个不停!
你要是觉得好用,就用吧!

[ 本帖最后由 yabest 于 2007-8-18 17:59 编辑 ]
作者: gzj_06    时间: 2007-8-20 12:20
收益匪浅,真的希望LZ多发些这样的帖子sdlkfj2
作者: nedved1020    时间: 2007-8-20 15:35
“肆意的操作它,玩弄它吧!”出自强人之口!!!受教了!!有朝一日,偶也可以!!
作者: xiongxiongyym    时间: 2007-8-21 17:06
真的不亏为精华~~讲的很清楚,学到了sdlkfj2 向LZ学习并致敬~~~~
作者: PPP777    时间: 2007-8-22 18:20
标题: 多谢!
受益非浅!!!
作者: mailizimailizi    时间: 2007-8-22 21:47
太强悍了。。。。。小鸟学习中。。。。
作者: yabest    时间: 2007-8-23 01:09
原帖由 ppent 于 2007-8-17 15:05 发表
不错,学习一下。
最后的恶作剧很搞笑,有没人找个时间试试,呵呵sdlkfj3


呵呵,QTP可以操作和控制其它软件!掌握其原理后,你也可以“肆意的操作它,玩弄它!”sdlkfj3

来个好玩的,修改新浪首页!你也可以用此搞恶作剧戏弄别人!


[attach]31613[/attach]


修改方法非常简单,只要用QTP新建一个Test,开始录制,打开新浪首页,并点击要修改的图片和文字链接,得到下面的脚本



  1. Browser("新闻中心首页_新浪网").Page("新闻中心首页_新浪网").Image("英国出动战斗机拦截俄战略轰炸机").Click
  2. Browser("新闻中心首页_新浪网_2").Page("新闻中心首页_新浪网").Link("民政部:慈善法列入立法计划").Click
  3. Browser("新闻中心首页_新浪网_2").Page("新闻中心首页_新浪网").Link("不赞成以流浪乞讨为职业").Click
  4. Browser("新闻中心首页_新浪网_2").Page("新闻中心首页_新浪网").Link("裹胁残疾人乞讨属于犯罪").Click
  5. Browser("新闻中心首页_新浪网_2").Page("新闻中心首页_新浪网").Link("今年3.1亿人次遭自然灾害").Click
  6. Browser("新闻中心首页_新浪网_2").Page("新闻中心首页_新浪网").Link("研究给死亡者家属抚慰金").Click

复制代码


然后在此基础上做简单修改,修改后内容如下:


  1. ChangeImage  Browser("新闻中心首页_新浪网").Page("新闻中心首页_新浪网").Image("英国出动战斗机拦截俄战略轰炸机"), "E:\temp\bbb.jpg"
  2. ChangeLinkText  Browser("新闻中心首页_新浪网_2").Page("新闻中心首页_新浪网").Link("民政部:慈善法列入立法计划"), "胡总书记号召全国网民向yabest学习"
  3. ChangeLinkText  Browser("新闻中心首页_新浪网_2").Page("新闻中心首页_新浪网").Link("不赞成以流浪乞讨为职业"), "盛赞他辛勤耕耘、勇于灌水的精神"
  4. ChangeLinkText  Browser("新闻中心首页_新浪网_2").Page("新闻中心首页_新浪网").Link("裹胁残疾人乞讨属于犯罪"), "鼓励大家向他送花"
  5. ChangeLinkText  Browser("新闻中心首页_新浪网_2").Page("新闻中心首页_新浪网").Link("今年3.1亿人次遭自然灾害"), "51testing发生罕见特大水灾"
  6. ChangeLinkText  Browser("新闻中心首页_新浪网_2").Page("新闻中心首页_新浪网").Link("研究给死亡者家属抚慰金"), "上百版面被淹无一幸免"

  7. Function ChangeImage(ImageObject, NewImage)

  8.         ImageObject.Object.src = NewImage
  9.        
  10. End Function

  11. Function ChangeLinkText(LinkObject, NewLinkText)

  12.         LinkObject.Object.outerHtml = replace(LinkObject.Object.outerHtml,   LinkObject.Object.outerText,   NewLinkText)

  13. End Function

复制代码


然后运行QTP,再看看新浪首页,上面已经变成你的图片和文字了!

然后你再指着这个窗口,大呼小叫的给别人看,保管那人。。。sdlkfj3

[ 本帖最后由 yabest 于 2007-8-23 01:45 编辑 ]
作者: studyboy_0    时间: 2007-8-23 09:17
标题: ok
ok
作者: 51mobile    时间: 2007-8-23 12:45
楼主真的是太厉害了,学习了啊
作者: danmy    时间: 2007-8-23 14:47
呵呵,赞一个~
作者: Yobbo    时间: 2007-8-23 15:04
原帖由 yabest 于 2007-8-16 16:11 发表
比如有个测试任务,窗口上有很多待检查的记录,每条记录右边都有一个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


为什么我执行时它只是不停的在点击同一个按钮(录制的那个)


ChangeImage  Browser("新闻中心首页_新浪网").Page("新闻中心首页_新浪网").Image("英国出动战斗机拦截俄战略轰炸机"), "E:\temp\bbb.jpg"

本地路径的图片替换不了,但HTTP的可以,why?
作者: yabest    时间: 2007-8-23 17:49
原帖由 Yobbo 于 2007-8-23 15:04 发表

为什么我执行时它只是不停的在点击同一个按钮(录制的那个)


那是因为你的窗口里只有一个label=OK的按钮,这时候不管index等于多少,都指向这唯一的label=OK的按钮。
你可以把label=OK这个属性条件去掉。
也可以改为 label=.* (记得要把正则表达式的选项打勾)

本地路径的图片替换不了,但HTTP的可以,why?


这脚本已经简单的不能再简单了,没有问题的。
肯定是你本地图片地址写错了,或者图片格式IE无法识别。可以将本地图片地址输入到IE地址栏里回车查看一下。

[ 本帖最后由 yabest 于 2007-8-23 17:50 编辑 ]
作者: jackymail    时间: 2007-8-23 18:16
单纯的说是与不是让我更加混淆。
其实就是访问不到一些自身接口,只能访问到已经被封装过来的接口?
被封装了得方法属性就显示在test object里面。
是不是,yabest大师

(注意:GetROProperty访问的是实际对象的封装接口,GetTOProperty访问的是仓库对象的封装接口,
            两者访问的都是对象的封装接口,即Object Spy窗口里选Test Object时显示的属性。
            不要以为GetROProperty访问的是自身接口,即Object Spy窗口里选Run-time Object时显示的属性。
            QTP里的Test Object/Run-time Object的概念太容易让人混淆了!
            它既用来区分仓库对象和实际对象,又用来区分对象的封装接口和自身接口。

作者: txmsky    时间: 2007-8-23 19:25
果然是大神啊!!!
作者: yabest    时间: 2007-8-23 21:44
原帖由 jackymail 于 2007-8-23 18:16 发表
单纯的说是与不是让我更加混淆。
其实就是访问不到一些自身接口,只能访问到已经被封装过来的接口?
被封装了得方法属性就显示在test object里面。
是不是,yabest大师
(注意:GetROProperty访问的是实际对象的封装接口,GetTOProperty访问的是仓库对象的封装接口,
            两者访问的都是对象的封装接口,即Object Spy窗口里选Test Object时显示的属性。
            不要以为GetROProperty访问的是自身接口,即Object Spy窗口里选Run-time Object时显示的属性。
            QTP里的Test Object/Run-time Object的概念太容易让人混淆了!
            它既用来区分仓库对象和实际对象,又用来区分对象的封装接口和自身接口。



也就是说:

对象自身属性的访问比较直接,用 WebButton("..").object.disabled 这样子即可。

对象封装属性的访问比较麻烦,必须用GetROProperty()和GetTOProperty()这两个函数来访问。
实际对象用GetROProperty(),仓库对象用GetTOProperty()。

[ 本帖最后由 yabest 于 2007-8-23 21:50 编辑 ]
作者: yabest    时间: 2007-8-23 21:51
原帖由 txmsky 于 2007-8-23 19:25 发表
果然是大神啊!!!


呵呵,太搞笑了吧,让人想起跳大神来了sdlkfj3

[ 本帖最后由 yabest 于 2007-8-23 21:59 编辑 ]
作者: gzj_06    时间: 2007-8-24 11:21
噢,明白了,用“对象.object.属性”访问的就是对象自身属性,用“对象.GetROProperty("属性")”获得的就是实际对象的封装属性,而用“对象.GetTOProperty("属性")”获得的就是仓库对象的封装属性,在大师的点拨下对概念的理解清晰多了,响应胡总书记的号召,向大师学习!sdlkfj5 sdlkfj3
作者: lyscu    时间: 2007-8-24 12:42
标题:
向高手学习
作者: yabest    时间: 2007-8-25 00:52
原帖由 gzj_06 于 2007-8-24 11:21 发表
噢,明白了,用“对象.object.属性”访问的就是对象自身属性,用“对象.GetROProperty("属性")”获得的就是实际对象的封装属性,而用“对象.GetTOProperty("属性")”获得的就是仓库对象的封装属性,在大师的点拨 ...


嗯,我把这几种相关用法分类列出来,比较有条理点,大家好掌握。

  对实际对象的操作:
      对象.object.自身属性
      对象.object.自身方法()
      对象.GetROProperty("封装属性")
      对象.封装方法()

  对仓库对象的操作:
      对象.GetTOProperty("封装属性")
      对象.GetTOProperties()      ’获取所有封装属性的值
      对象.SetTOProperty("封装属性", "封装属性值")

[ 本帖最后由 yabest 于 2007-8-25 01:01 编辑 ]
作者: wasd2615    时间: 2007-8-25 17:24
网页上的     “胡总书记号召全国网民向yabest学习  ”

这个应该是通过QTP回放才能看到这个效果吧?
那就应该有3种对象了:
1对实际对象的操作:
2对仓库对象的操作
3 “真实对象”---非回放的时候看到的
  这3者之间是的大致关系lz可以和我们解释一下不:)
作者: yabest    时间: 2007-8-25 21:31
原帖由 wasd2615 于 2007-8-25 17:24 发表
网页上的     “胡总书记号召全国网民向yabest学习  ”

这个应该是通过QTP回放才能看到这个效果吧?
那就应该有3种对象了:
1对实际对象的操作:
2对仓库对象的操作
3 “真实对象”---非回放的时候看到的
  这3者之间是的大致关系lz可以和我们解释一下不:)


哪有那么多对象的!你说的真实对象,就是实际对象了!
只不过实际对象在QTP回放后,内容被QTP修改了而已!

仓库对象是实际对象的特征模型,QTP用仓库对象来寻找实际对象。
作者: namedxf    时间: 2007-8-26 14:37
好强的楼主呀,多谢了!!
作者: Yobbo    时间: 2007-8-27 10:10
QUOTE:
本地路径的图片替换不了,但HTTP的可以,why?

这脚本已经简单的不能再简单了,没有问题的。
肯定是你本地图片地址写错了,或者图片格式IE无法识别。可以将本地图片地址输入到IE地址栏里回车查看一下。


...


确实是不行!运行后首页的logo没有变化
点右键属性查看发现图片名字变了duck.gif,但Address(URL)还是http://www.51testing.com/images/new/logo.gif

代码:
ChangeImage Browser("51Testing软件测试网").Page("51Testing软件测试网").Image("51Testing软件测试网"), "d:\duck.gif"

Function ChangeImage(ImageObject, NewImage)

        ImageObject.Object.Src = NewImage
        
End Function

对了,浏览器用的是IE7

[ 本帖最后由 Yobbo 于 2007-8-27 11:04 编辑 ]
作者: Yobbo    时间: 2007-8-27 11:10
原帖由 yabest 于 2007-8-23 17:49 发表


那是因为你的窗口里只有一个label=OK的按钮,这时候不管index等于多少,都指向这唯一的label=OK的按钮。
你可以把label=OK这个属性条件去掉。
也可以改为 label=.* (记得要把正则表达式的选项打勾)


...

我用来测试的是51testing论坛控制面板里的好友列表,所以问题不在于此
代码:
ButtonNum = Browser("51Testing软件测试论坛 测试 | 软件测试").Page("51Testing软件测试论坛 测试 | 软件测试").WebTable("删?").RowCount - 2
For ButtonIndex = 0 To ButtonNum - 1
        Browser("51Testing软件测试论坛 测试 | 软件测试").Page("51Testing软件测试论坛 测试 | 软件测试").WebCheckBox("delete[]").SetTOProperty "Index", ButtonIndex
        Browser("51Testing软件测试论坛 测试 | 软件测试").Page("51Testing软件测试论坛 测试 | 软件测试").WebCheckBox("delete[]").Click
Next
问题已经解决了,关键点在于要把checkbox这个对象的Enable Smart Identification改为False
作者: sterson    时间: 2007-8-27 14:25
我之前也是搞开发的,现在做测试...正学习中...
作者: 笨鸟    时间: 2007-8-28 13:36
很少上51testing,今天一来就长见识了,嗯嗯,LZ不错,工作之余挺会娱乐sdlkfj3
作者: yabest    时间: 2007-8-29 00:40
原帖由 笨鸟 于 2007-8-28 13:36 发表
很少上51testing,今天一来就长见识了,嗯嗯,LZ不错,工作之余挺会娱乐sdlkfj3


呵呵,寓学于乐,学起来更有劲啊!sdlkfj3
作者: yvhkickl    时间: 2007-8-30 00:09
讲得好
作者: andycai    时间: 2007-8-30 11:06
标题: 回复 #1 yabest 的帖子
新手,学习中。。。
作者: vaguely    时间: 2007-8-30 14:49
写得真是太好了!也太油菜了!
这个sample也太funny了sdlkfj3

希望楼主继续用深入检出的方法多总结出一些QTP的知识和用法来
作者: hungun    时间: 2007-8-30 15:53
很好,很强大
作者: Yobbo    时间: 2007-8-31 14:13
怎么变灌水帖了,我48楼的问题还没解决呢
作者: jiangdanyang    时间: 2007-8-31 14:36
原帖由 yabest 于 2007-8-25 00:52 发表


嗯,我把这几种相关用法分类列出来,比较有条理点,大家好掌握。

  对实际对象的操作:
      对象.object.自身属性
      对象.object.自身方法()
      对象.GetROProperty("封装属性")
      对象 ...

自身属性和自身方法我们怎么看呢,怎么知道他有哪些自身属性和自身方法呢?
作者: jiangdanyang    时间: 2007-8-31 14:44
还有就是为什么我在录制完网易的首页之后,会出现如下提示:

当前安全设置禁止运行该页的ActiveX控件.因此,该页可能无法正常显示.

麻烦楼主解答一下,上面的提示什么意思,我已经加载了ActiveX插件
作者: yabest    时间: 2007-8-31 16:03
原帖由 Yobbo 于 2007-8-27 10:10 发表

确实是不行!运行后首页的logo没有变化
点右键属性查看发现图片名字变了duck.gif,但Address(URL)还是

代码:
ChangeImage Browser("51Testing软件测试网").Page("51Testing软件测试网").Image("51Testing软件测试网"), "d:\duck.gif"

Function ChangeImage(ImageObject, NewImage)

        ImageObject.Object.Src = NewImage
        
End Function

对了,浏览器用的是IE7

.



没问题啊,我试了一下,将大logo改成小logo,都挺好的啊。
没试过IE7,说不定IE7不兼容 ImageObject.Object.Src 接口, 你试试IE6吧:)



  1. 'Browser("51Testing软件测试网").Page("51Testing软件测试网").Image("51Testing软件测试网").Click

  2. ChangeImage  Browser("51Testing软件测试网").Page("51Testing软件测试网").Image("51Testing软件测试网"),  "http://bbs.51testing.com/images/51logo.gif"

  3. Function ChangeImage(ImageObject, NewImage)

  4.         ImageObject.Object.Src = NewImage
  5.         
  6. End Function

复制代码

作者: yabest    时间: 2007-8-31 16:06
原帖由 jiangdanyang 于 2007-8-31 14:44 发表
还有就是为什么我在录制完网易的首页之后,会出现如下提示:

当前安全设置禁止运行该页的ActiveX控件.因此,该页可能无法正常显示.

麻烦楼主解答一下,上面的提示什么意思,我已经加载了ActiveX插件


参见此帖 http://bbs.51testing.com/thread-87363-1-6.html
作者: jiangdanyang    时间: 2007-8-31 18:00
楼主麻烦解答一下#63楼的问题
作者: yabest    时间: 2007-8-31 18:28
原帖由 jiangdanyang 于 2007-8-31 18:00 发表
楼主麻烦解答一下#63楼的问题


晕,看贴不仔细,罚你再看几遍主贴(1楼)sdlkfj3
作者: 厍仕杰    时间: 2007-9-1 13:26
学习了 一直对自动化测试的东西 感觉不清晰
作者: tails82    时间: 2007-9-4 11:05
学习了:)真的不错
作者: jiangdanyang    时间: 2007-9-4 11:32
原帖由 yabest 于 2007-8-31 18:28 发表


晕,看贴不仔细,罚你再看几遍主贴(1楼)sdlkfj3


遵命!
作者: 青桔子    时间: 2007-9-4 11:39
标题: 真的很厉害,顶!
我初用qtp,以前都是简单的录制公司的产品,没有涉及到对象这块,我现在想用qtp录制web迅雷下载文件,但是当点击新建任务按钮后的弹出窗口时,qtp总是录制不下来脚本,在群里问了很多朋友,都没有一个好的答案。
请问高手能不能指导一下。万分感谢!
作者: yabest    时间: 2007-9-4 15:11
原帖由 青桔子 于 2007-9-4 11:39 发表
我初用qtp,以前都是简单的录制公司的产品,没有涉及到对象这块,我现在想用qtp录制web迅雷下载文件,但是当点击新建任务按钮后的弹出窗口时,qtp总是录制不下来脚本,在群里问了很多朋友,都没有一个好的答案。
请问高手能不能指导一下。万分感谢!


这个没试过,找时间试一下。不知道迅雷是用什么编程语言做的,是不是QTP无法识别?
作者: jianglm    时间: 2007-9-5 11:58
高手  工作中乐趣
作者: fanpig    时间: 2007-9-6 14:48
好东西,收藏起来慢慢看sdlkfj2
作者: marygao929    时间: 2007-9-18 21:26
lz能否介绍一下学习经验, 哪天我也能学到这种程度就好了!
作者: marygao929    时间: 2007-9-21 16:12
有些深奥
作者: lele218    时间: 2007-9-21 17:15
值得学习, 先保存下来
作者: zihua    时间: 2007-9-24 09:55
学到了很多,谢谢
作者: xiaohou1210    时间: 2007-10-16 09:42
谢谢,参考了。

[ 本帖最后由 xiaohou1210 于 2007-10-16 09:49 编辑 ]
作者: gggwavj    时间: 2007-11-11 21:53
楼主的讲解太精辟了,顶
作者: sandsor    时间: 2007-11-14 22:36
有趣,呵呵,学习中。。。。
作者: 电线杆剔牙    时间: 2007-12-5 12:47
来了不管怎么样,先顶了再说.
LZ简直是我的偶像,Cool爱LZ哈哈
作者: xiaoyaoke    时间: 2007-12-10 15:09
果然很强,时隔几个月过来再看依然感觉收益匪浅
作者: kaidong12    时间: 2007-12-21 10:20
标题: 回复 1# 的帖子
顶~~~~~~~~~~~~~~~
向楼主学习~~~~~~~~~~
作者: wuzhiyongnihao    时间: 2008-1-25 16:41
标题: 回复 1# 的帖子
每看一次都觉得了不起........多发几篇这个水平的文章啊........
作者: gggwavj    时间: 2008-1-31 17:52
太强了楼主,
作者: qicyt1812    时间: 2008-2-26 11:25
楼主太强了,看了受益匪浅啊,一定好好学习!!! 向楼主看齐,o(∩_∩)o...哈哈
作者: zhaoqiang0314    时间: 2008-5-21 17:02
写得真好,顶起
作者: sally_0817    时间: 2008-5-21 17:14
讲的很细致,理解的更深刻了
作者: kxllr    时间: 2008-5-23 16:08
学习了,太深奥了
Function ChangeLinkText(LinkObject, NewLinkText)

        LinkObject.Object.outerHtml = replace(LinkObject.Object.outerHtml,   LinkObject.Object.outerText,   NewLinkText)

End Function

没看明白是什么意思,能解释一下吗?谢谢!!

[ 本帖最后由 kxllr 于 2008-5-26 10:58 编辑 ]
作者: hapxh    时间: 2008-6-25 11:29
haotie
作者: fengbin20    时间: 2008-6-25 17:04

作者: jiamin_ff    时间: 2008-7-2 15:01

作者: corsun    时间: 2008-7-8 14:55
楼主对QTP的了解真是透彻啊,读起来使我豁然开朗
作者: wang7931_cn    时间: 2008-7-15 13:13
不错,很有意思,谢谢LZ!
看来LZ是强人啊.不知以后我碰到问题是否可以多多指点指点!
作者: FLY000    时间: 2008-7-17 19:29
请问YABEST,你的FRAME去哪里了,我很想去掉录制脚本里的FRAME,通过设置还是不能解决。

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
作者: yabest    时间: 2008-7-17 21:52
呵呵,web窗口里才有frame,windows和java窗口里是没有frame的。

你干嘛跟fame过不去啊? 又不碍你什么事!

[ 本帖最后由 yabest 于 2008-7-17 22:07 编辑 ]
作者: 在测试中成长    时间: 2008-7-23 00:36
长见识了。。谢谢LZ分享~
作者: jotun    时间: 2008-8-1 10:00
标题: 回复 1# 的帖子
请问:您说到用对象查看器(Object Spy)查看对象,在查看窗口里当选择Runtime Object时,它显示的就是对象的自身接口(自身的属性和方法)
当选择Test Object时,它显示的就是对象的封装接口(封装的属性和方法)
那GetROProperty():取得实际对象的某个属性的值 和  对象.GetROProperty("封装属性") 这两两句怎么理解?
作者: yabest    时间: 2008-8-1 10:32
原帖由 jotun 于 2008-8-1 10:00 发表
请问:您说到用对象查看器(Object Spy)查看对象,在查看窗口里当选择Runtime Object时,它显示的就是对象的自身接口(自身的属性和方法)
当选择Test Object时,它显示的就是对象的封装接口(封装的属性和方法)
那GetROProperty():取得实际对象的某个属性的值 和  对象.GetROProperty("封装属性") 这两两句怎么理解?
...


GetROProperty():取得实际对象的某个属性的值 和  对象.GetROProperty("封装属性") 这两两句怎么理解?

两者说的是一回事,这里的"某个属性"指的就是封装属性,GetROProperty()只能访问封装属性。
自身属性只能通过 "对象.object.自身属性" 来访问,不能通过GetROProperty()访问
我在原文中加了说明。
作者: xtha21    时间: 2008-8-14 16:53
LZ强!
哎。。。。。
自叹啊,我什么时候才能学到这么多的东西啊
努力努力!
作者: fiena    时间: 2008-9-26 14:36
学习了
LZ放我博客上了啊
好文章收藏
作者: fiena    时间: 2008-9-26 14:53
LZ最后的真逗
哈哈
作者: jenney    时间: 2008-10-13 16:19
学习了,谢谢楼主!!
作者: xmylll    时间: 2008-10-30 15:03
原帖由 yabest 于 2007-8-16 20:22 发表


本来是做开发的,结果被骗来做了自动化 sdlkfj7

   恩,我还以为就我一个呢!
作者: renf    时间: 2008-11-25 12:18
刚开始学QTP,对我的帮助很大,多谢这帖子啊!
作者: qishenye    时间: 2008-12-2 10:46
支持支持
作者: cebola    时间: 2009-1-18 20:31
学习了,谢谢lz。
作者: morrith    时间: 2009-2-20 17:55
最后很~~~
作者: andychen911    时间: 2009-3-3 21:05
标题: 好好和LZ学哈
好好和LZ学哈




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2