在VBScript中对方法调用进行字符串化

时间:2013-06-28 16:26:37

标签: vbscript metaprogramming qtp wsh higher-order-functions

我目前每天都在使用QuickTest Professional 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

我希望能够写出这样的内容:

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))

据我所知,实际上没有任何好方法可以将函数作为参数传递给VBScript中的另一个函数。最好的方法似乎是传递一个包含函数名称的字符串,然后将该字符串提供给Execute()或Eval()。 QuickTest Professional中的对象往往有很多引号,因此手动转义它们会使代码无法读取。

在C中,我会使用类似的东西:

#define Stringify(obj) #obj

它会完成......但是VBScript中似乎没有这样的东西。有没有办法实现这个? VBScript中有什么东西将对象作为其输入并返回该对象名称的字符串表示形式吗?是否有可能在C / C#中编写一个能提供这种功能的DLL?

1 个答案:

答案 0 :(得分:3)

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

但是,请注意,在某些情况下,您将无法承保:

  • 如果当前调用堆栈包含a,则不能使用GetRef函数指针 方法调用,它是通过注册到测试对象的函数 RegisterUserFunc

  • 您无法在例行调用中调用此类测试对象方法 通过GetRef函数指针进行处理。

另请考虑使用ExecuteGlobal而不是Execute,因此您传递的代码可以设置ExecuteGlobal调用者之后可以访问的全局变量。