QTP中的Wait()函数

时间:2010-08-19 12:41:39

标签: qtp

任何机构都可以向我建议一个我可以在QTP中用于以下场景的功能......

由于我们的脚本显示错误,因此有时会导致页面导航。为此,我们使用wait(time)函数,但它是QTP控件等待的固定时间。我想使用一个函数(我听说过同步函数,但不知道如何使用它),这样QTP只等待时间,导航时间(不多于/少于它)。

12 个答案:

答案 0 :(得分:6)

处理这种情况的标准方法是使用Page(或某些情况下是Browser)对象的.Sync方法。

我发现它很有气质,根据测试的应用程序,这个功能可能会完美运行,而在另一个场合不会等待足够长的时间。

问题似乎主要与Web 2.0应用程序(基于AJAX)有关。与java服务器的网页连接通常比java脚本打开的异步连接早得多。

如果有一个可视指南指示该页面仍在加载,您可以编写一个循环并检查该对象。一旦对象消失,您就可以恢复测试执行。

为了节省您自己在需要同步的每个地方编写此代码,您可以使用以下代码覆盖QTP本机方法:

RegisterUserFunc "Page", "Sync", "SyncToPage"
Function SyncToPage(oPage)
    'Call native function first'
    oPage.Sync

    'Custom sync code'

End Function

谢谢, 马切伊

答案 1 :(得分:2)

同步功能就是您想要的。您可以通过多种方式使用它,例如:

  • 要加载的网页。
  • 要启用按钮或 禁用。
  • 用于客户端 - 服务器通信 光洁度。

考虑GUI中发生的事情,以指示操作已完成。此特定对象和/或属性是您要同步的内容。

http://qtp.blogspot.com/2007/09/qtp-sync-wait-and-synchronization.html

其他选项包括使用WaitPropertyExist命令将脚本与应用程序同步。

http://www.sqaforums.com/showflat.php?Number=555273

QTP功能参考应有助于使用这些功能并解释所使用的参数。如果您仍有问题,请发布一个代码段,以便我们查看。

答案 2 :(得分:1)

WaitProperty Method是此方案的最佳解决方案。

在继续执行下一步之前,等待指定的对象属性达到指定值或超过指定的超时。

返回值:布尔值。如果属性达到值,则返回TRUE;如果在属性达到值之前达到超时,则返回FALSE。 FALSE返回值不表示失败的步骤。

答案 3 :(得分:0)

确保最好的方法是在新页面的对象上使用Exists(timeout)

答案 4 :(得分:0)

''使用此功能,只要你想等到obj就绪

Public Function WaitforObject(ByRef objRef, intWaitSecs)

  WaitforObject= False

  blnFlag= False
  intCount=1
  If ISObject(objRef) Then
    For iWaitSecs = 1 to intWaitSecs
        blnFlag = objRef.Exist(1)
        If blnFlag Then                         
            Do While (LCase(Trim(objRef.getROProperty("attribute/readyState")))<>"complete") or (Trim(objRef.getROProperty("attribute/readyState"))<>"4" )
                If intCount= intWaitSecs Then
                    WaitforObject = True
                    Exit Do
                End If
                intCount=intCount+1
            Loop
            Exit For
        End If           
    Next
     If Not blnFlag Then
            wait 2
            WaitforObject = True
    End If

  End If  

End Function

答案 5 :(得分:0)

  • 将此功能添加到您的图书馆
  • 点击
  • 后使用此功能
  • 这是一个等待功能等待完成浏览器(IE)加载和写完

例如

  • 浏览器()。()页。链路()。点击()

  • 浏览器()。同步

这是一个很棒的功能

享受

            Public Sub Synchronize (ByVal objObject)

                '------------------------------------------------------             
                    Dim Counter
                    Counter = 0
                '------------------------------------------------------     

                    If objObject.Exist(1) Then
                        '------------------------------------------------------     
                            ' Clear Error if any ...
                            Err.Clear
                            On Error Resume Next

                            ' Browser sync ...
                            objObject.Sync

                        '------------------------------------------------------             
                            If Err.Number <> 0 Then
                                While (Err.Number <> 0 and Counter <= 100)
                                    Err.Clear
                                    On Error Resume Next
                                    objObject.Sync
                                    Counter = Counter + 1
                                wend
                            End If
                        '------------------------------------------------------     
                    Else
                        'QTPGenerateReporter "Check Browser - Synchronize Function", "Should Exist", "Does not Exist", "Fail", "-"
                    End If

            End Sub

            RegisterUserFunc "Browser", "Synchronize", "Synchronize"
            RegisterUserFunc "Page", "Synchronize", "Synchronize"
        '================================================================================================================

答案 6 :(得分:0)

我按照下面的方法使用了一些东西,基本上做了一个循环来检查 如果页面上的元素存在,一旦它存在,您可以退出循环并继续测试。

但是,如果元素不存在,你不希望陷入无限循环,因此我有 添加了另一个条件,在放弃之前检查了一定次数。

如果达到了最大重试次数,或者找到了该元素,则退出该循环。

示例代码:

Dim blnPageElementReady, intmaxRetryAttempts, x

blnPageElementReady = False
intMaxRetryAttempts = 10
x = 0

Do Until (blnPageElementReady = True OR intMaxRetryAttempts = x) 

    If Browser("b").Page("p").WebElement("SomeValue").Exist Then
        blnPageElementReady = True
    End If
    x = x + 1

Loop

If intMaxRetryAttempts = x Then
'   Exit Test code goes here.....
End If

