QTP关于页面跳转的等待
QTP进行页面操作的时候,需要涉及到等待页面切换的情景,我将可以想到的等待方法总结出来,讨论一下利弊1).根据判断下一页面的某个对象是否存在判断
If not Browser("XXX").Page("XXX").WebButton("XXX").Exist(HT) Then
msgbox "Turn to *** Page failed!"
Else
msgbox "Turn to *** Page pass!"
End If
2).判断页面是否被同步
Browser("Mercury Tours").Page("Mercury Tours").Sync
3).在《51测试天地》16期电子杂志看到通过IE 的 COM 接口
Set oIE = CreateObject("InternetExplorer.Application")
oIE.Visable = True
oIE.Navagate "http://baidu.com"
While oIE.Busy: Wend '等待IE页面加载完毕
这三种方法, 我用的最多的是第一种,第二种很少用,第三种没有用过,不知道这三种方法的利弊是什么,并且在什么情况下用哪种比较好?又或者有没有其他的等待页面跳转方法? 浏览器加载、渲染和解析过程的黑箱分析:
http://lifesinger.org/blog/2009/08/browser-load-render-parse-process/
个人感觉:
第一种最容易出问题,是判断某控件出现为标识,但在某些情况下会出现所判断的控件已经渲染展示完毕,但整个页面还处于解析展示过程中,造成下一步操作失败;
第二种方式:在linux下,sync的作用是将缓冲区的数据写到硬盘,应该在浏览器中也有类似作用,就是将缓冲的http的数据解析完成后,个人感觉很靠谱;
第三种方法是判断浏览器的状态,在页面解析过程中浏览器貌似应该是busy状态,解析展示完成后状态改变,所以也应该是可靠的,但从方便程度来说就远远不如方法二了; 总之,绝对不要msgbox!你下班执行脚本的时候它弹了,谁来去点?????用Reporter.ReportEvent
我一般用第二种就满足了 如果是第一次启动浏览器,偏向于第一种,中途跳转建议使用2
2,3和1不是一类
1判断的是控件,相当于验证点了,如果单纯是为了判断页面缓冲建议使用2 哦, 没有的,我上面只是举个例子,用msgbox会死的很惨的 哦,错了..是第一个..我一般用第一种来判断,做判断存在的检查点 激情大奉献,我封装的函数,结合了第三种,第三种最好的其实是
Public Sub LaunchIEAndLoaded(url)
Dim oIE,hwnd
' 使用IE COM
Set oIE = CreateObject("InternetExplorer.Application")
oIE.Visible = True '设置为可见
oIE.Navigate url '跳转URL
hwnd = Browser("title:=.*").GetROProperty("HWND")
' MsgBox CStr(hwnd)
Window("hwnd:=" & hwnd).Maximize '将浏览器最大化
' 等待IE页面加载完毕
While oIE.Busy: Wend
Wait(1)
' 释放对象
Set oIE = Nothing
End Sub 补充,2的话,我一般单独用的,目的是同步而已~ 原帖由 yujie6832 于 2010-2-2 12:26 发表 http://bbs.51testing.com/images/common/back.gif
激情大奉献,我封装的函数,结合了第三种,第三种最好的其实是
Public Sub LaunchIEAndLoaded(url)
Dim oIE,hwnd
' 使用IE COM
Set oIE = CreateObject("InternetExplorer.Application")
oIE.Visibl ...
既然已经用了While oIE.Busy: Wend,最后的WAIT就不用加了,中间的MSGBOX也可以去掉了,再加个REPORT日志就更好,呵呵~ 原帖由 zzxxbb112 于 2010-2-2 12:34 发表 http://bbs.51testing.com/images/common/back.gif
既然已经用了While oIE.Busy: Wend,最后的WAIT就不用加了,中间的MSGBOX也可以去掉了,再加个REPORT日志就更好,呵呵~
WAIT(1)是为了防止千分之一的突然用的,加一秒更保险和稳定,其实是因为我觉得在最大化窗口的时候也要一定时间,主要是为了这个,MSGBOX是不高兴删了,留着,呵呵。REPORTER这个等实际需要的话再加,谢谢指点 不会的,呵呵,如果是考虑最大化时间的话,也可放心,因为最大化脚本是在 While oIE.Busy: Wend之前,况且即使最大化速度很慢,页面已经缓冲完毕,也不会影响后续的执行,所以不会出现千分之一的可能~ 不过yujie6832版主挺仔细的,呵呵:lol 原帖由 zzxxbb112 于 2010-2-2 11:11 发表 http://bbs.51testing.com/images/common/back.gif
如果是第一次启动浏览器,偏向于第一种,中途跳转建议使用2
2,3和1不是一类
1判断的是控件,相当于验证点了,如果单纯是为了判断页面缓冲建议使用2
但是在1中,虽然判断的是控件,但是目的是确保页面的切换,
而且是否可以更准确地说2 和3 在原理上 那里不同呢 原帖由 1316016 于 2010-2-9 17:24 发表 http://bbs.51testing.com/images/common/back.gif
但是在1中,虽然判断的是控件,但是目的是确保页面的切换,
而且是否可以更准确地说2 和3 在原理上 那里不同呢
第3种还是比较适合初次登录页面
至于第二种,其实用的不多,呵呵,用第一种比较好,因为第一种最万能,既能用在第一次,也能用在以后的跳转
以及提供第4种,WAITPROPERTY 我也一直用第一种
我们许多项目都是用的这种方法
cntr=0Do until Browser("XXX").Page("XXX").WebButton("XXX").Exist.Exist(1)
' If cntr <60 Then
' wait 1
' cntr=cntr+1
' Else
' Exit Do
' End If
Loop
if cntr=60 then
msgbox "Turn to *** Page failed!"
Else
msgbox "Turn to *** Page pass!
end if 个人觉得14楼的最靠谱,不过基本情况下sync就可以了..有时候sync会导致页面乱跳,不过这种概率小的非常~哈哈
cntr=0
Do until Browser("XXX").Page("XXX").WebButton("XXX").Exist.(1)
If cntr <120 Then
wait ,500
cntr=cntr+1
Else
Exit Do
End If
Loop
if cntr=60 then
msgbox "Turn to *** Page failed!"
Else
msgbox "Turn to *** Page pass!
end if
就是循环等待,然后判断. 原帖由 风雪夜归人 于 2010-5-7 11:27 发表 http://bbs.51testing.com/images/common/back.gif
个人觉得14楼的最靠谱,不过基本情况下sync就可以了..有时候sync会导致页面乱跳,不过这种概率小的非常~哈哈
cntr=0
Do until Browser("XXX").Page("XXX").WebButton("XXX").Exist.(1)
If cntr
判断单个控件状态是不可靠的:
页面资源的下载顺序是从上到下的,文档流中先出现的资源先下载(注:存在并发,具体请参考 UA Profiler)。当某一样式下载完成时,会立刻渲染到页面(体现了层叠样式表中层叠在渲染时的含义)。当某一脚本下载完成时,也会立刻解析和运行。脚本的运行严格按照文档流中的顺序进行,deferred 的脚本会在正常脚本运行之后运行(Firefox 和 IE 下)。
特别需要留意:脚本运行时,会暂停该脚本之下所有资源的下载(因为脚本可能改变文档流,甚至跳转页面,浏览器的暂停策略是合理的)。要小心内联脚本,经常会阻塞后续下载。
在页面解析展示的过程中,一个get或者post过去,给返回的html,在html中可能有外部引用的css,js或者Img,这时候浏览器一面展示html,一边去下载外面的js,css,和img
极端情况下:我们会发现页面已经展示完毕,但某个图片依然处于downloading...状态,所以假设你所判断的控件就是那个最后downloading...的而且timeout时间到了,岂不悲剧?当然,如果你timeout足够长,10s,20s,那哪种办法都无所谓,因为基本哪个网站10s,20s普通页面还解析展示不完,人家也就不等了 原帖由 wugecat 于 2010-2-2 11:09 发表 http://bbs.51testing.com/images/common/back.gif
总之,绝对不要msgbox!你下班执行脚本的时候它弹了,谁来去点?????用Reporter.ReportEvent
我一般用第二种就满足了
msgbox 弹出后,可以不用人为去点的..
'指定一个时间,自动关闭弹出框
sub MsgCloseByTime(MsgText,intTime,MsgTitle)
Set WshShell = CreateObject("Wscript.Shell")
WshShell.Popup MsgText, time, MsgTitle
end sub 第三种方法没试过,赶明试试
页:
[1]