51Testing软件测试论坛

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

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 4138|回复: 11
打印 上一主题 下一主题

[资料] 使用对象代替Browser("...").Page("...")即出错

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2009-7-21 09:53:50 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
问题变了,请见最后回帖
Set B_P_F1=Browser("creationtime:=0").Page("url:=http://.*").Frame("title:=好友买卖")
Set B_P_F2=Browser("creationtime:=0").Page("url:=http://.*").Frame("title:=朋友买卖 - Qzone","url:=http://.*.qq号码")
Dim i
i=1
While  i<=5

B_P_F1.Link("index:=1","outertext:=我买得起的人").Click
'判断是否存在“点击展开更多”
If  B_P_F2.Link("text:=点击展开更多>>").Exist(0) Then
print("查找到展开很多")
B_P_F2.Link("text:=点击展开更多>>").Click
else
print("查找不到展开很多")'
End If
i=i+1
Browser("creationtime:=0").Page("url:=http://.*").WebButton("outertext:=╳").Click
Wend

如上,把脚本复制到QTP里,将红字改为自己的QQ号码,再进入QQ好友买卖首页即可使用。
脚本大致步骤就是在QQ好友买卖的页面下,点击“我买的起的人”然后在新窗口点击“展开更多”,再关闭,如此重复

问题在于,如下图

在第一次循环的时候,脚本可以在弹出的窗口中查找到“展开很多”,但循环结束,关闭窗口,再第二次循环的时候,就无法查找到了
感觉是QTP把两次打开的窗口分做不同的FRAME来对待,但是用SPY查看,无论哪次打开的每个值都是一样的
请问有什么好的方法可以解决这种问题呢

