There are several ways to refer to objects in .NET applications. If you use Name Mapping in your test project, you can refer to application objects using their names specified in Name Mapping. For objects not in Name Mapping, you can use the naming syntax that directly includes identification properties and values of these objects. This topic explains both approaches.
About Object Names in the Object Browser
Addressing .NET Objects Using Name Mapping and Aliases
Addressing .NET Objects Without Name Mapping
Note: | The information in this topic applies only to GUI objects. To learn how to refer to non-GUI objects that are not displayed in the Object Browser, see Accessing Non-Visual Objects in .NET Applications. |
About Object Names in the Object Browser
You can explore the object structure of the tested application in the Object Browser. Here is a sample view of the .NET application hierarchy displayed in the Object Browser:
Here, the Process("Orders")
branch of the Sys
object corresponds to your tested .NET application and the other objects correspond to the application’s windows, controls and objects.
To refer to an individual object in the tested .NET application, select the needed object in the Object Browser or Object Spy. These tools display the selected object’s name above the member list. From the right-click menu, you can copy this name to the clipboard and then insert it into your test.
You may notice that this name is different from what you see in the object tree on the left of the Object Browser. This is because the name displayed at the top of the panel uses object aliases if they are defined, whereas the object tree uses the naming syntax that includes identification properties. The differences between the two object naming syntaxes are explained in the Addressing .NET Objects Using Name Mapping and Aliases and Addressing .NET Objects Without Name Mapping sections below.
You can also learn object names in different syntaxes by looking at the following object properties:
-
MappedName
- the object’s fully-qualified alias (including aliases of all parent objects). This name is used by default for the object in your tests. Note that if the selected object is not in Name Mapping, this property is empty. -
Name
- the object name that includes its identification properties. This is the same name you see in the Object Browser’s object tree. For an explanation of this syntax, see below. -
FullName
- the object’s fully-qualified name in the syntax that includes the identification properties. This name consists of the object’sName
property value and theName
s of all of its parent objects. See below.
Addressing .NET Objects Using Name Mapping and Aliases
By default, TestComplete uses the object names from Name Mapping (the object repository) to refer to objects in .NET applications under test. These names are called aliases. When you record a test, TestComplete automatically adds the recorded objects to Name Mapping and generates aliases for them.
You can see available object aliases and add new aliases in the Name Mapping editor.
Here, Mapped Objects and Aliases display the hierarchy of mapped objects and their aliases, respectively. The fully-qualified alias that can be used to refer to an object is displayed in the top right part of the Name Mapping editor (see the image above). It starts with Aliases and includes aliases of all of the object’s parent objects separated by dots (in VBScript, JScript, Python and DelphiScript projects) or square brackets (in C++Script and C#Script projects). For example, in the image above you can see that you can refer to the OrdersView object using the following name:
JavaScript, JScript
Aliases.Orders.OrdersView
Python
Aliases.Orders.OrdersView
VBScript
Aliases.Orders.OrdersView
DelphiScript
Aliases.Orders.OrdersView
C++Script, C#Script
Aliases["Orders"]["OrdersView"]
You can copy object aliases from the Name Mapping editor to the clipboard and use them when manually adding test operations over the tested application’s objects.
The following example shows a sample item selection operation on the OrdersView control specified by an alias:
Note: | For simplicity, keyword tests do not display the Aliases identifier at the beginning of object aliases.
Also, keyword tests may not display intermediate objects in the application’s object hierarchy. To view the full name of an operation’s target object, double-click the operation or increase the Maximum depth option in Keyword Test Editor - Groups options. |
JavaScript, JScript
Aliases.Orders.OrdersView.ClickItem("Samuel Clemens", 0);
Python
Aliases.Orders.OrdersView.ClickItem("Samuel Clemens", 0);
VBScript
Call Aliases.Orders.OrdersView.ClickItem("Samuel Clemens", 0)
DelphiScript
Aliases.Orders.OrdersView.ClickItem('Samuel Clemens', 0);
C++Script, C#Script
Aliases["Orders"]["OrdersView"]["ClickItem"]("Samuel Clemens", 0);
Note that the fully-qualified mapped name for this object is the following:
JavaScript, JScript
NameMapping.Sys.Orders.MainForm.OrdersView
Python
NameMapping.Sys.Orders.MainForm.OrdersView
VBScript
NameMapping.Sys.Orders.MainForm.OrdersView
DelphiScript
NameMapping.Sys.Orders.MainForm.OrdersView
C++Script, C#Script
NameMapping["Sys"]["Orders"]["MainForm"]["OrdersView"]
Since the MainForm object is of no interest for our test, we exclude it from the path to the OrdersView object in the Alias tree, so the object hierarchy becomes shorter. Using aliases lets you make your scripts shorter and more readable.
For more information about using Name Mapping and aliases, see Name Mapping and Access Objects by Aliases.
Addressing .NET Objects Without Name Mapping
Your tests can work not only with applications and objects added to Name Mapping, but also with any other running applications, their windows and controls. These objects can be addressed using a syntax that directly includes identification property values:
JavaScript, JScript
Sys.Process("Orders").WinFormsObject("MainForm").WinFormsObject("OrdersView").ClickItem("Samuel Clemens", 0);
Python
Sys.Process("Orders").WinFormsObject("MainForm").WinFormsObject("OrdersView").ClickItem("Samuel Clemens", 0);
VBScript
Call Sys.Process("Orders").WinFormsObject("MainForm").WinFormsObject("OrdersView").ClickItem("Samuel Clemens", 0)
DelphiScript
Sys.Process('Orders').WinFormsObject('MainForm').WinFormsObject('OrdersView').ClickItem('Samuel Clemens', 0);
C++Script, C#Script
Sys["Process"]("Orders")["WinFormsObject"]("MainForm")["WinFormsObject"]("OrdersView")["ClickItem"]("Samuel Clemens", 0);
To learn the exact syntax for referring to a particular object, use the Object Browser - the object tree and the FullName
property of objects always use this naming syntax. See the About Object Names in the Object Browser section above.
Let’s have a closer look at this notation and its components.
-
The notation starts with the
Sys
object that represents the operating system. -
The next object,
Process("Orders")
, represents the .NET application with the file name Orders.exe. -
Further objects represent windows and controls in the .NET application.
The default and most commonly used syntax for these objects is as follows:
WinFormsObject(NativeName)
VCLNETObject(NativeName)-
The
WinFormsObject
notation is used for objects in .NET applications that use Windows Forms GUI framework; theVCLNETObject
notation - for .NET applications that use Borland VCL.NET GUI framework. -
NativeName is the object name defined by the application developers. This name is specified by the object’s:
-
WinFormsControlName
property in Windows Forms applications.
-- or --
-
NativeClrObject.Name
property in Borland VCL.NET applications.
-
Other possible syntax for .NET objects is as follows:
WinFormsObject(NETClassName, Caption, [Index])
VCLNETObject(NETClassName, Caption, [Index])
Instead of the object’s native name, it uses its .NET class name (specified by the
ClrClassName
property value), text and (optionally) index among sibling objects with the same class and text. This syntax is and should be used in the following cases:-
TestComplete cannot determine the object name that is specified in the application code.
-
There are several objects with the same name.
For more information about .NET object addressing syntax and its parameters, see the description of the
WinFormsObject
andVCLNETObject
notation. -
For examples of this syntax applied to objects in your tested .NET application, examine your application in the Object Browser. You can also copy this syntax from the Object Browser and paste it to your test to avoid having to type it manually.
Remarks
-
The
WinFormsObject
andVCLNETObject
notation is used for .NET GUI objects of any type - forms, buttons, combo boxes, grids, and so on. The word Object here does not mean that TestComplete does not identify the object type. Just the opposite, TestComplete supports many different types of .NET GUI objects and provides high-level methods and properties for automating operations over them. See Support for .NET Applications' Controls for more information. -
If the Use native object names for TestComplete object names setting is disabled in your test project, TestComplete uses the
WinFormsObject(NETClassName, Caption, [Index])
rather thanWinFormsObject(NativeName)
notation for .NET objects by default. For example, it uses this notation in the Object Browser and also during the test recording when Name Mapping is not used.Note, however, that this setting only affects the default object naming syntax used in TestComplete panels and dialogs. When creating tests manually, you can use both the
WinFormsObject(NativeName)
andWinFormsObject(NETClassName, Caption, [Index])
notations equally well, regardless of this setting.
Combining Mapped and Unmapped Object Names
You can combine aliases specified in Name Mapping and the WinFormsObject
(or VCLNETObject
) notation when referencing an object hierarchy in tests. For example, you can use aliases for parent objects and the WinFormsObject
(VCLNETObject
) notation for child objects:
JavaScript, JScript
Aliases.Orders.OrderForm.WinFormsObject("ButtonOK").ClickButton();
Python
Aliases.Orders.OrderForm.WinFormsObject("ButtonOK").ClickButton();
VBScript
Aliases.Orders.OrderForm.WinFormsObject("ButtonOK").ClickButton
DelphiScript
Aliases.Orders.OrderForm.WinFormsObject('ButtonOK').ClickButton();
C++Script, C#Script
Aliases["Orders"]["OrderForm"]["WinFormsObject"]("ButtonOK")["ClickButton"]();
However, keep in mind that aliases must always precede the WinFormsObject
(VCLNETObject
) notation in the object hierarchy. Aliases cannot be used after the WinFormsObject
(VCLNETObject
) notation within the same statement. That is, the following statement is invalid:
JavaScript, JScript
Sys.Process("Orders").OrderForm.ButtonOK.ClickButton();
Python
Sys.Process("Orders").OrderForm.ButtonOK.ClickButton();
VBScript
Sys.Process("Orders").OrderForm.ButtonOK.ClickButton
DelphiScript
Sys.Process('Orders').OrderForm.ButtonOK.ClickButton();
C++Script, C#Script
Sys["Process"]("Orders")["OrderForm"]["ButtonOK"]["ClickButton"]();
Further Reading
The following topics explain how to refer to objects in .NET applications while performing some common operations on them:
See Also
Testing .NET Applications
About Testing .NET Applications
Support for .NET Applications' Controls
Accessing Native Properties and Methods of .NET Objects