The object-driven testing (ODT) functionality is deprecated. Do not use it to create new tests. It will be removed from the product in one of the future releases. As an alternative, you can create custom classes in your scripts. For more information, see Alternatives to the ODT functionality.
In the previous steps, we created classes and objects via the ODT, Classes and Data, now we can use these objects in scripts.
How to Obtain a Reference to an Object
To get a reference to an object, you need to obtain a variable that holds this reference. It is very easy to do this. The code below illustrates how you can obtain the ReleaseTest
object.
Calling Object’s Methods and Properties
Once we have created an object, we can call its methods and properties. To do this, use the following syntax: object.property_name
or object.method_name
. For instance, the following code snippet sets the MenuPath
property and calls the Init
method of the instance of the ClsOperation
class.
JavaScript, JScript
AppVar = ODT.Classes.New("ClsOperation");
// Accesses the property
AppVar.MenuPath = "File|Open...";
// Calls the method
AppVar.Execute();
VBScript
Set AppVar = ODT.Classes.New("ClsOperation")
' Accesses the property
AppVar.MenuPath = "File|Open..."
' Calls the method
Call AppVar.Execute
DelphiScript
AppVar := ODT.Classes.New('ClsOperation');
// Accesses the property
AppVar.MenuPath := 'File|Open...';
// Calls the method
AppVar.Execute();
C++Script, C#Script
AppVar = ODT["Classes"]["New"]("ClsOperation");
// Accesses the property
AppVar.MenuPath = "File|Open...";
// Calls the method
AppVar["Execute"]();
How to Access Objects in Methods (This and Self Keywords)
To access an object instance within a method that belongs to this instance, use the keyword This
(VBScript, JScript, C++Script or C#Script) or Self
(DelphiScript). You can access an object's properties and methods using these keywords.
Below is the complete code for the ClsNotepadTest.Execute
method that illustrates this (in our example, the MainUnit.ClsOperation_Execute
script routine plays the role of the Execute
method).
JavaScript, JScript
{
Log.Message("ClsOperation_Execute");
MainW.Activate();
MainW.MainMenu.Click(This.MenuPath);
}
VBScript
Log.Message "ClsOperation_Execute"
Call MainW.Activate()
Call MainW.MainMenu.Click(This.MenuPath)
End Sub
DelphiScript
begin
Log.Message('ClsOperation_Execute');
MainW.Activate;
MainW.MainMenu.Click(Self.MenuPath);
end;
C++Script, C#Script
{
Log["Message"]("ClsOperation_Execute");
MainW["Activate"]();
MainW["MainMenu"]["Click"](This["MenuPath"]);
}
Note: | This and Self keywords refer to the object instance, not to the object class. To obtain the class of the object instance that the given method belongs to, use the This.ClassRef or Self.ClassRef notation:JavaScript, JScript function Cls_Method()
{ ... // Obtain the object class var cls = This.ClassRef; ... } VBScript Sub Cls_Method
... ' Obtain the object class Set cls = This.ClassRef ... End Sub DelphiScript procedure Cls_Method;
var cls : OleVariant; begin ... // Obtain the object class cls := Self.ClassRef; ... end; C++Script, C#Script function Cls_Method()
{ ... // Obtain the object class var cls = This["ClassRef"]; ... } |
Suppose that within an object’s method you need to pass the current object instance as a parameter of another method. For this purpose, you can also use the This
and Self
keywords:
JavaScript, JScript
function Cls_Method1()
{
...
This.Method2 (This);
...
}
VBScript
Sub Cls_Method1
...
This.Method2 (This)
...
End Sub
DelphiScript
procedure Cls_Method1;
begin
...
Self.Method2 (Self);
...
end;
C++Script, C#Script
function Cls_Method1()
{
...
This["Method2"](This);
...
}
However, if you need to pass the current object instance as a parameter of another object’s method, you should use the This.GetObject
and Self.GetObject
notation. Since This
and Self
are wrappers that refer to the current object instance, if passed to the method of another object they will refer to that object. In this case, using the GetObject
method allows you to obtain the current object instance itself:
JavaScript, JScript
// This routine is used as the Class1.Method method
function Cls1_Method ()
{
var obj2 = ODT.Classes.New("Class2");
obj2.Method (This.GetObject); // Posts "Class1" to the log
}
// This routine is used as the Class2.Method method
function Cls2_Method (Obj)
{
// Log the object's class name
Log.Message (Obj.ClassRef.Name);
}
VBScript
' This routine is used as the Class1.Method method
Sub Cls1_Method
Set obj2 = ODT.Classes.New("Class2")
obj2.Method (This.GetObject) ' Posts "Class1" to the log
End Sub
' This routine is used as the Class2.Method method
Sub Cls2_Method (Obj)
' Log the object's class name
Log.Message (Obj.ClassRef.Name)
End Sub
DelphiScript
// This routine is used as the Class2.Method method
procedure Cls2_Method (Obj);
begin
// Log the object's class name
Log.Message (Obj.ClassRef.Name);
end;
// This routine is used as the Class1.Method method
procedure Cls1_Method;
var obj2: OleVariant;
begin
obj2 := ODT.Classes.New('Class2');
obj2.Method (Self.GetObject); // Posts "Class1" to the log
end;
C++Script, C#Script
// This routine is used as the Class1.Method method
function Cls1_Method ()
{
var obj2 = ODT["Classes"]["New"]("Class2");
obj2["Method"](This["GetObject"]); // Posts "Class1" to the log
}
// This routine is used as the Class2.Method method
function Cls2_Method (Obj)
{
// Log the object's class name
Log["Message"](Obj["ClassRef"]["Name"]);
}
Note: | This and Self keywords can only be used within script routines that represent object methods. Outside these routines, the values of these keywords are undefined. |
Suppose that within a method that belongs to an object instance you need to access the object that holds a reference to the method’s object. To do this, use the Owner
property. Below is an illustration of how to do this, taken from our example (the MainUnit.ClsReplaceData_FindReplace
script routine plays the role of the ClsReplaceData.Replace
method; the owner of the instance of the ClsFindReplace
class is the Values
array whose owner is an instance of the ClsOperation
class).
JavaScript, JScript
{
...
This.Owner.Owner.Execute();
...
}
VBScript
...
Call This.Owner.Owner.Execute
...
End Sub
DelphiScript
begin
...
Self.Owner.Owner.Execute;
...
end;
C++Script, C#Script
{
...
This["Owner"]["Owner"]["Execute"]();
...
}
We would like to note that the objects you create via the ODT project item can be referred to only by one property, array item or data-group variable at a time. That is, an object cannot be referred to by several properties, array items or variables in data groups. For instance, if you need to exchange values of two properties, you will have to assign an empty value to one of these properties. The following sample code illustrates how you can do this.
JavaScript, JScript
obj.FirstObject = Obj1;
obj.SecondObject = Obj2;
// Exchange property values
// Saves objects to local variables
v1 = obj.FirstObject;
v2 = obj.SecondObject;
// Assigns Nothing to one of the properties,
// since an object cannot be referred to by several properties
obj.FirstObject = null;
// Assigns properties
obj.SecondObject = v1;
obj.FirstObject = v2;
VBScript
Set obj.FirstObject = Obj1
Set obj.SecondObject = Obj2
' Exchange property values
' Saves objects to local variables
Set v1 = obj.FirstObject
Set v2 = obj.SecondObject
' Assigns Nothing to one of the properties,
' since an object cannot be referred to by several properties
Set obj.FirstObject = Nothing
' Assigns properties
Set obj.SecondObject = v1
Set obj.FirstObject = v2
DelphiScript
obj.FirstObject := Obj1;
obj.SecondObject := Obj2;
// Exchange property values
// Saves objects to local variables
v1 := obj.FirstObject;
v2 := obj.SecondObject;
// Assigns Nothing to one of the properties,
// since an object cannot be referred to by several properties
obj.FirstObject := nil;
// Assigns properties
obj.SecondObject := v1;
obj.FirstObject := v2;
C++Script, C#Script
obj["FirstObject"] = Obj1;
obj["SecondObject"] = Obj2;
// Exchange property values
// Saves objects to local variables
v1 = obj["FirstObject"];
v2 = obj["SecondObject"];
// Assigns Nothing to one of the properties,
// since an object cannot be referred to by several properties
obj["FirstObject"] = null;
// Assigns properties
obj["SecondObject"] = v1;
obj["FirstObject"] = v2;
Note that the ODT project item includes specific means that help you walk down the hierarchy of custom objects, call object methods at each level, specify what methods to call and filter data that participates in testing. We will describe how to do this in the next step. For more information, see Controlling Object-Driven Tests.
Note that you can execute the script code described above in your keyword tests using the Run Script Routine operation.