我有一个浏览器状态=完成但页面仍未加载的场景。qtp 是否有一个常见的程序可以等到页面完全加载?我试过 objBrowzer.sync,objPage.Sync,objPage.waitproperty "readyState","completed",50。但它并不总是有效。
我什至只能等待声明,以便它等到该对象出现。因为在不同的情况下存在不同的对象。是否有任何通用声明适用于所有场景?
提前致谢。
您刚刚发现 QTP 并没有像 AJAX 驱动的网站那样为与异步浏览器脚本执行同步提供任何明确的支持。当 QTP 认为页面已经完全加载时,实际上仍然有 JavaScript 处理程序在运行,可能会更新用于页面的 HTML,并且 QTP 会提前访问 GUI。
readyState
是个好主意,但通常很容易找到效果不够好的情况。
1. 最好的解决方案是在应用程序的“忙碌”指示器上同步,例如进度条或活动指示器。
不幸的是,等待忙碌指示器意味着忙碌指示器确实会一直出现,但是许多应用程序仅在该过程花费足够长的时间(超过 2 秒等)时才会显示忙碌指示器。然后,这很快变得比预期的更混乱。
2. 如果应用程序没有这样的功能,通常您可以通过同步一些“就绪”指示器来帮助自己,例如“出现预期字段”或“确定按钮消失”。如果没有真正的“就绪”指标(通常不存在),这通常需要针对每个上下文的特定解决方案。
3. 在许多项目中,自动化人员可以为他们在应用程序中内置一个繁忙的指示器。虽然这不会为开发人员带来很多工作量(因为现代应用程序有一个中央消息调度程序,因此可以轻松地集中跟踪从“忙”到“空闲”状态和 vv 的转换),但它大大简化了所需的工作量用于同步。
因此,如果可能,请尝试联系开发人员并让他们提供测试机器人“同步”例程可以轻松轮询的属性(变量、内存映射文件、信号量,无论他们喜欢什么)。(提示:为了能够区分两个“就绪”状态,即使在“丢失”两者之间的“忙碌”状态之后,除了“忙碌状态标志”之外,获得一个连续的“忙碌状态计数”可能会有所帮助,因此您可能会在同一场合提出要求。)然后,所有同步问题都是应用程序中的缺陷,因为它显然没有正确保持就绪信号。
更新对于基于事实上的“标准”框架的应用程序,人们可能会找到以通用方式实现同步的方法。
例如,对于 JavaScript 应用程序,我设法创建了一个工具,它可以透明地将事件流报告给 QTP,用于等待“足够长的时间”,从而可以设置特殊的类似检查点的库调用来等待某些事件(尤其是“单击”,对于执行 AJAX 往返的应用程序,例如 Java 服务器页面、“ajaxstop”、事件)在继续之前完成。
这已被证明非常有用,因为通常,让开发人员实现对测试自动化需求的任何类型的支持都是非常复杂的,并且如果应用程序基于 GUI 的同步(仅通过测试对象状态/存在)有时是不够的在后台执行异步请求。它还消除了为每个 GUI 上下文探索同步选项的需要,这可能非常耗时和/或不可靠。
恐怕没有简单的答案,像往常一样“这取决于”
这是一个基本示例,假设您正在等待按钮或文本出现在屏幕上:
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 秒之前出现,它将继续并单击按钮,否则将报告失败。鉴于您有多种情况,您将需要进行不同的变化来获得您想要的结果。
您是否因为尝试对尚不存在的元素采取行动而导致测试失败?
这并不容易,尤其是对于使用 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
并将其用于最后加载的对象
你可以试试这个。我知道这是非常晚的答案,但它会帮助您更准确地获得结果。如果您的浏览器加载时间较长,您可以多次调用此函数,如下所示:
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
监视加载图像并添加到存储库中,
Set obj = Browser().Page().Image()
wait()
While (obj.Exist)
'Do Nothing //commented
Wend
这可能会增加脚本执行时间,但会解决您的问题。
while Browser("user90site").Page("page1").WebButton("Button1").Exist(2)=false
wait 2
wend
Browser("user90site").Page("page1").WebButton("Button1").Click
While 语句将一直循环,直到对象未被识别。使用 while 而不是 if 更准确。