您刚刚发现 QTP 不提供任何与异步浏览器脚本执行同步的显式支持就像 AJAX 驱动的网站一样。当 QTP 认为页面已完全加载时,实际上仍然有 JavaScript 处理程序在运行,可能会更新用于页面的 HTML,并且 QTP 会提前访问 GUI。
readyState
这是一个好主意,但通常很容易找到效果不够好的情况。
1. 最好的解决方案是在应用程序的“繁忙”指示器上进行同步,如进度条或活动指示器。
不幸的是,等待繁忙指示器意味着繁忙指示器确实总是出现,但许多应用程序仅在该过程花费足够长的时间(超过 2 秒等)时才会显示繁忙指示器。然后,这很快就会变得比预期的更混乱。
2. 如果应用程序没有这样的东西,通常您可以通过同步一些“就绪”指示器来帮助自己,例如“出现了预期的字段”或“确定按钮消失了”。如果没有真正的“就绪”指示器(通常不存在),这通常需要针对每种情况制定特定的解决方案。
3. 在许多项目中,自动化人员可以在应用程序中为他们内置一个忙碌指示器。虽然这不会给开发人员带来很多工作量(因为现代应用程序有一个中央消息调度程序,因此可以轻松地集中跟踪“忙”到“空闲”状态和 vv 的转换),但它极大地简化了所需的工作量用于同步。
因此,如果可能的话,尝试联系开发人员并让他们提供测试机器人“同步”例程可以轻松轮询的属性(变量、内存映射文件、信号量,无论他们喜欢什么)。 (提示:为了能够区分两个“就绪”状态,即使在“丢失”这两个状态之间的“忙碌”状态之后,除了“忙碌状态标志”之外,获取连续的“忙碌状态计数”可能会有所帮助,因此您可能会在同一场合提出请求。)然后,所有同步问题都是应用程序中的缺陷,因为它显然没有正确维护就绪信号。
Update对于基于事实上的“标准”框架的应用程序,人们可能会找到以通用方式实现同步的方法。
例如,对于 JavaScript 应用程序,我设法创建了一种工具,可以透明地将事件流报告给 QTP,该工具用于等待“足够长的时间”,使人们能够设置特殊的类似检查点的库调用来等待某些事件(尤其是“单击”,以及对于执行 AJAX 往返操作的应用程序,如 Java Server Pages、“ajaxstop”事件),请在继续之前完成。
事实证明这非常有用,因为通常情况下,让开发人员实现对测试自动化需求的任何类型的支持都非常复杂,并且如果应用程序基于 GUI 的同步(仅通过测试对象状态/存在)有时是不够的在后台执行异步请求。它还消除了为每个 GUI 上下文探索同步选项的需要,这可能非常耗时和/或不可靠。