我使用VBScript在QTP(快速测试专业版)中遇到了烦人的问题。
我在VBScript中定义了这个子(我也尝试将它定义为具有相同结果的函数):
Sub KillProcess()
KillprocessIE = "The process i want to kill"
Set ProcessList2 = GetObject("winmgmts://.").InstancesOf("win32_process")
For Each Process In ProcessList2
If Process.Name = KillProcessIE Then
Process.Terminate
Exit for
End If
Next
End Sub
但是当我尝试使用
运行它时call KillProcess()
KillProcess()
KillProcess
我得到一个错误,说“Typer stemmer ikke overens:'KillProcess'”,翻译自丹麦语,意思是“类型不匹配:'KillProcess'。我猜这是一种类型不匹配的错误,但由于翻译,我不能一定不会。
它在谈论什么类型?我的函数调用中没有参数,我没有为任何值赋值?
还应该说,如果我直接运行完全相同的代码而不将其定义为函数,它的工作没有问题。
答案 0 :(得分:3)
无论何时调用未定义的子函数或函数,都会出现类型不匹配错误。
即使这本身就是一个奇迹(我可以为其找到合理的推理仅用于函数,而不是用于子函数),它表明在您的特定场景中,KillProcess在您调用它的脚本中是未知的。
可能的原因:
正如Motti指出的那样,你发布的代码片段看起来不错,所以一定有其他一些小问题。
关于潜艇与功能的另一个提示:请注意,您通常不会使用带括号的Sub
来调用参数。如果您确实指定了它们,它们将被视为要评估的术语的一部分,并且从
X term
与
相同X (term)
因此在这种情况下不会产生错误消息。 但是,对于具有两个或多个参数的Subs,请在一个括号对中指定所有实际参数,例如
Y (term1, term2)
会产生错误,例如“无法使用括号中的参数调用Sub”等等。如果您认为确实可以在括号中指定一个参数,则很难理解。
(有关paranthesis主题的更完整概述,请参阅ByRef and ByVal in VBScript和相关问题)。
一般建议:使用
option explicit
始终位于所有脚本(尤其是函数库)的顶部。如果需要,RTFM。它可能看起来更像是工作(因为它会迫使你在使用之前声明所有变量),但它有助于避免细微的错误。
答案 1 :(得分:1)
我认为你已经遇到了奇怪的行为QTP,但是当你明白为什么时会有逻辑。
发生这种情况的原因可能是因为你“从步骤运行”调用KillProcess()并具有上面定义的函数,如:
Sub KillProcess()
.
.
.
End Sub
call KillProcess()
如果您从“Call KillProcess()”运行代码,QTP将返回“运行错误”“类型不匹配”
如果相反,让函数定义在执行语句下面,如
call KillProcess()
Sub KillProcess()
.
.
.
End Sub
然后QTP“知道”你正在调用的函数,并按照它应该执行脚本。
原因是,当使用“从步骤运行”时,只读取步骤及以下的代码行,而不是上面写的内容。