51Testing软件测试论坛

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

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

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

[原创] QTP关于页面跳转的等待

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2010-2-2 11:00:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
0测试积点
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页面加载完毕

这三种方法, 我用的最多的是第一种,第二种很少用,第三种没有用过,不知道这三种方法的利弊是什么,并且在什么情况下用哪种比较好?又或者有没有其他的等待页面跳转方法?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
发表于 2010-2-2 11:00:39 | 只看该作者
浏览器加载、渲染和解析过程的黑箱分析:
http://lifesinger.org/blog/2009/ ... nder-parse-process/

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

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

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

使用道具 举报

该用户从未签到

3#
发表于 2010-2-2 11:09:52 | 只看该作者
总之,绝对不要msgbox!你下班执行脚本的时候它弹了,谁来去点?????用Reporter.ReportEvent
我一般用第二种就满足了
回复

使用道具 举报

该用户从未签到

4#
发表于 2010-2-2 11:11:15 | 只看该作者
如果是第一次启动浏览器,偏向于第一种,中途跳转建议使用2

2,3和1不是一类

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

使用道具 举报

该用户从未签到

5#
 楼主| 发表于 2010-2-2 11:11:24 | 只看该作者
哦, 没有的,我上面只是举个例子,用msgbox会死的很惨的
回复

使用道具 举报

该用户从未签到

6#
发表于 2010-2-2 11:13:54 | 只看该作者
哦,错了..是第一个..我一般用第一种来判断,做判断存在的检查点
回复

使用道具 举报

该用户从未签到

7#
发表于 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
回复

使用道具 举报

该用户从未签到

8#
发表于 2010-2-2 12:33:20 | 只看该作者
补充,2的话,我一般单独用的,目的是同步而已~
回复

使用道具 举报

该用户从未签到

9#
发表于 2010-2-2 12:34:47 | 只看该作者
原帖由 yujie6832 于 2010-2-2 12:26 发表
激情大奉献,我封装的函数,结合了第三种,第三种最好的其实是

Public Sub LaunchIEAndLoaded(url)
                Dim oIE,hwnd
'                使用IE COM
                Set oIE = CreateObject("InternetExplorer.Application")
                                oIE.Visibl ...


既然已经用了While oIE.Busy: Wend,最后的WAIT就不用加了,中间的MSGBOX也可以去掉了,再加个REPORT日志就更好,呵呵~
回复

使用道具 举报

该用户从未签到

10#
发表于 2010-2-2 12:41:37 | 只看该作者
原帖由 zzxxbb112 于 2010-2-2 12:34 发表


既然已经用了While oIE.Busy: Wend,最后的WAIT就不用加了,中间的MSGBOX也可以去掉了,再加个REPORT日志就更好,呵呵~

WAIT(1)是为了防止千分之一的突然用的,加一秒更保险和稳定,其实是因为我觉得在最大化窗口的时候也要一定时间,主要是为了这个,MSGBOX是不高兴删了,留着,呵呵。REPORTER这个等实际需要的话再加,谢谢指点
回复

使用道具 举报

该用户从未签到

11#
发表于 2010-2-2 12:54:11 | 只看该作者
不会的,呵呵,如果是考虑最大化时间的话,也可放心,因为最大化脚本是在 While oIE.Busy: Wend之前,况且即使最大化速度很慢,页面已经缓冲完毕,也不会影响后续的执行,所以不会出现千分之一的可能~
回复

使用道具 举报

该用户从未签到

12#
发表于 2010-2-2 13:00:57 | 只看该作者
不过yujie6832版主挺仔细的,呵呵
回复

使用道具 举报

该用户从未签到

13#
 楼主| 发表于 2010-2-9 17:24:44 | 只看该作者
原帖由 zzxxbb112 于 2010-2-2 11:11 发表
如果是第一次启动浏览器,偏向于第一种,中途跳转建议使用2

2,3和1不是一类

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

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

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

使用道具 举报

该用户从未签到

14#
发表于 2010-2-9 17:33:35 | 只看该作者
原帖由 1316016 于 2010-2-9 17:24 发表

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

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

第3种还是比较适合初次登录页面

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

使用道具 举报

该用户从未签到

15#
发表于 2010-2-9 17:53:13 | 只看该作者
我也一直用第一种
回复

使用道具 举报

  • TA的每日心情
    开心
    2016-5-11 13:12
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]测试小兵

    16#
    发表于 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
    回复

    使用道具 举报

    该用户从未签到

    17#
    发表于 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

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

    使用道具 举报

    该用户从未签到

    18#
    发表于 2010-5-7 11:58:19 | 只看该作者
    原帖由 风雪夜归人 于 2010-5-7 11:27 发表
    个人觉得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普通页面还解析展示不完,人家也就不等了
    回复

    使用道具 举报

    该用户从未签到

    19#
    发表于 2010-5-8 17:28:46 | 只看该作者
    原帖由 wugecat 于 2010-2-2 11:09 发表
    总之,绝对不要msgbox!你下班执行脚本的时候它弹了,谁来去点?????用Reporter.ReportEvent
    我一般用第二种就满足了

    msgbox 弹出后,可以不用人为去点的..
    '指定一个时间,自动关闭弹出框
    sub MsgCloseByTime(MsgText,intTime,MsgTitle)
            Set WshShell = CreateObject("Wscript.Shell")
            WshShell.Popup MsgText, time, MsgTitle
    end sub
    回复

    使用道具 举报

    该用户从未签到

    20#
    发表于 2010-9-21 18:08:52 | 只看该作者
    第三种方法没试过,赶明试试
    回复

    使用道具 举报

    本版积分规则

    关闭

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

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

    GMT+8, 2024-11-26 07:33 , Processed in 0.081605 second(s), 25 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

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