我们的想法是在字符串变量中使用GUI类名(如JavaRadioButton
),并使用Description
对象实例化该类型的测试对象。喜欢在:
Dim Descr: Set Descr=Description.Create
Descr.Add "property1", "value"
Descr.Add "property2", "value"
Descr.Add "property3", "value"
Dim MyTO: Set MyTO=JavaRadioButton (Descr)
但是 GUI类(本例中为JavaRadioButton
)正在参数化,即我有字符串{{1在变量中,并且想要创建该变量中包含的GUI类的测试对象。</ p>
显而易见的尝试是使用"JavaRadioButton"
属性,该属性报告测试对象的GUI类名称:
"micclass"
然而,之后Dim ClassName: ClassName="JavaRadioButton"
Dim Descr: Set Descr=Description.Create
Descr.Add "property1", "value"
Descr.Add "property2", "value"
Descr.Add "property3", "value"
Descr.Add "micclass", ClassName
Dim MyTO: Set MyTO=JavaObject (Descr)
仍然只是MyTO
。例如,它不支持JavaObject
方法作为.Set
。
我当前的“解决方案”是构建一个包含作业的字符串,并使用JavaRadioButton
(或ExecuteGlobal
进行评估,如下所示):
Eval
这似乎有用,只要Dim ClassName: ClassName="JavaRadioButton"
Dim Descr: Set Descr=Description.Create
Descr.Add "property1", "value"
Descr.Add "property2", "value"
Descr.Add "property3", "value"
Descr.Add "micclass", ClassName
Dim MyTO: Set MyTO=Eval (ClassName & "(Descr)")
和ClassName
可以到达Descr
,这有时候很笨拙。如果你想捕获错误,它需要错误处理代码。
如果没有创建包含源代码的字符串并执行它,有没有办法做到这一点?
注意我添加了VBScript标记,因为这是QTP的脚本语言,但这个问题是特定于QTP的。
答案 0 :(得分:1)
我手头没有QTP,但你可以尝试这样的事情我发现假设对象实际上是返回一个具有相同名称的对象的函数。
Dim ClassName: ClassName="JavaRadioButton"
Dim Descr: Set Descr=Description.Create
Descr.Add "property1", "value"
Descr.Add "property2", "value"
Descr.Add "property3", "value"
Descr.Add "micclass", ClassName
Dim constructor : Set constructor = GetRef(ClassName)
Dim MyTO: Set MyTO=constructor(Descr)
你可以尝试一下,让我知道它在做什么吗?我很好奇。
修改的
假设的基础:JavaScriptButton是一个返回对象的函数。该函数可以支持参数。这是一种实现构建器甚至是抽象工厂模式的方法:
Option explicit
Class Duck
Private sound_
Public Name ' public field, refactor to property
Public Function Init(n, sound)
sound_ = sound
Name = n
Set Init = me
End Function
Public Sub Quack()
msgbox sound_
End Sub
End Class
Public Function NormalDuck(name)
Set NormalDuck = (new Duck).Init(name, "quack, quack")
End Function
Public Function RubberDuck(name)
Set RubberDuck = (new Duck).Init(name, "squick, squick")
End Function
Public Function DecoyDuck(name)
Set DecoyDuck = (new Duck).Init(name, "")
End Function
dim myDuck
dim duckBuilder
dim duckName, duckType
duckType = InputBox("What kind of duck do you want?", "DuckType", "NormalDuck")
Set duckBuilder = GetRef(duckType)
duckName = InputBox("What will be its name?", "DuckName", "Donald")
Set myDuck = duckBuilder(duckName)
myDuck.Quack
注意:VBScript支持set o = (new foo).Init(bar)
构造,而QTP“编译器”将返回语法错误。你必须将它分成QTP中的两个语句
答案 1 :(得分:0)
如果您愿意使用ChildObjects
而非常规描述性编程,这很容易实现。
Function GetObj(parent, micClass, desc)
desc.Add "micclass", micClass
Set children = parent.ChildObjects(desc)
If children.Count < 1 Then
Err.Raise 1, "GetObj", "Object not found"
ElseIf children.Count > 1 Then
Err.Raise 1, "GetObj", "Description is not unique, found " & children.Count & " matches"
End If
Set GetObj = children(0)
End Function
用法:
GetObj(oPage, "WebEdit", desc).Set "Set is a specific method"
我不知道这给你带来多少价值,因为你仍然需要Set
作为脚本的一部分而不是字符串...