3

我目前每天都在使用 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 来提供这种功能?

4

1 回答 1

3

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

但是请注意,有些情况您将无法涵盖:

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

  • 您不能从通过GetRef函数指针寻址的例程调用中调用这样的测试对象方法。

还可以考虑使用ExecuteGlobal而不是这样您传递的代码可以设置调用者以后可以访问Execute的全局变量。ExecuteGlobal

于 2013-06-29T06:23:47.567 回答