[ 本帖最后由 chooffy104 于 2009-7-22 11:23 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

12#
发表于 2009-7-22 16:47:29 | 只看该作者
   使用 QTP 玩 QQ空间啊

学以致用  不错不错
回复 支持 反对

使用道具 举报

该用户从未签到

11#
发表于 2009-7-22 13:37:12 | 只看该作者
for i=1 to 5
  Browser("CreationTime:=0").Page("url:=.*").Frame("title:=好友买卖").Link("text:=我买得起的人","index:=1").Click
  Browser("CreationTime:=0").Page("url:=.*").Frame("title:=朋友买卖 - Qzone").Link("text:=点击展开更多>>").Click
  Browser("CreationTime:=0").Page("url:=.*").Frame("title:=朋友买卖 - Qzone").WebButton("name:=关闭").Click
next

绕了这么多圈圈,越绕越复杂,
如果你要做一个<查找更多>的循环,用上面的代码就可以了

描述性编程等于对象库中不使用<智能识别>功能的对象.会无法找到这个对象.
根本原因就是你描述的属性太少或者错误,无法唯一表达一个RO的对象,
至于使用set object=Browser("CreationTime:=0").Page("url:=.*").Frame("title:=朋友买卖 - Qzone")后无法识别,
原因不能划分为方法上面,还是对象描述的问题.所以你问的问题本身就是错误的,所谓的分析问题思路已经错了.

另外你要明白"CreationTime:=0"或者"index:=0"是一种索引属性,是属于辅助识别属性,在对象已经是唯一情况下,这个属性是任何值都无关紧要
所以你用Browser("CreationTime:=1")也能正确使用,而那次不能使用,我猜测应该是你当时打开了2个浏览器(这个时候RO浏览器对象就非唯一了).就会报错
回复 支持 反对

使用道具 举报

该用户从未签到

10#
 楼主| 发表于 2009-7-22 10:38:21 | 只看该作者
昨天晚上按照楼上各位的意见再尝试了一下,发现问题愈发奇怪了
一开始,我认为问题是出在Browser("creationtime:=0")这里,估计可能是每次打开,QTP都以为我重新开了一次浏览器

然后今天早上再次实验的时候,无意中复制错了代码,然后发现如下的情况
代码简化至如下:
Set B_P_F1=Browser("creationtime:=0").Page("url:=http://.*").Frame("title:=好友买卖")
Set B_P_F2=Browser("creationtime:=1").Page("url:=http://.*").Frame("title:=朋友买卖 - Qzone","url:=http://.*.qq号码")
i=0
While  i<=5
if  B_P_F2.Link("text:=点击展开更多>>").Exist(0) Then
print("1查找到展开很多")
B_P_F2.Link("text:=点击展开更多>>").Click
End If
Browser("creationtime:=0").Page("url:=http://.*").WebButton("outertext:=╳").Click
Wend

--上文代码即使最早的错误代码,在此情况下,只有第一次循环可以正确查找到展开很多。
但是如果在循环中把B_P_Fx换回原来的格式,依次使creationtime:=")值增加,就可以正确查找到,这也是我最初认为问题处在creationtime的原因

但是今天上午我试用了如下的代码
Set B_P_F1=Browser("creationtime:=0").Page("url:=http://.*").Frame("title:=好友买卖")
Set B_P_F2=Browser("creationtime:=1").Page("url:=http://.*").Frame("title:=朋友买卖 - Qzone","url:=http://.*.qq号码")
i=0
While  i<=5
if  Browser("creationtime:=0").Page("url:=http://.*").Frame("title:=朋友买卖 - Qzone","url:=http://.*.qq号码").Link("text:=点击展开更多>>").Exist(0) Then
print("1查找到展开很多")
Browser("creationtime:=0").Page("url:=http://.*").Frame("title:=朋友买卖 - Qzone","url:=http://.*.qq号码").Link("text:=点击展开更多>>").Click
End If
Wend
却很奇怪的成功了,后来我再把代码中IF循环里的creationtime值不断改变,发现都没有任何问题。

换句话说,如果我在脚本最初设置了
Set B_P_F2=Browser("creationtime:=1").Page("url:=http://.*").Frame("title:=朋友买卖 - Qzone","url:=http://.*.qq号码")
那只要我在循环中使用B_P_F2就会出现第二次循环的时候无法查找到对象的现象
而使用Browser("creationtime:=1").Page("url:=http://.*").Frame("title:=朋友买卖 - Qzone","url:=http://.*.qq号码")的话就一切正常

这是为什么呢,我想不明白
还请论坛上各位前辈赐教
回复 支持 反对

使用道具 举报

该用户从未签到

9#
发表于 2009-7-21 21:38:26 | 只看该作者
creationtime代表的打开窗口的顺序.
你只要用另外的唯一的属性描述这个browser,
比如Browser("name:=.*")
只是,这样描述,你就必须保证确确实实只打开了一个browser
回复 支持 反对

使用道具 举报

该用户从未签到

8#
发表于 2009-7-21 15:34:31 | 只看该作者
strHwnd = Browser(":=").GetRoProterty("hwnd")
Browser("hwnd:=" & strHwnd).xxxxxxxxxxx
回复 支持 反对

使用道具 举报

该用户从未签到

7#
 楼主| 发表于 2009-7-21 15:29:01 | 只看该作者
谢谢楼上各位,小弟也是刚学不就,所以不是很明白一些太细节的事情。
刚我我再试了一下,发现按照4楼的提示,把脚本该成
-----------
Set B_P_F1=Browser("creationtime:=0").Page("url:=http://.*").Frame("title:=好友买卖")
Set B_P_F2=Browser("creationtime:=0").Page("url:=http://.*").Frame("title:=朋友买卖 - Qzone","url:=http://.*.20939461")
Set B_P_F3=Browser("creationtime:=1").Page("url:=http://.*").Frame("title:=朋友买卖 - Qzone","url:=http://.*.20939461")
Dim i
i=1
While  i<=5
B_P_F1.Link("index:=1","outertext:=我买得起的人").Click
'判断是否存在“点击展开更多”
If  B_P_F2.Link("class:=c_tx4").Exist(0) Then
print("查找到展开很多")
B_P_F2.Link("class:=c_tx4").Click
else
print("查找不到展开很多")'
If  B_P_F3.Link("class:=c_tx4").Exist(0) Then
print("在第二次查找到展开很多")
B_P_F3.Link("class:=c_tx4").Click
else
print("第二次也查找不到展开很多")'
End If
End If
i=i+1
Browser("creationtime:=0").Page("url:=http://.*").WebButton("outertext:=╳").Click
Wend
-------
得到了:
查找到展开很多
查找不到展开很多
在第二次查找到展开很多
查找不到展开很多
的结果。

看来,虽然Browser从来没有关闭,但是QTP把再次打开的子窗口当成creationtime:=1的Browser里的子窗口了。

问题在这里,虽然可以在WHILE循环里用公式,每次循环都把creationtime的数值加1,但是因为我真正想做的效果,循环的次数会更多,如果每次打开都要去增加creationtime并不太现实。
有没有什么好方法可以解决这个问题呢
比如说每次循环开始前都初始化,让计算机认定只有一个Browser之类的方法。
毕竟IE确实没有关闭过
回复 支持 反对

使用道具 举报

该用户从未签到

6#
发表于 2009-7-21 13:51:27 | 只看该作者
你在循环结束后,用spy去检索下对象,看是否还存在?如果不存在了,咱们继续,如果存在,那么去看frame的ID,最好以ID作为描述性能语言的属性。
回复 支持 反对

使用道具 举报

该用户从未签到

5#
发表于 2009-7-21 13:38:48 | 只看该作者
henhao
回复 支持 反对

使用道具 举报

该用户从未签到

4#
发表于 2009-7-21 12:20:15 | 只看该作者
把Browser("creationtime:=0").里的属性换一下呢?
是不是qtp把再次打开的窗口当成了creationtime:=1?
回复 支持 反对

使用道具 举报

该用户从未签到

3#
 楼主| 发表于 2009-7-21 10:04:40 | 只看该作者
原帖由 dreamever 于 2009-7-21 09:58 发表
用index试一下。


也试过这个方法
但是这个点击弹出的窗口,每个循环结尾都会关闭的
不管什么时候,页面上“展开更多的”的LINK也只有一个
回复 支持 反对

使用道具 举报

该用户从未签到

2#
发表于 2009-7-21 09:58:03 | 只看该作者
用index试一下。
回复 支持 反对

使用道具 举报

本版积分规则

关闭

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

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

GMT+8, 2024-11-23 06:24 , Processed in 0.097426 second(s), 29 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

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