分享

[原创]QTP使用循环语句等待对象出现的方法

 杨柳1234 2010-11-19

     本帖子为本人原创,转载请注明作者:Cheers . Lee 以及网络来源:

      问题产生原因:以飞机订票系统(flight4a.exe)为例,如下图:

[原创]QTP使用循环语句等待对象出现的方法

     图中,Order No编号的出现,只有当点击完Insert Order按钮等数秒后,才会生成.但是具体要等多长时间,才会生成订单号,这个等待时间无法知道.

     由此,问题产生了?

     解决办法:在QTP脚本中,使用循环语句等待对象出现.

     脚本如下:(注意紫色部分脚本)

 

Dialog("Login").WinEdit("Agent Name:").Set "Cheers.Lee"
Dialog("Login").WinEdit("Password:").SetSecure "49df4eabed69867d55a22bbcdc7cceb6d10c9abc"
Dialog("Login").WinButton("OK").Click
Window("Flight Reservation").WinObject("Date of Flight:").Type "090410"
Window("Flight Reservation").WinComboBox("Fly From:").Select "Frankfurt"
Window("Flight Reservation").WinComboBox("Fly To:").Select "London"
Window("Flight Reservation").WinButton("FLIGHT").Click
Window("Flight Reservation").Dialog("Flights Table").WinList("From").Select "13564   FRA   03:12 PM   LON   03:57 PM   SR     $162.10"
Window("Flight Reservation").Dialog("Flights Table").WinButton("OK").Click
Window("Flight Reservation").WinEdit("Name:").Set "Cheers.Lee"
Window("Flight Reservation").WinButton("Insert Order").Click
a=Window("Flight Reservation").WinEdit("Order No:").GetROProperty("text") 
do  while  a=""
wait 1
a=Window("Flight Reservation").WinEdit("Order No:").GetROProperty("text") 
Loop
'msgbox a
Window("Flight Reservation").
Close

 

     当然这块也可以用条件语句:while ...wend; do ... until 来写.

     至此,问题解决OK!对于对象不存在的解决方法,也可以用此方法来解决对象偶尔回放不能识别的问题,再次不再详述.希望本文起到抛砖引玉的作用.

    最后,将关于"QTP几种同步点等待方法"归纳如下(以下内容不是原创):

在编写脚本时,经常要考虑到2个步骤之间的时间间隔问题,例如,1. 打开www.baidu.com 2. 输入avepoint。由于网速的不同,打开百度网页之后会有一定的延迟,所以1,2两步之间要有一个短时间的等待,可以通过以下几种方法实现:
1. 对象的默认等待时间。
QTP识别对象时,会有一个默认的等待时间,可以在File-->Settings-->Run-->Object synchronization中设置,默认时间是20秒,也就是说当执行到第2步时,网页还没有完全打开,这样的话QTP找不到第2步中需要的对象,那么它会在20秒内不断的尝试查找对象,如果百度这个网页在20秒之内完全打开,那么这个方法就可行(网页全部打开的话,第2步所需的对象就会被找到),如果超过20秒还不行的话,请参考下面几种方式
2. 使用.Sync方法。
还是打开百度,输入Avepoint,可用如下代码来实现
Browser("Browser").Navigate http://www.baidu.com
Browser("Browser").Page("百度").Sync
Browser("百度一下,你就知道").Page("百度一下,你就知道").WebEdit("wd").Set "Avepoint"
第2句的意思就是等待百度这个页面完全打开,才继续执行下面操作。
3. 第2种方法只能在Web中使用,那么如果其他类型的对象需要等待时间怎么办?可以使用QTP系统自带的同步点功能。
还是上面的例子,在录制状态下,选择Insert-->Synchronization Point,选择要同步的对象,设置要同步的属性,我们可以对对象的Enable,visible一类表示状态的属性做同步点,生成如下脚本
Browser("百度一下,你就知道").Page("百度一下,你就知道").WebEdit("wd").WaitProperty "visible", True, 100000
这句话的意思就是在100秒的时间内,等待WebEdit这个对象的visible属性,只要它的visible属性变为true,那么就执行下面操作,最后的100000单位是毫秒,如果在100000毫秒(100秒)后还没有等到visible = true,直接执行下面操作。
4. 利用VBS语句。
Do until Browser("百度一下,你就知道").Page("百度一下,你就知道").WebEdit("wd").Exist(5)
    Wait(1)
Loop
判断WebEdite这个对象是否出现,如果没有出现,执行Wait(1),如果出现,跳出循环。
5. 死等大法。
就是用Wait()语句设置等待时间,死等,比如Wait(10),就是脚本停止10秒,任何操作都不做,10秒之后继续往下执行操作。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多