' continue with test on page:

Browser("Home_2").Page("Home").WebEdit("ctl00$uxMNJDefaultContentPlace").Click 
Browser("Home_2").Page("Home").WebEdit("ctl00$uxMNJDefaultContentPlace").Set username 
Browser("Home_2").Page("Home").WebEdit("ctl00$uxMNJDefaultContentPlace_2").Click 

答案 7 :(得分:0)

嗨,我希望这可能有所帮助。这里首先检查对象(webelement)是否存在,然后检查它是否已禁用,然后它调用同步,因此最好用于等待。谢谢 可用于各种网页控件。

Set NavigationTab = Browser ().Page().WebElement()
PerformWait ( 10 , 10 , NavigationTab )


Function PerformWait ( intDisableTime , intDelay , object )

if CheckExist ( intDelay , object ) Then

    if ValidateDisabled ( object , intDisableTime ) Then

        object.Sync
        Reporter.ReportEvent 0 , "Element is ready to use" , "The  specified element is ready to use" & Date & Time


    Else

       Reporter.ReportEvent 3 , "Object Disabled." , "Object remains disabled after specified time : " & refDisableTime & Date & Time   

    End If

Else

    Reporter.ReportEvent 3 , "Element not present." , "The specified element not present : " & Date & Time

End If

End Function

Function CheckExist ( intDelay , object )

object.RefreshObject

' -- validating the object is exist or not.
If object.Exist ( intDelay ) Then

    CheckExist = True

Else

    CheckExist = False

End If

End Function


Function ValidateDisabled ( object , intDisableTime )


For Iterator = 1 To intDisableTime Step 1

    ' -- validating the object is disabled or not.
    If object.GetROProperty ( "disabled" ) = 1 Then

        wait 1  
        ValidateDisabled = False

    Else

        ValidateDisabled = True
        Exit For    

    End If

    Iterator = Iterator + 1
Next

End Function

答案 8 :(得分:0)

将同步添加到预期的下一个页面对象。

例如,如果下一个浏览器和页面是&#34; Page 1&#34;,那么行将是:

Browser("Page 1").Page("Page 1").sync

或者如果你不确定哪个页面会被使用

Browser("title:=.*").Page("title:=.*").sync

上面的行应检查下一个浏览器和页面(假设当时只打开一个浏览器)。

如果你想深入并检查下一个元素Html属性你可以使用任何对象的.Object方法并检查它的HTML属性,如css等。

答案 9 :(得分:0)

'Set here the timeout so that the code doesn't stuck here (infinite loop)
var_timeout = 60 

x=0
do
  x=x+1
loop until Browser("Browser").Page("Page").WinElement("Message").Exist(1) or x>var_timeout

在单击某个按钮后识别出应用程序中更改的对象后,如单击“保存”后,应用程序将返回一条消息,您可以使用Exist(1)语句放置该对象。

对象的参数“1”表示应该检查元素的时间,低于该值的时间总是不起作用(我从经验中说这个)并且不希望更高。

这是我经常使用的片段,我的效果很好,我认为它会满足您的需求。

如果对象没有Exist方法,请尝试.Object.isDisabled或.Object。 (查看此处显示的自动完成内容)例如浏览器(“浏览器”)。页面(“页面”).WinElement(“消息”)。Object.isDisabled其中“Object”是尝试使用本机对象方法的方法。

请注意,UFT用于自动功能测试,需要一些时间来检查对象(几毫秒)。 因此,对象出现并且QTP需要几毫秒或更长时间才能看到它存在或者对象的属性改变了值。

答案 10 :(得分:0)

您可以使用以下4个属性:

  1. 等待 - 此处您还可以提供所需的时间 前 - SELECT [Project1].[Id] AS [Id], [Project1].[Val] AS [Val], [Project1].[Name] AS [Name], 1 + [Project1].[C1] AS [C1] FROM ( SELECT [Extent1].[Id] AS [Id], [Extent1].[Val] AS [Val], [Extent1].[Name] AS [Name], (SELECT COUNT(1) AS [A1] FROM [dbo].[Testes] AS [Extent2] WHERE ([Extent2].[Val] < [Extent1].[Val]) OR (([Extent2].[Val] = [Extent1].[Val]) AND ([Extent2].[Id] < [Extent1].[Id]))) AS [C1] FROM [dbo].[Testes] AS [Extent1] WHERE N'whatever' = [Extent1].[Name] ) AS [Project1]
  2. 同步 - 将等到页面刷新 前 - wait 0,500browser.page.sync()
  3. 等待财产 - 您可以提供手动等待时间 前 - 等待25秒:
    browser.page.sync(30)
  4. 存在 - 检查对象是否存在所需的时间 前 - browser.page.WaitProperty "text", "Simple Interest",25000

答案 11 :(得分:0)

这是一种常见的行为,应用程序将花费一些时间导航到非固定时间的其他页面。如果您使用Wait(50)..这将等待50秒,因为这是硬编码的等待... 如果您的脚本花费的时间少于50秒(假设20秒),则脚本会迫使UFT等待30秒以上,这会增加执行时间。 我根据应用程序行为在下面使用了

步骤:

代码如下:

1)browser()。page。()。webbutton(“ login”)。单击

2)将下一页对象存储在存储库中以进行验证

浏览器(“浏览器名称”)。页面(“ PageName”)。Webelement(“ Webelement name”)。waitproperty(“ Webbutton”,“ HomePage”,30000)

这将给出布尔值返回值。