如何使用在测试运行时确定的类创建特定GUI类的测试对象?

时间:2014-02-04 14:08:40

标签: vbscript qtp

我们的想法是在字符串变量中使用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的。

2 个答案:

答案 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作为脚本的一部分而不是字符串...