TestComplete supports several scripting languages. In some case, you may need to convert script code from one language to another. Typically, this is not the code samples from TestComplete documentation, as it includes examples in all the supported languages. Usually, this happens when you find some third-party code that does what you need, but is written in a scripting language other than the one that your test project uses.
Modern programming and testing tools (including TestComplete) don’t convert scripts automatically, you have to do this manually.
Different scripting languages have similar code structures, but declare and implement them in slightly different manners. Below are equivalents of code structures used in the scripting languages that TestComplete supports. Use this list as a hint to convert scripts faster.
Tip: | C#Script, C++Script and JScript (not JavaScript), use the same scripting engine, so there is no need to convert script code from one of these languages to another. You can use JScript code with no changes in C#Script and C++Script projects, and vice versa. |
Brief overview
The table below lists sample scripting statements that demonstrate syntactic differences between the scripting languages.
Sensitive |
Sensitive |
|
function MyProcedure() |
def MyProcedure(): |
|
function MyFunction() |
def MyFunction(): |
|
let x, y; |
|
|
const c = 45; |
x = 0 |
|
true false |
True False |
|
"String" |
"String" |
|
String concatenation |
"Abra" + "cadabra" |
"Abra" + "cadabra" |
/* Multi-line |
# Single-line comment |
|
x = 10; |
x = 10 |
|
x = MyObject; |
x = MyObject |
|
x = obj.MyProperty; |
x = obj.MyProperty |
|
x.MyMethod(Param1, Param2); |
x.MyMethod(Param1, Param2) |
|
Arithmetic operations
|
||
Addition |
x + 5 |
x + 5 |
Subtraction |
y - 9 |
y - 9 |
Multiplication |
x * y |
x * y |
Division |
x / 2 |
x / 2 |
Modulus arithmetic |
x % 2 |
x % 2 |
Integer division |
|
x // 3 |
Increment |
i++ |
i += 1 |
Decrement |
i- - |
i -= 1 |
Exponentiation |
Math.pow(x,3) |
x ** 3 |
Comparison operators
|
||
Equality |
x == 10 |
x == 10 |
Inequality |
x != 0 |
x != 0 |
Less than |
x < 17 |
x < 17 |
Greater than |
x > 0 |
x > 0 |
Less than or equal to |
x <= 5 |
x <= 5 |
Greater than or equal to |
x >= 10 |
x >= 10 |
Test object equivalence |
Obj1 == Obj2 |
Obj1 == Obj2 |
Logical operators
|
||
Logical negation |
! x |
not x |
Logical conjunction |
x && y |
x and y |
Logical disjunction |
x || y |
x or y |
Logical exclusion |
x ^ y |
|
Bitwise operators
|
||
Bitwise negation |
~ x |
~ x |
Bitwise conjunction |
x & y |
x & y |
Bitwise disjunction |
x | y |
x | y |
Bitwise exclusion |
x ^ y |
x ^ y |
Bitwise left shift |
x << y |
x << y |
Bitwise right shift |
x >> y |
x >> y |
Conditionals
|
||
if (x == 10) |
if x == 10: |
|
switch (someChar) |
if someChar == 'a': |
|
Loops
|
||
for (let i = 0; i < 10; i++) |
for i in range (0, 9): |
|
while (i < 10) |
while i < 10: |
|
do Test1(); while (i < 10) |
while True: |
|
|
|
|
break; |
break |
|
Arrays
|
||
let myArr = new Array(3); |
myArr = [] |
|
let Arr = [10, 15, 25, 44]; |
Arr = [10, 15, 25, 44] |
|
len(myArr) |
||
myArr[1] = 15; |
myArr[1] = 15 |
|
Blanks
|
||
strictEqual(x, undefined) |
x == aqObject.EmptyVariant |
|
strictEqual(myObj, null) |
myObj == None |
|
strictEqual(myObj, null); |
x == None |
|
Handling exceptions
|
||
try |
try: |
Sensitive
Sensitive
Sensitive
Insensitive
Insensitive
function MyProcedure()
{
…
}
function MyProcedure()
{
…
}
def MyProcedure():
...
Sub MyProcedure
…
End Sub
procedure MyProcedure;
begin
…
end;
function MyFunction()
{
…
return 0;
}
function MyFunction()
{
…
return 0;
}
def MyFunction():
...
return 0
Function MyFunction
…
MyFunction = 0
End Function
function MyFunction;
begin
…
Result := 0;
end;
let x, y;
var x, y;
var x, y;
Dim x, y
var x, y;
const c = 45;
var c = 45;
x = 0
y = 0
Const c = 45
const c = 45;
true false
true false
True False
True False
true false
"String"
'String'
"String"
'String'
"String"
'String'
"""String"""
"String"
'String'
"Abra" + "cadabra"
"Abra" + "cadabra"
"Abra" + "cadabra"
"Abra" & "cadabra"
"Abra" + "cadabra"
'Abra' + 'cadabra'
/* Multi-line
comment */
// Single-line comment
/* Multi-line
comment */
// Single-line comment
# Single-line comment
Rem Single-line comment 1
' Single-line comment 2
{ Multi-line
comment }
// Single-line comment
x = 10;
x = 10;
x = 10
x = 10
x := 10;
x = MyObject;
x = MyObject;
x = MyObject
Set x = MyObject
x := MyObject;
x = obj.MyProperty;
x = obj.$get("MyProperty");
x = obj.MyProperty;
x = obj["MyProperty"];
x = obj.MyProperty
x = obj.MyProperty
x := obj.MyProperty;
x.MyMethod(Param1, Param2);
x.$call("MyMethod", Param1, Param2);
x.MyMethod(Param1, Param2);
x["MyMethod"](Param1, Param2);
x.MyMethod(Param1, Param2)
Call x.MyMethod(Param1, Param2)
x.MyMethod(Param1, Param2);
x + 5
x + 5
x + 5
x + 5
x + 5
y - 9
y - 9
y - 9
y - 9
y - 9
x * y
x * y
x * y
x * y
x * y
x / 2
x / 2
x / 2
x / 2
x / 2
x % 2
x % 2
x % 2
x Mod 2
x mod 2
x // 3
x \ 3
x div 3
i++
i = i+1
i++
i = i+1
i += 1
i = i+1
i = i+1
Inc(i)
i := i+1
i- -
i = i-1
i- -
i = i-1
i -= 1
i = i-1
i = i-1
Dec(i)
i := i-1
Math.pow(x,3)
Math.pow(x,3)
x ** 3
x ^ 3
x == 10
x == 10
x == 10
x = 10
x = 10
x != 0
x != 0
x != 0
x <> 0
x <> 0
x < 17
x < 17
x < 17
x < 17
x < 17
x > 0
x > 0
x > 0
x > 0
x > 0
x <= 5
x <= 5
x <= 5
x <= 5
x <= 5
x >= 10
x >= 10
x >= 10
x >= 10
x >= 10
Obj1 == Obj2
equal(Obj1, Obj2)
Obj1 == Obj2
Obj1 == Obj2
Obj1 Is Obj2
Obj1 = Obj2
! x
! x
not x
Not x
not x
x && y
x && y
x and y
x And y
x and y
x || y
x || y
x or y
x Or y
x or y
x ^ y
x ^ y
x Xor y
x xor y
~ x
~ x
~ x
Not x
not x
x & y
x & y
x & y
x And y
x and y
x | y
x | y
x | y
x Or y
x or y
x ^ y
x ^ y
x ^ y
x Xor y
x xor y
x << y
x << y
x << y
x shl y
x >> y
x >> y
x >> y
x shr y
if (x == 10)
Test1();
else
Test2();
if (x == 10)
Test1()
else
Test2();
if x == 10:
Test1()
else:
Test2()
If x = 10 Then
Test1
Else
Test2
End If
if x = 10 then
Test1
else
Test2;
switch (someChar)
{
case "a": TestOnA(); break;
case "z": TestOnZ(); break;
default: TestOnElse();
}
switch (someChar)
{
case "a": TestOnA(); break;
case "z": TestOnZ(); break;
default: TestOnElse();
}
if someChar == 'a':
TestOnA()
elif someChar == 'z':
TestOnZ()
else:
TestOnElse()
Select Case someChar
Case "a" TestOnA
Case "z" TestOnZ
Case Else TestOnElse
End Select
case someChar of
'a': TestOnA();
'z': TestOnZ();
else TestOnElse();
end;
for (let i = 0; i < 10; i++)
Test1();
for (i = 0; i < 10; i++)
Test1();
for i in range (0, 9):
Test1()
For i = 0 To 9
Test1
Next
for i := 0 to 9 do
Test1
while (i < 10)
Test1();
while (i < 10)
Test1();
while i < 10:
Test1()
Do While i < 10
Test1
Loop
while (i < 10) do
Test1();
do Test1(); while (i < 10)
do Test1(); while (i < 10)
while True:
Test1()
if i == 9:
break
Do
Test1
Loop While i < 10
repeat Test1(); until (i = 10);
for i of object
— or —Enumerator
object
— or —Utils.Enumerator()
method
Enumerator
object
— or —Utils.Enumerator()
method
Utils.Enumerator
method
For Each
— or —Utils.Enumerator()
method
Utils.Enumerator()
method
break;
break;
break
Exit For
Exit Do
break;
let myArr = new Array(3);
var myArr = new Array(3);
myArr = []
Dim myArr(3)
var myArr : array[0..2];
let Arr = [10, 15, 25, 44];
let Arr = new Array(10, 15, 25, 44);
var Arr = [10, 15, 25, 44];
var Arr = new Array(10, 15, 25, 44);
Arr = [10, 15, 25, 44]
Dim myArr: myArr = Array(10, 15, 25, 44)
myArr.length
myArr.length
myArr["length"]
VarArrayHighBound(myArr,1)+1
len(myArr)
VarArrayHighBound(myArr,1)+1
UBound(myArr)+1
VarArrayHighBound(myArr,1)+1
VarArrayHighBound(myArr,1)+1
myArr[1] = 15;
myArr[1] = 15;
myArr[1] = 15
myArr(1) = 15
myArr[1] := 15;
strictEqual(x, undefined)
equal(x, aqObject.EmptyVariant)
typeof(x) == "undefined"
x == aqObject.EmptyVariant
x == aqObject.EmptyVariant
x = Empty
IsEmpty(x)
x = aqObject.EmptyVariant
x = Unassigned
x = aqObject.EmptyVariant
strictEqual(myObj, null)
myObj == null
— or —
myObj == aqObject.EmptyObject
myObj == None
— or —
myObj == aqObject.EmptyObject
myObj Is Nothing
— or —
myObj Is aqObject.EmptyObject
myObj = nil
— or —
myObj = aqObject.EmptyObject
strictEqual(myObj, null);
x == null
x == None
strictEqual(x, null)
x = nil
try
{
Test1();
}
catch (e)
Log.Error(e.description);
try
{
Test1();
}
catch (e)
Log.Error(e.description);
try:
Test1
except:
Log.Error(ExceptionMessage)
Err.Clear
On Error Resume Next
Test1
If Err.Number <> 0 Then
Log.Error Err.Description
End If
try
Test1;
except
Log.Error(ExceptionMessage);
end;
Differences in Basic Syntax
Variant Data Types
All scripting languages supported by TestComplete use Variant-compatible data types. Variant is a universal type that can be used to store almost any kind of data: numbers, strings, date/time, true/false, references to objects, arrays and so on. All variables and parameters that you create and use in all your test projects are Variant-compatible.
For more information about Variant-compatible data types, see the following topics:
Case Sensitivity
Different scripting languages use different rules for function, variable, constant and parameter names and statements (keywords):
-
JavaScript, JScript, Python, C#Script and C++Script are case-sensitive. That is, they differentiate the letter case in names. For example, they consider
Foo()
andfoo()
as different functions. -
VBScript and DelphiScript are case-insensitive, that is, they do not differentiate upper-case and lower-case characters in names. In these languages, for example, the names
Foo()
andfoo()
relate to the same function.
When porting code from a case-insensitive to a case-sensitive language, pay attention to the letter case in function, variable, constant and parameter names and in statements.
Routine Declarations
Routines are divided into two types - procedures and functions. A procedure is a subprogram that performs some actions but does not return any value. Whereas, a function is a subprogram that performs actions and returns the calculated result on exit. The way in which the resulting value is returned depends on the scripting language.
In JavaScript, JScript, C#Script and C++Script, both procedures and functions are declared by using the same function
statement. The program instructions are enclosed in curly brackets. The function result is set via the return
statement.
JavaScript, JScript
function Func1(A, B)
{
return A+B;
}
function Test1()
{
var str;
Log.Message(Func1(3,4));
str = "Done.";
Log.Message(str);
}
C++Script, C#Script
function Func1(A, B)
{
return A+B;
}
function Test1()
{
var str;
Log["Message"](Func1(3,4));
str = "Done.";
Log["Message"](str);
}
In Python, procedures and functions are declared by using the def
statement. Program instructions are indented. The function result is set by assigning a value to a special return
variable. Routine declaration requires a colon (:) after the routine name and arguments.
Python
def Func1(A, B):
return A+B;
def Test1():
Log.Message(Func1(3,4))
str = "Done."
Log.Message(str)
In VBScript, procedure instructions are enclosed in the Sub
and End Sub
statements. Function instructions are enclosed in the Function
and End Function
statements and the function result is defined by assigning a value to the function name.
VBScript
Function Func1(A, B)
Func1 = A + B
End Function
Sub Test1()
Dim str
Log.Message(Func1(3,4))
str = "Done."
Log.Message(str)
End Sub
In DelphiScript, procedures and functions are declared via the procedure
and function
statements. Program instructions are enclosed in the begin
and end
statements. The function result is set by assigning a value to a special variable named Result
. Routine declaration requires a semicolon (;) after the routine name and arguments.
DelphiScript
function Func1(A, B);
begin
Result := A + B;
end;
procedure Test1();
var str;
begin
Log.Message(Func1(3,4));
str := 'Done.';
Log.Message(str);
end;
Comments
Comments are used to provide some remarks about the program. Another typical usage of comments is to temporally exclude some code from execution.
In JavaScript, JScript, C#Script, and C++Script, comments are denoted with two forward slashes (//). Also these scripting languages support the so called block comments: any text between the /* and */ characters is treated as a comment.
JavaScript, JScript, C#Script, C++Script
/* Multi-line
comment */
function Func1(A, B)
{
// Single-line comment
Result /* In-line comment */= A + B;
}
In Python, comments are preceded by a number sign (#). The text between the number sign and the end of the line is interpreted as a comment. To create multi-line comments, each line should start with a number sign.
Python
# Multi-line
# comment
def Func2(A, B):
# Single-line comment
Result = A + B; # End of line comment
In VBScript, comments are preceded by an apostrophe (') or by the Rem
keyword. The text between a apostrophe (or Rem
) and the end of line is interpreted as a comment. To create multi-line comments, each line should start with an apostrophe or the Rem
keyword.
VBScript
Rem Single-line comment 1
Function Func1(A, B)
' Single-line comment 2
Func1 = A + B
End Function
In DelphiScript, single-line comments start with two forward slashes (//), while block comments should be enclosed in curly brackets { } or in the (* and *) characters.
DelphiScript
comment }
(* Multi-line
comment 2 *)
function Func1(A, B);
begin
// Single-line comment
Result { In-line comment 1}:= A + (* In-line comment 2 *)B;
end;
Conditional Statements
If Statements
Conditional If-Then-(Else)
constructs perform different computations or actions depending on whether the specified boolean condition evaluates to true or false. The Else
branch is optional and can be omitted.
JavaScript, JScript
function IfThenElseDemo()
{
if (Sys.OSInfo.Windows64bit)
Log.Message("A 64-bit version of OS is installed.");
else
Log.Message("A 32-bit version of OS is installed.");
}
Python
def IfThenElseDemo():
if Sys.OSInfo.Windows64bit:
Log.Message("A 64-bit version of OS is installed.")
else:
Log.Message("A 32-bit version of OS is installed.")
VBScript
Sub IfThenElseDemo()
If (Sys.OSInfo.Windows64bit) Then
Call Log.Message("A 64-bit version of OS is installed.")
Else
Call Log.Message("A 32-bit version of OS is installed.")
End If
End Sub
DelphiScript
procedure IfThenElseDemo();
begin
if (Sys.OSInfo.Windows64bit) then
Log.Message('A 64-bit version of OS is installed.')
else
Log.Message('A 32-bit version of OS is installed.');
end;
C++Script, C#Script
function IfThenElseDemo()
{
if (Sys["OSInfo"]["Windows64bit"])
Log["Message"]("A 64-bit version of OS is installed.");
else
Log["Message"]("A 32-bit version of OS is installed.");
}
Switch/Select Statements
Switch/Select
statements compare a given value with the specified constants and take action according to the first constant to match.
JavaScript, JScript
function DaysInMonth(MonthNo, YearNo)
{
switch (MonthNo)
{
case 1: case 3: case 5: case 7: case 8: case 10: case 12: return 31;
case 2: if (aqDateTime.IsLeapYear(YearNo)) return 29; return 28;
case 4: case 6: case 9: case 11: return 30;
}
}
Python
def DaysInMonth(MonthNo, YearNo):
if MonthNo == 1 or MonthNo == 3 or MonthNo == 5 or MonthNo == 7 or MonthNo == 8 or MonthNo == 10 or MonthNo == 12:
return 31
elif MonthNo == 2:
if aqDateTime.IsLeapYear(YearNo):
return 29
else:
return 28
elif MonthNo == 4 or MonthNo == 6 or MonthNo == 9 or MonthNo == 11:
return 30
VBScript
Function DaysInMonth(MonthNo,YearNo)
Select Case MonthNo
Case 1,3,5,7,8,10,12 DaysInMonth=31
Case 2 If aqDateTime.IsLeapYear(YearNo) Then DaysInMonth=29 Else DaysInMonth=28
Case 4,6,9,11 DaysInMonth=30
End Select
End Function
DelphiScript
function DaysInMonth(MonthNo, YearNo: Integer): Integer;
begin
case MonthNo of
1,3,5,7,8,10,12: Result:=31;
2: if aqDateTime.IsLeapYear(YearNo) then Result:=29 else Result:=28;
4,6,9,11: Result:=30;
end;
end;
C++Script, C#Script
function DaysInMonth(MonthNo, YearNo)
{
switch (MonthNo)
{
case 1: case 3: case 5: case 7: case 8: case 10: case 12: return 31;
case 2: if (aqDateTime["IsLeapYear"](YearNo)) return 29; else return 28;
case 4: case 6: case 9: case 11: return 30;
}
}
Loops
In each of the supported scripting languages, there are several ways to repeat a set of commands.
For Loops
For
loops are typically used when you need to perform some instructions for a fixed number of times. In these loops, you explicitly specify the starting and ending values of the counter. Loop instructions are executed while the counter value is going from the starting to the ending value.
JavaScript
function ForDemo()
{
for (let i = 0; i <= 10; i++)
{
Log.Message(i);
}
}
JScript
function ForDemo()
{
for (var i = 0; i <= 10; i++)
{
Log.Message(i);
}
}
Python
def ForDemo():
for i in range (0, 10):
Log.Message(i)
# endregion
#region WhileDemo
def WhileDemo():
i = 0
while i < 10: # Test finish condition
i+=1
Log.Message(i)
VBScript
Sub ForDemo()
Dim i
For i = 0 To 10
Log.Message(i)
Next
End Sub
DelphiScript
procedure ForDemo();
var i;
begin
for i := 0 to 10 do
begin
Log.Message(i);
end;
end;
C++Script, C#Script
function ForDemo()
{
for (var i = 0; i <= 10; i++)
{
Log["Message"](i);
}
}
While Loops
While
loops verify the finish condition before executing any instructions inside the loop. Once the finish condition resolves to true, even before the first iteration, the inside instructions will not be executed at all.
Note: | If you use VBScript, you can organize a condition-controlled loop in several ways - by using the Do ... Loop and While ... Wend statements. The Do ... Loop structure is preferred, since it is more flexible and allows early exiting from loops. |
JavaScript, JScript
function WhileDemo()
{
var i = 0;
while (i < 10) // Test finish condition
{
i++;
Log.Message(i);
}
}
Python
def WhileDemo():
i = 0
while i < 10: # Test finish condition
i+=1
Log.Message(i)
VBScript
Sub WhileDemo()
Dim i
i = 0
Do While i < 10 ' Test finish condition
i = i + 1
Log.Message(i)
Loop
End Sub
DelphiScript
procedure WhileDemo();
var i;
begin
i := 0;
while (i < 10) do// Test finish condition
begin
i:=i+1;
Log.Message(i);
end;
end;
C++Script, C#Script
function WhileDemo()
{
var i = 0;
while (i < 10) // Test finish condition
{
i++;
Log["Message"](i);
}
}
Do - While Loops
Do-While
loops verify the finish condition after executing the instructions inside the loop. Thus, the loop body instructions are executed at least once, even if the finish condition resolves to true.
JavaScript, JScript
function DoWhileDemo()
{
var i = 0;
do
{
i++;
Log.Message(i);
}
while (i < 10) // Test finish condition
}
Python
def DoWhileDemo():
i = 0
while True:
i +=1
Log.Message(i);
if i == 9:
break
VBScript
Sub DoWhileDemo()
Dim i
i = 0
Do
i = i + 1
Log.Message(i)
Loop While (i < 10) ' Test finish condition
End Sub
Sub DoUntilDemo()
Dim i
i = 0
Do
i = i + 1
Log.Message(i)
Loop Until (i = 10) ' Test finish condition
End Sub
DelphiScript
procedure RepeatUntilDemo();
var i;
begin
i := 0;
repeat
begin
i:=i+1;
Log.Message(i);
end;
until (i = 10); // Test finish condition
end;
C++Script, C#Script
function DoWhileDemo()
{
var i = 0;
do
{
i++;
Log["Message"](i);
}
while (i < 10) // Test finish condition
}
Enumerator Loops
To iterate through child elements of an object, a special loop type is used in many scripting languages. TestComplete provides the Utils.Enumerator
method that you can use to create an enumerator object in any supported scripting language. You may also use language-specific statements, such as the for
statement in JavaScript and Python, the Enumerator
object in JScript, C#Script or C++Script, the For Each
statement in VBScript.
JavaScript
function Test()
{
// Using language-specific enumeration statements
for (let item of Sys)
Log.Message(item.Name);
}
JScript
function Test()
{
// Using language-specific enumeration statements
var iterator = new Enumerator(Sys);
for (; !iterator.atEnd(); iterator.moveNext())
Log.Message(iterator.item().Name);
}
Python
def Enumerator():
iterator = Enumerator(Sys)
while not iterator.AtEnd:
Log.Message(iterator.Item.Name)
iterator.moveNext()
VBScript
Sub Test
Dim p
' Using language-specific enumeration statements
For Each p In Sys
Log.Message p.Name
Next
End Sub
DelphiScript
procedure Test;
var enum;
begin
// Using language-specific enumeration statements
enum := Utils.Enumerator(Sys);
while not enum.AtEnd do
begin
Log.Message(enum.Item.Name);
enum.MoveNext;
end;
end;
C++Script, C#Script
function Test()
{
// Using language-specific enumeration statements
var iterator = new Enumerator(Sys);
for (; !iterator["atEnd"](); iterator["moveNext"]())
Log["Message"](iterator["item"]()["Name"]);
}
Early Exiting From Loops
To exit a loop without evaluating the finish condition (for example, to exit an infinite loop), you can use the break
statement (in JavaScript, JScript, Python, DelphiScript, C#Script and C++Script) and the Exit For
or Exit Do
statement (in VBScript).
JavaScript
function EarlyExitDemo()
{
for (let i = 0; i <= 10; i++)
{
Log.Message(i);
if (i==5) break;
}
}
function EarlyExitDemo2()
{
let i = 0;
do
{
i++;
Log.Message(i);
if (i==5) break;
}
while (i < 10)
}
JScript
function EarlyExitDemo()
{
for (var i = 0; i <= 10; i++)
{
Log.Message(i);
if (i==5) break;
}
}
function EarlyExitDemo2()
{
var i = 0;
do
{
i++;
Log.Message(i);
if (i==5) break;
}
while (i < 10)
}
Python
def EarlyExitDemo():
for i in range(0, 10):
Log.Message(i)
if i == 5:
break
def EarlyExitDemo2():
i = 0;
while True :
i+=1
Log.Message(i)
if i == 5:
break
VBScript
Sub EarlyExitDemo()
Dim i
For i = 0 To 10
Log.Message(i)
If i = 5 Then Exit For
Next
End Sub
Sub EarlyExitDemo2()
Dim i
i = 0
Do
i = i + 1
Log.Message(i)
If i = 5 Then Exit Do
Loop While i < 10
End Sub
DelphiScript
procedure EarlyExitDemo();
var i;
begin
for i := 0 to 10 do
begin
Log.Message(i);
if (i = 5) then break;
end;
end;
procedure EarlyExitDemo2();
var i;
begin
i := 0;
repeat
begin
Inc(i);
Log.Message(i);
if (i = 5) then break;
end;
until (i = 10);
end;
C++Script, C#Script
function EarlyExitDemo()
{
for (var i = 0; i <= 10; i++)
{
Log["Message"](i);
if (i==5) break;
}
}
function EarlyExitDemo2()
{
var i = 0;
do
{
i++;
Log["Message"](i);
if (i==5) break;
}
while (i < 10)
}
Arrays
An array stores a collection of elements. To access the elements of an array, index notation is used.
The most frequently used arrays are one-dimensional arrays. Accessing their elements involves a single subscript which can either represent a row or the column index.
Arrays in JavaScript, JScript, C#Script and C++Script
Variant Arrays and Array Objects
In VBScript and DelphiScript, the array data type is treated as Variant containing an array. Whereas in JScript, C#Script and C++Script, arrays are treated as objects. In most cases, it is not important, however, some TestComplete routines accept or return data in the variant array format. To use these routines in JScript, C#Script and C++Script, you need to convert the array from one format to another. See Supported Scripting Languages - Specifics of Usage for details and conversion routines. Although in JavaScript and Python arrays are treated as objects as well, TestComplete supports their format and there is no need to convert JavaScript and Python arrays to variant array format. Also, JavaScript and Python in TestComplete can read items from variant arrays.
To create variant arrays, you can call the TestComplete built-in methods: CreateVariantArray()
, CreateVariantArray2()
and CreateVariantArray3()
.
Unassigned Data, Blank Values, Empty Objects
Each of the scripting languages has special means to denote unassigned data, objects or blank values. The following code samples demonstrate how to verify these states:
Checking Unassigned Variables
In JavaScript we recommend that you use the strictEqual
method to check if a variable is unassigned (for more information see JavaScript - Specifics of Usage). In JScript, C#Script and C++Script unassigned variables belong to the special undefined
data type. In Python, there are no unassigned variables, so there is no special object to check their values. In VBScript, unassigned variables belong to the special Empty
data type. Also, during comparison, you can use a VBScript function named IsEmpty
. In DelphiScript, an empty variant value is returned by the Unassigned
function.
Besides, TestComplete has its own equivalent of an unassigned value - the aqObject.EmptyVariant
property, which returns an empty variant value. This property is available in each of the supported scripting languages.
Note: | Since there are no unassigned variables in Python, this method returns only True if you explicitly assigned None to the variable. |
JavaScript
function VerifyUnassignedVariable()
{
let myVar;
if (strictEqual(myVar, undefined))
Log.Message("The variable is not assigned yet.");
else
Log.Message("The variable has a value.");
}
JScript
function VerifyUnassignedVariable()
{
var myVar;
//if (myVar == aqObject.EmptyVariant)
if ( typeof(myVar) == "undefined" )
Log.Message("The variable is not assigned yet.");
else
Log.Message("The variable has a value.");
}
Python
def VerifyUnassignedVariable():
myVar = None
if myVar == aqObject.EmptyVariant:
Log.Message("The variable is not assigned yet.")
else:
Log.Message("The variable has a value.");
VBScript
Sub VerifyUnassignedVariable()
Dim myVar
'If myVar = aqObject.EmptyVariant Then
'If IsEmpty(myVar) Then
If myVar = Empty Then
Log.Message "The variable is not assigned yet."
Else
Log.Message "The variable has a value."
End If
End Sub
DelphiScript
procedure VerifyUnassignedVariable;
var myVar;
begin
//if (myVar = aqObject.EmptyVariant) then
if (myVar = Unassigned )then
Log.Message('The variable is not assigned yet.')
else
Log.Message('The variable has a value.');
end;
C++Script, C#Script
function VerifyUnassignedVariable()
{
var myVar;
//if (myVar == aqObject["EmptyVariant"])
if ( typeof(myVar) == "undefined" )
Log["Message"]("The variable is not assigned yet.")
else
Log["Message"]("The variable has a value.");
}
Comparing an Object Against an Empty Object
In JavaScript, we recommend that you use the strictEqual
method to compare a variable with an undefined value (for more information, see JavaScript - Specifics of Usage). In JScript, C#Script and C++Script, empty objects are interpreted as the null
data type. In Python, empty objects are listed as None
. In VBScript, an empty object is denoted with the Nothing
keyword. Similarly, in DelphiScript, empty objects are treated as the nil
constant.
TestComplete also provides the aqObject.EmptyObject
property, that returns an empty object. This property is available in each of the supported scripting languages.
The sample code below checks whether the aqFileSystem.FindFiles
method has returned a non-null result.
JavaScript
function FileFinder()
{
let foundFiles, aFile;
foundFiles = aqFileSystem.FindFiles("C:\\Work\\", "*.exe");
if (!strictEqual(foundFiles, null))
while (foundFiles.HasNext())
{
aFile = foundFiles.Next();
Log.Message(aFile.Name);
}
else
Log.Message("No files were found.");
}
JScript
function FileFinder()
{
var foundFiles, aFile;
foundFiles = aqFileSystem.FindFiles("C:\\Work\\", "*.exe");
if (foundFiles != null)
while (foundFiles.HasNext())
{
aFile = foundFiles.Next();
Log.Message(aFile.Name);
}
else
Log.Message("No files were found.");
}
Python
def FileFinder():
foundFiles = aqFileSystem.FindFiles("C:\\Work\\", "*.exe");
if (foundFiles != None):
while foundFiles.HasNext():
aFile = foundFiles.Next()
Log.Message(aFile.Name)
else:
Log.Message("No files were found.")
VBScript
Sub FileFinder
Set foundFiles = aqFileSystem.FindFiles("C:\Work\", "*.exe")
If Not foundFiles Is Nothing Then
While foundFiles.HasNext
Set aFile = foundFiles.Next
Log.Message aFile.Name
Wend
Else
Log.Message "No files were found."
End If
End Sub
DelphiScript
procedure FileFinder;
var foundFiles, aFile;
begin
foundFiles := aqFileSystem.FindFiles('C:\Work\', '*.exe');
if foundFiles <> nil then
while foundFiles.HasNext do
begin
aFile := foundFiles.Next;
Log.Message(aFile.Name);
end
else
Log.Message('No files were found.');
end;
C++Script, C#Script
function FileFinder()
{
var foundFiles, aFile;
foundFiles = aqFileSystem["FindFiles"]("C:\\Work\\", "*.exe");
if (foundFiles != null)
while (foundFiles["HasNext"]())
{
aFile = foundFiles["Next"]();
Log["Message"](aFile["Name"]);
}
else
Log["Message"]("No files were found.");
}
Verifying That a Variable Does Not Contain Any Data
You can verify that a variable does not contain any data by assigning a special value to the variable (null
in JavaScript, JScript, VBScript, C#Script, C++Script, None
in Python and nil
in DelphiScript). To check such a variable, you need to compare its value with the null value. Instead of direct comparison in JavaScript, we recommend that you use the strictEqual
method to compare a variable with the null
value. In VBScript, you should use the built-in function IsNull()
(as the direct comparison varName = null
resolves to null
rather than to a Boolean value, null).
JavaScript
function VerifyNullValue()
{
let myVar;
myVar = null;
if (strictEqual(myVar, null)) Log.Message("The variable is empty.");
}
JScript
function VerifyNullValue()
{
var myVar;
myVar = null;
if (myVar == null) Log.Message("The variable is empty.");
}
Python
def VerifyNullValue():
myVar = None
if myVar == None:
Log.Message("The variable is empty.")
VBScript
Sub VerifyNullValue()
Dim myVar
myVar = null
If IsNull(myVar)Then
Log.Message "The variable is empty."
End If
End Sub
DelphiScript
procedure VerifyNullValue();
var myVar;
begin
myVar := nil;
if (myVar = nil)then
Log.Message('The variable is empty.');
end;
C++Script, C#Script
function VerifyNullValue()
{
var myVar;
myVar = null;
if (myVar == null) Log["Message"]("The variable is empty.");
}
Handling Exceptions
To handle exceptions in JavaScript, JScript, C#Script and C++Script, use the try ... catch ... finally
statements.
JavaScript
function ExceptionDemo()
{
var myVar;
try
{
NonExistentTest();
}
catch (e)
{
// Posts an exception message to the test log
Log.Error(e.message);
}
finally
{
DoTheCleaning();
}
}
JScript
function ExceptionDemo()
{
var myVar;
try
{
NonExistentTest();
}
catch (e)
{
// Posts an exception message to the test log
Log.Error(e.description);
}
finally
{
DoTheCleaning();
}
}
C++Script, C#Script
function ExceptionDemo()
{
var myVar;
try
{
NonExistentTest();
}
catch (e)
{
// Posts an exception message to the test log
Log["Error"](e["description"]);
}
finally
{
DoTheCleaning();
}
}
To handle exceptions in Python, use the try ... except ... else ... finally
statement.
To obtain the exception text, you need to catch it in the except
statement by using Exception as the e
phrase and convert the text to a string by using the Python str()
function.
Python
def ExceptionDemo():
try:
NonExistentTest()
except Exception as e:
# Posts an exception message to the test log
Log.Error(str(e));
else:
# If there is no exception, runs after try, but before finally
DoSomeThingElse()
finally:
DoTheCleaning()
To handle exceptions in VBScript, use the Err
object and the On Error
statement.
VBScript
Sub ExceptionDemo
Err.Clear' Resets the exception indicator
On Error Resume Next ' If an exception occurs,
' TestComplete will continue running
' the script
NonExistentTest
If Err.Number <> 0 Then
' An exception occurred !!!
' Posts the exception messages to the test log
Log.Error Err.Description
Else
' No exceptions
Log.Message "Everything is fine."
End If
End Sub
To handle exceptions in DelphiScript, you can use the try... except... end
and try... finally... end
statements.
To obtain the exception message in DelphiScript, use the ExceptionMessage
function.
DelphiScript
procedure ExceptionDemo;
begin
try
try
begin
NonExistentTest();
end;
except
// Posts the exception message to the test log
Log.Error(ExceptionMessage);
end;
finally
DoTheCleaning();
end;
end;
To learn more about handling exceptions that occur in scripts and in the application under test, see the topic: Handling Exceptions in Scripts.
See Also
Script Tests
Supported Scripting Languages - Specifics of Usage
Handling Exceptions in Scripts