我目前每天都在使用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?
答案 0 :(得分:3)
您可以使用GetRef
获取function
/ sub
指针,并使用该指针调用function
/ sub
。请参阅在线帮助,它显示了事件处理程序的示例,但您可以使用function
引用任何全局sub
或GetRef
,并使用包含GetRef
返回的变量值就像sub
/ function
的别名一样。
但是,请注意,在某些情况下,您将无法承保:
如果当前调用堆栈包含a,则不能使用GetRef
函数指针
方法调用,它是通过注册到测试对象的函数
RegisterUserFunc
。
您无法在例行调用中调用此类测试对象方法
通过GetRef
函数指针进行处理。
另请考虑使用ExecuteGlobal
而不是Execute
,因此您传递的代码可以设置ExecuteGlobal
调用者之后可以访问的全局变量。