1316016 发表于 2010-2-2 11:00:38

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页面加载完毕

这三种方法, 我用的最多的是第一种,第二种很少用,第三种没有用过,不知道这三种方法的利弊是什么,并且在什么情况下用哪种比较好?又或者有没有其他的等待页面跳转方法?

xiaoyaoke 发表于 2010-2-2 11:00:39

浏览器加载、渲染和解析过程的黑箱分析:
http://lifesinger.org/blog/2009/08/browser-load-render-parse-process/

个人感觉:
第一种最容易出问题,是判断某控件出现为标识,但在某些情况下会出现所判断的控件已经渲染展示完毕,但整个页面还处于解析展示过程中,造成下一步操作失败;

第二种方式:在linux下,sync的作用是将缓冲区的数据写到硬盘,应该在浏览器中也有类似作用,就是将缓冲的http的数据解析完成后,个人感觉很靠谱;

第三种方法是判断浏览器的状态,在页面解析过程中浏览器貌似应该是busy状态,解析展示完成后状态改变,所以也应该是可靠的,但从方便程度来说就远远不如方法二了;

wugecat 发表于 2010-2-2 11:09:52

总之,绝对不要msgbox!你下班执行脚本的时候它弹了,谁来去点?????用Reporter.ReportEvent
我一般用第二种就满足了

zzxxbb112 发表于 2010-2-2 11:11:15

如果是第一次启动浏览器,偏向于第一种,中途跳转建议使用2

2,3和1不是一类

1判断的是控件,相当于验证点了,如果单纯是为了判断页面缓冲建议使用2

1316016 发表于 2010-2-2 11:11:24

哦, 没有的,我上面只是举个例子,用msgbox会死的很惨的

wugecat 发表于 2010-2-2 11:13:54

哦,错了..是第一个..我一般用第一种来判断,做判断存在的检查点

yujie6832 发表于 2010-2-2 12:26:55

激情大奉献,我封装的函数,结合了第三种,第三种最好的其实是

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

yujie6832 发表于 2010-2-2 12:33:20

补充,2的话,我一般单独用的,目的是同步而已~

zzxxbb112 发表于 2010-2-2 12:34:47

原帖由 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日志就更好,呵呵~

yujie6832 发表于 2010-2-2 12:41:37

原帖由 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这个等实际需要的话再加,谢谢指点

zzxxbb112 发表于 2010-2-2 12:54:11

不会的,呵呵,如果是考虑最大化时间的话,也可放心,因为最大化脚本是在 While oIE.Busy: Wend之前,况且即使最大化速度很慢,页面已经缓冲完毕,也不会影响后续的执行,所以不会出现千分之一的可能~

zzxxbb112 发表于 2010-2-2 13:00:57

不过yujie6832版主挺仔细的,呵呵:lol

1316016 发表于 2010-2-9 17:24:44

原帖由 zzxxbb112 于 2010-2-2 11:11 发表 http://bbs.51testing.com/images/common/back.gif
如果是第一次启动浏览器,偏向于第一种,中途跳转建议使用2

2,3和1不是一类

1判断的是控件,相当于验证点了,如果单纯是为了判断页面缓冲建议使用2
但是在1中,虽然判断的是控件,但是目的是确保页面的切换,

而且是否可以更准确地说2 和3 在原理上 那里不同呢

yujie6832 发表于 2010-2-9 17:33:35

原帖由 1316016 于 2010-2-9 17:24 发表 http://bbs.51testing.com/images/common/back.gif

但是在1中,虽然判断的是控件,但是目的是确保页面的切换,

而且是否可以更准确地说2 和3 在原理上 那里不同呢
第3种还是比较适合初次登录页面

至于第二种,其实用的不多,呵呵,用第一种比较好,因为第一种最万能,既能用在第一次,也能用在以后的跳转
以及提供第4种,WAITPROPERTY

ls_721521 发表于 2010-2-9 17:53:13

我也一直用第一种

zchtest 发表于 2010-5-7 10:58:27

我们许多项目都是用的这种方法

cntr=0       
Do 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

风雪夜归人 发表于 2010-5-7 11:27:40

个人觉得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

就是循环等待,然后判断.

xiaoyaoke 发表于 2010-5-7 11:58:19

原帖由 风雪夜归人 于 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普通页面还解析展示不完,人家也就不等了

wolaizhinidexin 发表于 2010-5-8 17:28:46

原帖由 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

luxiuxiu1987 发表于 2010-9-21 18:08:52

第三种方法没试过,赶明试试
页: [1]
查看完整版本: QTP关于页面跳转的等待