在VBScript中字符串化方法调用

在VBScript中字符串化方法调用,vbscript,metaprogramming,qtp,wsh,higher-order-functions,Vbscript,Metaprogramming,Qtp,Wsh,Higher Order Functions,我现在每天都在使用QuickTestProfessional 11,它在幕后使用VBScript。最近,我开始开发自己的一些函数来处理常见情况。我对VBscript非常陌生,我的大部分编程经验都是用C和Python编写的 我试图在VBScript中实现Python的Try/Except,主要是围绕单击链接或从下拉框中选择值这样的操作。以下是我目前掌握的情况: Class cls_ErrorHandler Private bWasError Private Sub Class_Initializ

我现在每天都在使用QuickTestProfessional 11,它在幕后使用VBScript。最近,我开始开发自己的一些函数来处理常见情况。我对VBscript非常陌生,我的大部分编程经验都是用C和Python编写的

我试图在VBScript中实现Python的Try/Except,主要是围绕单击链接或从下拉框中选择值这样的操作。以下是我目前掌握的情况:

Class cls_ErrorHandler
Private bWasError

Private Sub Class_Initialize()
    bWasError = False
End Sub

Private Sub IsErr
    If Err.Number <> 0 Then
        bWasError = True
    Else
        bWasError = False
    End If
            Err.Clear
End Sub

' If the command fails, set bWasError
Public Sub Try(strCommandToTry)
    On Error Resume Next
    Execute(strCommandToTry)
    me.IsErr

    On Error Goto 0
End Sub

Public Sub Except(strCommandInCaseOfError)
    If bWasError Then
        Execute(strCommandInCaseOfError)
    End If
    bWasError = False
End Sub
End Class
据我所知,在VBScript中,确实没有任何好方法可以将函数作为参数传递给另一个函数。最好的方法似乎是传递一个包含函数名的字符串,然后将该字符串输入Execute()或Eval()。QuickTest Professional中的对象往往有很多引号,因此手动将它们全部转义将使代码无法读取

在C语言中,我会使用如下内容:

Set oErrorHandler = New cls_ErrorHandler
oErrorHandler.Try(Stringify(Browser("Browser Name").Page("Page Name").WebCheckBox("Checkbox Name").Set "ON"
oErrorHander.Except(Stringify(Browser("Browser Name").Page("Page Name").WebButton("Save").Click))
#define Stringify(obj) #obj

这就可以做到了。。。但VBScript中似乎不存在类似的内容。有什么方法可以实现这一点吗?VBScript中是否有将对象作为输入并返回该对象名称的字符串表示形式的内容?是否可以在C/C中编写一个DLL来提供这种功能?

您可以使用
GetRef
获取
函数
/
指针,并使用该指针调用
函数
/
。请参阅联机帮助,它显示了事件处理程序的示例,但您可以使用
GetRef
引用任何全局
函数
sub
,并使用包含
GetRef
返回值的变量,就像
sub
函数的别名一样

但是,请注意,有些情况下,您无法用此方法覆盖:

  • 如果当前调用堆栈包含 方法调用,该调用是通过
    RegisterUserFunc

  • 不能从例程调用中调用这样的测试对象方法 这是通过
    GetRef
    函数指针处理的


也可以考虑使用<代码> ExruteGlobal 而不是<代码>执行。因此,您通过的代码可以设置全局变量,即<代码> ExcuteGlobal < /Cube >以后可以访问。

和BTW,我认为您不会达到您的目标,并针对您所概述的目的来模拟异常处理。这将只捕获运行时错误,许多回放步骤都会失败,并且,通过QTPs自己的错误处理对话框和“停止/重试/跳过/调试”对话框,但它们不会生成VB运行时错误,是吗?Headscratching…QTP的错误似乎被错误恢复下一步捕获,使用Err.Raise似乎会将您放入QTP的“停止/尝试/跳过/调试”菜单。我期待的是QTP能够在出现问题时优雅地失败,而不是停止整个测试并可能浪费时间。据我所知,GetRef使用一个字符串表示要调用的函数的名称,这会让我写下:“Browser”(“Browser name”).Page(“Page name”).WebButton(“Save”)。这是我试图通过stringify()函数避免的。我会关闭交互对话框,如果有任何失败,让测试迭代失败,如果AUT未处于基线状态(测试前提条件状态),则在(下一次)迭代开始时重新设置AUT的GUI。工作正常,其他一切都按设计进行,可以执行的测试用例得到执行,而失败的测试用例可以在之后进行分析。毕竟,如果您有“真正的”运行时错误,即脚本中的编程错误,您不希望忽略这一点,因为继续进行下一个测试用例也会浪费时间。我认为这会起作用。我的想法是,在某些地方,如果出现问题,整个测试分支可能会失败——比如“向数据库中添加一个条目,检查它是否通过,编辑它,检查编辑是否通过,删除它。”能够编写这样的测试会很方便“将条目添加到数据库中。试着编辑它,如果你不能的话,退出整个测试分支。“类似stringify()的东西也可以让你制作映射和过滤函数。啊,我明白你的意思了——我尝试了我的方法,QTP最后仍然告诉我,Exception(…)块中有一个错误,这使得这是一个有点无用的方法。哦,好吧,投你一票(或者,无论如何,当我拥有必要的声誉时,我会这样做)。