当恢复场景处于活动状态时,为什么`IsEmpty`在使用测试对象调用时会写一个虚拟警告?

时间:2014-02-12 14:17:42

标签: qtp

非常奇怪的症状:

使用以下内容创建测试,但没有关联的库:

Print IsEmpty (Browser("index:=0"))

重点是用任何测试对象调用IsEmpty

执行时的结果:显而易见(和预期),它打印:“false”(表示您的桌面上至少有一个窗口打开)。

运行结果在查看器中看起来很好,如下所示:

Run result as expected

现在创建一个包含以下内容的函数库:

Option Explicit

Public Function MyFunc(Object, MethodName, Arguments, RetVal)
    Print "Welcome."
End Function

将此库与测试相关联。

使用以下属性创建恢复方案:

Trigger: Test run error
    Error: Any error
Recovery operation: Function call
    Library: The one you just created
    Function to call: MyFunc
Post-Recovery Test Run Options:
    Process to next action or component iteration

将恢复方案与您在开始时创建的测试相关联。将“Activate Recovery scenarios:”设置为“On error”。

运行测试。输出是预期的,但运行结果如下所示:

Run result with warning

“错误”节点具有以下详细信息(“元素nicht gefunden”是德语,意思是“未找到元素”,我很惊讶在这里看到本地化的错误消息):

"Error" node detail

那是怎么回事?看来IsEmpty只要用测试对象调用就会生成这样的条目。

这可能是个错误吗?

我目前的解决方法是引入我自己的IsEmpty功能,该功能会禁用恢复方案,调用原始IsEmpty功能,并重新启用恢复方案。 这是一个恐怖,因为IsEmpty替换不能命名为IsEmpty。这会导致递归调用,因为如果它具有相同的名称,我不能从替换中调用原始版本(或者我可以吗?)。如果你想打电话给IsEmpty,可以轻易忘记调用不同的东西。

如果恢复方案处于活动状态,我无法忍受为每个IsEmpty调用生成的警告。

发生了什么事? 你们可以重现这个吗? 有更好的解决方法吗?

英语(当然)QTP 11.00使用.net,ActiveX,Delphi,Java,Oracle,Silverlight,Web,Web服务和WPF加载项构建1018,但它们都不适用于此演示。使用修补程序QTPWEB_00078和QTPJV_00044。 Windows 7。

更新:我想我可以查看VarType (Obj) = vbEmpty,因此我可以按照概述创建IsEmpty替换,但命名为IsEmpty。即我有一个解决方法,但仍然想知道这是否是一个QTP错误。

更新2: VarType(Obj)引用不起作用,它会生成相同的奇怪运行结果警告。

更新3:似乎IsEmpty不能被具有相同名称的函数替换。它始终调用内在函数。

更新4:最接近替换内在函数的是http://www.knowledgeinbox.com/articles/qtp/advanced-qtp/overriding-default-functions-using-function-pointers/中概述的方法,但它需要在每个操作脚本中进行声明和赋值。叹息。

2 个答案:

答案 0 :(得分:1)

除了“如何覆盖内在函数?”之外的问题。在我的问题中,我找到了IsEmpty功能的1:1替换,该功能不会创建带有测试对象的奇怪日志条目

而不是

IsEmpty (P)

使用

TypeName (P) = "Empty"

如果P是测试对象,IsEmpty调用将创建魔术日志条目,而TypeName则不会。

这肯定(imho)是QTP恢复方案功能中的一个错误。

答案 1 :(得分:0)

我想知道IsEmpty是否适用于不存在的QTP对象,或者您正在探索一切可能发生的“未定义行为”,从不一致的返回值到您的硬盘驱动器格式(后者稍微少一些)可能比第一次。)

IsEmpty通常用于取消初始化变量:

Dim a
MsgBox isEmpty(a)  ' --> True
a = ""
MsgBox isEmpty(a)  ' --> False
MsgBox isEmpty(b)  ' --> True or an Error if you use the error resume next statement

Dim obj : set obj = Nothing
MsgBox isEmpty(obj) ' --> False, it contains an object (Nothing is an object)

在QTP中,我建议使用Browser("index:=0").Exist(0)查看对象是否存在而不是IsEmpty