In version 12.60, the Optical Character Recognition feature was upgraded to a new plugin powered by Google Cloud Vision API. To learn more, see Optical Character Recognition. The deprecated OCR plugin was removed from TestComplete in version 12.60. If you need to use the deprecated OCR plugin with this version of TestComplete, please contact our Customer Care team. The deprecated OCR plugin was restored in TestComplete version 14.0. To use the plugin with this or later TestComplete version, you need to install and enable the plugin manually. |
The TestComplete OCR engine uses specific algorithms to “read” text from an onscreen region character by character. These algorithms depend on several factors: font, text and background colors, text size and others. All of these factors make optical recognition prone to errors. TestComplete includes the Text Recognition plugin that uses other principles for text recognition. The plugin intercepts calls to certain Windows API functions that output text on screen and tries to create special test objects for this text. This plugin works faster than the OCR engine and, if used, provides 100% recognition accuracy.
This topic describes how you can use the Text Recognition plugin to perform the actions which the OCR engine performs and explains when you use this or that technology.
Typical OCR Tasks
Typically, testers use the TestComplete OCR subsystem when they cannot obtain text from an object for some reason or when they needed to find a test object that contains text. Let’s consider these typical tasks in detail:
-
Finding an object by text
Suppose you are testing an application that uses a third-party menu system which is not supported by TestComplete. Since the menu is not supported, TestComplete will not provide methods and objects for simulating user actions over the menu.
To work around the problem, you can simulate selecting the menu item by calling the
Click
method of the tested form and passing the coordinates of desired items to this method as parameters. However, it is difficult to create and maintain such tests. Also, hard-coded coordinates will make the test less stable: if the position of the desired menu item changes, the test will fail.The OCR subsystem offers a better solution. It helps you find the rectangular area of screen that contains the desired text. After you get the area, you can pass the desired coordinates to the
Click
method and simulate the desired action.The Text Recognition plugin also helps you solve this problem. It recognizes menu items by their text and creates the
TextObject
object for each item. You can easily simulate selecting an item by calling theClick
method of theTextObject
object. -
Getting text of an object
Let’s consider another example: a tested form contains a label and your test should simulate a click over it. This task is not a problem if you are testing an Open Application. However, it may become a problem if you have to test a black-box application. It is quite possible that the tested application does not create a special window to display the label’s text, but draws the text on the surface of the tested form. The TestComplete object hierarchy will not contain an object that corresponds to this label, so it may be difficult to determine the label’s text and compare it with some baseline value.
Using the OCR engine you can recognize this text and perform the desired comparison. The Text Recognition plugin also helps you solve this problem. See below for more information.
Finding an Object by Text
To find the coordinates of text on screen, you can use the FindRectByText
method of an OCRObject
object. This method recognizes the whole text within some visual region and then searches for the rectangle that surrounds the desired text.
As an alternative to the FindRectByText
method, you can use the Text Recognition plugin:
-
Enable the Text Recognition support for your tested form or controls in TestComplete project properties. For more information about this, see the description of the Text Recognition subsystem.
After this, TestComplete will use the Text Recognition engine to recognize text drawn in your tested application and will create
TextObject
objects for them. -
If you know the text the desired control contains, then after you enable the Text Recognition support, you can use code like
TextObject("My Text")
to obtain the object holding the desired text. For instance:JavaScript, JScript
var myWnd, textObj;
// Get the tested window
myWnd = Sys.Process("MyProcess").Window("MyWindowClass", "My Window Caption", 1);
// Get the TextObject object
textObj = myWnd.TextObject("My Desired Text");Python
# Get the tested window myWnd = Sys.Process("MyProcess").Window("MyWindowClass", "My Window Caption", 1) # Get the TextObject object textObj = myWnd.TextObject("My Desired Text")
VBScript
' Get the tested window
Set myWnd = Sys.Process("MyProcess").Window("MyWindowClass", "My Window Caption", 1)
' Get the TextObject object
Set textObj = myWnd.TextObject("My Desired Text")DelphiScript
var
myWnd, textObj : OleVariant;
begin
// Get the tested window
myWnd := Sys.Process('MyProcess').Window('MyWindowClass', 'My Window Caption', 1);
// Get the TextObject object
textObj := myWnd.TextObject('My Desired Text');
end;C++Script, C#Script
var myWnd, textObj;
// Get the tested window
myWnd = Sys["Process"]("MyProcess")["Window"]("MyWindowClass", "My Window Caption", 1);
// Get the TextObject object
textObj = myWnd["TextObject"]("My Desired Text");If you do not know the exact text, then you can enumerate child objects of the tested window and compare their names and text with the desired values.
To enumerate child objects, you use the
Child
method andChildCount
property of the form. The names of the objects created by the Text Recognition plugin look likeTextObject("desired text")
. To obtain the text, use theText
property ofTextObject
objects.If the form contains several
TextObject
objects having similar text, then to find the needed object, you can check itsIndex
property or check the properties that return the object's coordinates:Top
,Left
,ScreenTop
andScreenLeft
.To find a child object by its property values, you can also use the
Find
andFindChild
methods of the tested form.
After you obtain the text object, you can perform the needed actions with it. For instance, you can use the Click
and ClickR
methods to simulate mouse clicks over the object.
Getting Text of an Object
Another common task for the OCR engine is to obtain text of some control. To do this, you can use the OCR.CreateObject(...).GetText
method. Alternatively, you can use Text Recognition services:
-
First, enable Text Recognition services in your project’s properties. For more information on this, see the description of the Text Recognition subsystem.
-
Your further actions depend on the application under test:
-
If you know the screen coordinates of some point within the text, you can pass them to the
Sys.ObjectFromPoint
orSys.Desktop.ObjectFromPoint
method and the method will return theTextObject
object that provides a scripting interface to the desired text.You can find the coordinates in the Object Browser panel before running tests.
-
If the text coordinates may change from one test run to another, then you need to enumerate through child objects of the window that contains the desired text and check the properties of the child objects. For instance, you can use the
Index
property or the properties that return the coordinates of the text object:Top
,Left
,ScreenTop
andScreenLeft
.To find a child object by its property values, you can also use the
Find
orFindChild
method of the tested form.
-
When to Use OCR and When to Use Text Recognition
Since the Text Recognition plugin uses other principles to determine object text, it works faster than the OCR engine and, if used, provides 100% recognition accuracy. We recommend that you always use Text Recognition services to work with text controls. If Text Recognition does not help, then use OCR.
Note however that there are situations when the Text Recognition plugin will not be helpful:
-
A tested window displays an image that includes some text. Since this text is part of the image, the Text Recognition plugin will not be able to create a
TextObject
object for it. Such images are typically used by web pages. If you need to obtain text shown in an image, you have to use the OCR engine. -
The way the tested application draws text is not typical for Windows applications. For instance, if the application draws text pixel by pixel rather than calls the
DrawText
function of Windows API, the Text Recognition plugin will not be able to determine the drawn text and will not create aTextObject
object for it. To recognize such text, use the OCR engine.
See Also
Using Optical Character Recognition - Overview
Using Text Recognition Technology