我有一个场景,其中浏览器状态=已完成,但仍未加载页面。 是否有一个常见的过程,qtp可以等到页面完全加载? 我尝试使用objBrowzer.sync,objPage.Sync,objPage.waitproperty“readyState”,“completed”,50。 但它总是不起作用。
我甚至不能只是一个等待声明,以便它等到该对象出现。因为在不同情况下存在不同的对象。 是否有适用于所有情况的共同声明?
提前致谢。
答案 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更准确。