51Testing软件测试论坛

标题: 使用对象代替Browser("...").Page("...")即出错 [打印本页]

作者: chooffy104    时间: 2009-7-21 09:53
标题: 使用对象代替Browser("...").Page("...")即出错
问题变了,请见最后回帖
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好友买卖的页面下,点击“我买的起的人”然后在新窗口点击“展开更多”,再关闭,如此重复

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

[ 本帖最后由 chooffy104 于 2009-7-22 11:23 编辑 ]
作者: dreamever    时间: 2009-7-21 09:58
用index试一下。
作者: chooffy104    时间: 2009-7-21 10:04
原帖由 dreamever 于 2009-7-21 09:58 发表
用index试一下。


也试过这个方法
但是这个点击弹出的窗口,每个循环结尾都会关闭的
不管什么时候,页面上“展开更多的”的LINK也只有一个
作者: ls_721521    时间: 2009-7-21 12:20
把Browser("creationtime:=0").里的属性换一下呢?
是不是qtp把再次打开的窗口当成了creationtime:=1?
作者: tongl0413    时间: 2009-7-21 13:38
henhao
作者: lijian422202    时间: 2009-7-21 13:51
你在循环结束后,用spy去检索下对象,看是否还存在?如果不存在了,咱们继续,如果存在,那么去看frame的ID,最好以ID作为描述性能语言的属性。
作者: chooffy104    时间: 2009-7-21 15:29
谢谢楼上各位,小弟也是刚学不就,所以不是很明白一些太细节的事情。
刚我我再试了一下,发现按照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确实没有关闭过
作者: 风雪夜归人    时间: 2009-7-21 15:34
strHwnd = Browser(":=").GetRoProterty("hwnd")
Browser("hwnd:=" & strHwnd).xxxxxxxxxxx
作者: onlonely    时间: 2009-7-21 21:38
creationtime代表的打开窗口的顺序.
你只要用另外的唯一的属性描述这个browser,
比如Browser("name:=.*")
只是,这样描述,你就必须保证确确实实只打开了一个browser
作者: chooffy104    时间: 2009-7-22 10:38
昨天晚上按照楼上各位的意见再尝试了一下,发现问题愈发奇怪了
一开始,我认为问题是出在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号码")的话就一切正常

这是为什么呢,我想不明白
还请论坛上各位前辈赐教
作者: onlonely    时间: 2009-7-22 13:37
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浏览器对象就非唯一了).就会报错
作者: momang    时间: 2009-7-22 16:47
   使用 QTP 玩 QQ空间啊

学以致用  不错不错




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