51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 6693|回复: 19
打印 上一主题 下一主题

[原创] 【QTP 编码小知识 二】

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2008-9-26 09:33:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家看看下面代码,代码是运行在谷歌的主页面,如果大家要试的话,大家同样也可以试试这代码的运行结果。
      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
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
发表于 2008-9-26 10:28:27 | 只看该作者
原帖由 假装不在 于 2008-9-26 09:33 发表
大家看看下面代码,代码是运行在谷歌的主页面,如果大家要试的话,大家同样也可以试试这代码的运行结果。
      Dim LinkDes
     Set LinkDes=description.Create()
     LinkDes("html tag").value="A"

     ...


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

先去取到页面上所有链接的url,然后逐一跳转,就不会有这一问题了
回复 支持 反对

使用道具 举报

该用户从未签到

3#
发表于 2008-9-26 10:36:04 | 只看该作者
顺便在补充下~
For i=0 to LinkObj.count
这里.count后不要忘记再-1...
最近老看到有人贴的代码里没有这个-1
回复 支持 反对

使用道具 举报

该用户从未签到

4#
 楼主| 发表于 2008-9-26 10:41:15 | 只看该作者
你说的是,例如
a(i)=cstr(linkobj(j))
for k=0 to count
borwser().page().link("url:="&a(k)).click
next

这样?
回复 支持 反对

使用道具 举报

该用户从未签到

5#
发表于 2008-9-26 10:55:21 | 只看该作者
看到“蛛丝马迹”了
回复 支持 反对

使用道具 举报

该用户从未签到

6#
发表于 2008-9-26 11:02:01 | 只看该作者
你的都支持一下,虽然测试的不是BS架构的软件。
回复 支持 反对

使用道具 举报

该用户从未签到

7#
发表于 2008-9-26 12:06:14 | 只看该作者
原帖由 假装不在 于 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
回复 支持 反对

使用道具 举报

该用户从未签到

8#
 楼主| 发表于 2008-9-26 12:13:44 | 只看该作者
我不赞成你用navigate 的方法。我支持click。
起码可以改写成
For i=0 to LinkObj.count-1
browser(":=").page().link("url:="&urls(i)).click
browser().back
Next
尽多的模拟操作。
回复 支持 反对

使用道具 举报

该用户从未签到

9#
 楼主| 发表于 2008-9-27 11:14:13 | 只看该作者
原帖由 heqingbluesky 于 2008-9-26 11:02 发表
你的都支持一下,虽然测试的不是BS架构的软件。


同志,你盲目崇拜
回复 支持 反对

使用道具 举报

该用户从未签到

10#
发表于 2008-9-27 15:11:45 | 只看该作者
我的帖子“脚本的奇怪问题”和你的这个很相似。

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

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

我认为丢失对象的说法不是很准确。如果是丢失对象,那为什么会丢失呢?
回复 支持 反对

使用道具 举报

该用户从未签到

11#
发表于 2008-9-27 15:27:55 | 只看该作者
原帖由 假装不在 于 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
回复 支持 反对

使用道具 举报

该用户从未签到

12#
 楼主| 发表于 2008-9-27 16:13:29 | 只看该作者
原帖由 hsjzfling 于 2008-9-27 15:27 发表


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




2个理由简单推翻你:
1,link click是同时是可以检查例如点击连接后IE死掉(非正常关闭)的情况,也就是我们要抓到的BUG目的之一,如果直接使用跳转,失去意义。
2,使用click的目的还有一些跳出的msgbox可以接受处理,如果使用跳转,同样的道理
回复 支持 反对

使用道具 举报

该用户从未签到

13#
发表于 2008-9-27 17:04:21 | 只看该作者
请注意我的假设前提
回复 支持 反对

使用道具 举报

该用户从未签到

14#
 楼主| 发表于 2008-9-27 17:32:47 | 只看该作者
原帖由 hsjzfling 于 2008-9-27 17:04 发表
请注意我的假设前提

假装没看到
回复 支持 反对

使用道具 举报

该用户从未签到

15#
发表于 2008-10-3 05:00:47 | 只看该作者

回复 14# 的帖子

晕,假装不在意问题核心,顾左右而言它!
回复 支持 反对

使用道具 举报

该用户从未签到

16#
发表于 2008-12-1 14:21:54 | 只看该作者
有点启发,大家的讨论意见都很不错。
回复 支持 反对

使用道具 举报

该用户从未签到

17#
发表于 2008-12-4 13:40:38 | 只看该作者
学习中~~~
回复 支持 反对

使用道具 举报

该用户从未签到

18#
发表于 2009-9-9 22:41:36 | 只看该作者
原帖由 假装不在 于 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的获取子对象有什么区别呢?
回复 支持 反对

使用道具 举报

该用户从未签到

19#
发表于 2009-9-10 00:25:27 | 只看该作者
QTP的bug
回复 支持 反对

使用道具 举报

该用户从未签到

20#
发表于 2010-6-14 14:03:32 | 只看该作者
按你这样运行后还会出现相同的错误啊
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-13 04:04 , Processed in 0.088509 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表