51Testing软件测试论坛

标题: 【QTP 编码小知识 二】 [打印本页]

作者: 假装不在    时间: 2008-9-26 09:33
标题: 【QTP 编码小知识 二】
大家看看下面代码,代码是运行在谷歌的主页面,如果大家要试的话,大家同样也可以试试这代码的运行结果。
      Dim LinkDes
     Set LinkDes=description.Create()
     LinkDes("html tag").value="A"

     Set LinkObj=browser("Google").Page("Google").ChildObjects(LinkDes)
     For i=0 to LinkObj.count
        LinkObj(i).click
        browser("Google").Back
     Next
     
    代码运行完后,你会发现,原来在循环第2次连接点击的时候,抛出了一个“General run error”。这个是为什么会这样?之前也同样有论坛的朋友问到这样的问题,所以今天就在这里提到。
    问题是出在了对第一个连接点击后,做了返回操作所导致的,在第一次back的时候,LinkObj对象就已经丢失了,失效了。所以你在做第2次操作的时候,LinkObj(i)就已经找不到了,因此它会出错。
    正确的方法,这个也是我目前想到的,或者还有其它达人能做更好的方法出来。
      Dim LinkDes
     Set LinkDes=description.Create()
     LinkDes("html tag").value="A"

     Set LinkObj=browser("Google").Page("Google").ChildObjects(LinkDes)
     For i=0 to LinkObj.count
         Set LinkObj=browser("Google").Page("Google").ChildObjects(LinkDes)
        LinkObj(i).click
        browser("Google").Back
     Next
作者: hsjzfling    时间: 2008-9-26 10:28
原帖由 假装不在 于 2008-9-26 09:33 发表
大家看看下面代码,代码是运行在谷歌的主页面,如果大家要试的话,大家同样也可以试试这代码的运行结果。
      Dim LinkDes
     Set LinkDes=description.Create()
     LinkDes("html tag").value="A"

     ...


如果页面上的链接排序可能发生变化,即假设点击某个链接后该链接在页面上的排序会发生变化,则lz这个方法就要不灵咯~~

先去取到页面上所有链接的url,然后逐一跳转,就不会有这一问题了
作者: hsjzfling    时间: 2008-9-26 10:36
顺便在补充下~
For i=0 to LinkObj.count
这里.count后不要忘记再-1...
最近老看到有人贴的代码里没有这个-1
作者: 假装不在    时间: 2008-9-26 10:41
你说的是,例如
a(i)=cstr(linkobj(j))
for k=0 to count
borwser().page().link("url:="&a(k)).click
next

这样?
作者: helius    时间: 2008-9-26 10:55
看到“蛛丝马迹”了
作者: heqingbluesky    时间: 2008-9-26 11:02
你的都支持一下,虽然测试的不是BS架构的软件。
作者: hsjzfling    时间: 2008-9-26 12:06
原帖由 假装不在 于 2008-9-26 10:41 发表
你说的是,例如
a(i)=cstr(linkobj(j))
for k=0 to count
borwser().page().link("url:="&a(k)).click
next

这样?


这样。。。
Dim LinkDes, LinkObj, i
Dim urls(1000)
Set LinkDes=description.Create()
LinkDes("micclass").value="Link"
Set LinkObj=browser(":=").Page(":=").ChildObjects(LinkDes)
For i=0 to LinkObj.count-1
urls(i)=LinkObj(i).GetROProperty("url")
Next
For i=0 to LinkObj.count-1
browser(":=").navigate urls(i)
Next
作者: 假装不在    时间: 2008-9-26 12:13
我不赞成你用navigate 的方法。我支持click。
起码可以改写成
For i=0 to LinkObj.count-1
browser(":=").page().link("url:="&urls(i)).click
browser().back
Next
尽多的模拟操作。
作者: 假装不在    时间: 2008-9-27 11:14
原帖由 heqingbluesky 于 2008-9-26 11:02 发表
你的都支持一下,虽然测试的不是BS架构的软件。


同志,你盲目崇拜
作者: testman    时间: 2008-9-27 15:11
我的帖子“脚本的奇怪问题”和你的这个很相似。

这样的问题,规避的方法有很多。

但是这种问题产生的原因是什么?

我认为丢失对象的说法不是很准确。如果是丢失对象,那为什么会丢失呢?
作者: hsjzfling    时间: 2008-9-27 15:27
原帖由 假装不在 于 2008-9-26 12:13 发表
我不赞成你用navigate 的方法。我支持click。
起码可以改写成
For i=0 to LinkObj.count-1
browser(":=").page().link("url:="&urls(i)).click
browser().back
Next
尽多的模拟操作。


如果只是简单的link,navigate效果是一样的,如果有js的话那就还是得去click了,大思路是一样的,就是先去取url
作者: 假装不在    时间: 2008-9-27 16:13
原帖由 hsjzfling 于 2008-9-27 15:27 发表


如果只是简单的link,navigate效果是一样的,如果有js的话那就还是得去click了,大思路是一样的,就是先去取url




2个理由简单推翻你:
1,link click是同时是可以检查例如点击连接后IE死掉(非正常关闭)的情况,也就是我们要抓到的BUG目的之一,如果直接使用跳转,失去意义。
2,使用click的目的还有一些跳出的msgbox可以接受处理,如果使用跳转,同样的道理
作者: hsjzfling    时间: 2008-9-27 17:04
请注意我的假设前提
作者: 假装不在    时间: 2008-9-27 17:32
原帖由 hsjzfling 于 2008-9-27 17:04 发表
请注意我的假设前提

假装没看到
作者: zengyixun    时间: 2008-10-3 05:00
标题: 回复 14# 的帖子
晕,假装不在意问题核心,顾左右而言它!
作者: vprince    时间: 2008-12-1 14:21
有点启发,大家的讨论意见都很不错。
作者: sanlo    时间: 2008-12-4 13:40
学习中~~~
作者: lery    时间: 2009-9-9 22:41
原帖由 假装不在 于 2008-9-26 09:33 发表
大家看看下面代码,代码是运行在谷歌的主页面,如果大家要试的话,大家同样也可以试试这代码的运行结果。
      Dim LinkDes
     Set LinkDes=description.Create()
     LinkDes("html tag").value="A"

     ...






LZ,有个问题不明白 请教你:
我现在那个项目上要获取某个TABLE上的所有链接在QTP8.2上要用links=browser("XXX").Page("XXX").WebTable("XXX").getelementsbytagname("A")才能获取到,
但是在QTP9.2上却要用links=browser("XXX").Page("XXX").WebTable("XXX").ChildObjects(DesLink)才可以呢?(家里用的QTP和公司用的版本不一样,呵呵)
另外在WebTable的方法中还存在着ChildItem这个方法,它和ChildObjects的获取子对象有什么区别呢?
作者: dabeixiong    时间: 2009-9-10 00:25
QTP的bug
作者: xc202    时间: 2010-6-14 14:03
按你这样运行后还会出现相同的错误啊




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