QTP如何等待页面加载动态数据?

时间:2014-08-28 04:53:26

标签: qtp hp-uft

我有一个场景,其中浏览器状态=已完成,但仍未加载页面。 是否有一个常见的过程,qtp可以等到页面完全加载? 我尝试使用objBrowzer.sync,objPage.Sync,objPage.waitproperty“readyState”,“completed”,50。 但它总是不起作用。

我甚至不能只是一个等待声明,以便它等到该对象出现。因为在不同情况下存在不同的对象。 是否有适用于所有情况的共同声明?

提前致谢。

6 个答案:

答案 0 :(得分:9)

您刚刚发现QTP没有提供与异步浏览器脚本执行同步的任何明确支持,就像AJAX驱动的网站一样。当QTP认为页面已经完全加载时,实际上仍然有JavaScript处理程序在运行,可能会更新用于页面的HTML,而QTP会提前访问GUI。

readyState是一个好主意,但通常很容易找到效果不佳的案例。

<强> 1。最好的解决方案是在&#34;忙碌&#34;上同步。应用程序指标,如进度条或活动指示器。

不幸的是,等待忙碌指示器意味着忙碌指示器确实会出现,但许多应用程序仅在过程需要足够长时间(超过2秒等)时显示一个。然后,这很快变得比预期的要麻烦。

<强> 2。如果应用程序没有这样的东西,通常你可以通过同步一些&#34; ready&#34;来帮助自己。指标,例如&#34;预期字段出现&#34;或&#34; OK按钮消失&#34;。如果没有真正的&#34; ready&#34;这通常需要针对每个上下文的特定解决方案。指标(通常不存在)。

第3。在许多项目中,自动化人员可以为应用程序内置一个忙碌的指示器。虽然这不会为开发人员带来很多工作(因为现代应用程序有一个中央消息调度程序,所以转换为& #34;忙碌&#34;空闲&#34;状态和vv可以很容易地集中跟踪),它极大地简化了同步所需的工作量。

因此,如果可能的话,尝试联系开发人员,让他们看到一个属性(变量,内存映射文件,信号量,无论他们喜欢什么),测试机器人&#34;同步&#34;例程可以轻松进行轮询(提示:为了能够区分两个&#34;准备状态和#34;状态,即使在&#34;缺失&#34;忙碌&#34;两者之间的状态,它可能有助于获得一个顺序&#34;忙碌状态计数&#34;除了忙碌状态标志&#34;,所以您可能在同一场合请求。)然后,所有同步问题都是应用程序中的缺陷,因为它显然没有正确保持就绪信号。

更新适用于基于事实上&#34;标准的应用程序&#34;在框架中,人们可能会找到以通用方式实现同​​步的方法。

例如,对于JavaScript应用程序,我设法创建了一个透明地向QTP报告事件流的检测,在那里使用QTP等待足够长的时间&#34;,使一个人能够设置特殊的检查点 - 比如等待某些事件的库调用(特别是&#34;点击&#34;,以及那些执行AJAX往返Java服务器页面的应用程序,&#34; ajaxstop&#34;,事件)在继续之前完成。< / p>

这被证明是非常有用的,因为通常,开发实现任何类型的测试自动化需求支持是非常复杂的,并且基于GUI的同步(仅通过测试对象状态/存在)有时是不够的如果应用程序在后台执行异步请求。它还消除了为每个GUI上下文探索同步选项的需要,这可能非常耗时和/或不可靠。

答案 1 :(得分:2)

对你来说没有简单的答案我会像往常一样害怕,这取决于&#39;

以下是一个基本示例,假设您正在等待按钮或文字显示在屏幕上:

If Browser("user90site").Page("page1").WebButton("Button1").Exist(30) Then
  Browser("user90site").Page("page1").WebButton("Button1").Click
Else
  Reporter.ReportEvent micFail,"button missing", "button missing"
End If

上面将等待最多30秒的web元素出现,但是如果按钮在30秒之前出现,它将继续并单击按钮,否则它将报告失败。鉴于您有多种方案,您需要做出不同的变化才能获得所需的结果。

您是否因为您尝试对尚不存在的元素采取行动而进行了测试失败?

答案 2 :(得分:1)

这并不容易,特别是对于使用AJAX的网站。最好的方法是编写像

这样的简单函数

function WaitForObject(obj) WaitForObject = false Setting("DefaultTimeout") = 500 for i = 0 to 30 'or more If obj.Exist Then WaitForObject = true Exit For End If next Setting("DefaultTimeout") = 20000 ' or other value end function

并将其用于最后加载的对象

答案 3 :(得分:0)

你可以试试这个。我知道这是非常晚的答案,但它会帮助您更准确地实现结果。如果您的浏览器加载时间超过以下时间,您可以多次调用此函数:

Call AppBusyStatus(0)
if Browser("Browsername").Exist Then
   Call AppBusyStatus(0)
End If
Call AppBusyStatus(0)

Sub AppBusyStatus(intBrowserCreationTime)
    Do While Browser(CreationTime:intBrowserCreationTime).Object.Busy
       Wait 0,500
    Loop
End Sub

答案 4 :(得分:0)

监视加载图像和添加到存储库,

Set obj = Browser().Page().Image()
wait()
While (obj.Exist)
'Do Nothing //commented
Wend

这可能会增加脚本执行时间,但会解决您的问题。

答案 5 :(得分:-1)

while Browser("user90site").Page("page1").WebButton("Button1").Exist(2)=false
wait 2
wend
Browser("user90site").Page("page1").WebButton("Button1").Click

while语句将循环,直到找不到对象。使用while而不是if更准确。