Applies to TestComplete 14.10, last modified on June 5, 2019

Description

Use FindAll to search for all objects that have the specified values of the specified properties. The search is performed in the object hierarchy displayed in the Object Browser panel starting from the testedObj object and continuing down the hierarchy to the specified depth. The returned collection may include the testObj object and its child, grandchild or great grandchild objects that match the search conditions.

The FindAll method is similar to FindAllChildren. The difference between them is that FindAllChildren only searches in child objects, while FindAll also searches in the testedObj object.

Declaration

TestObj.FindAll(PropNamesPropValuesDepthRefresh)

TestObj A variable, parameter or expression that specifies a reference to one of the objects listed in the Applies To section
PropNames [in]    Required    Variant    
PropValues [in]    Required    Variant    
Depth [in]    Optional    Integer Default value: 1   
Refresh [in]    Optional    Boolean Default value: True   
Result An array of the tested objects.

Applies To

All processes, windows, controls and onscreen objects.

View Mode

To view this method in the Object Browser panel and in other panels and dialogs, activate the Advanced view mode.

Parameters

The method has the following parameters:

PropNames

A property or an array of properties by which the method will search for an object.

You can view the list of object properties and their values in the Object Browser. See Exploring Object Properties and Methods in the Object Browser.

For web applications and hybrid mobile applications, you can also specify names of native web attributes (since TestComplete treats native web attributes as object properties). See Accessing Native Web Attributes and Methods for details.

PropValues

A value of a single property or an array of values of properties that the PropNames parameter specifies.

Values can contain asterisk (*) or question mark (?) wildcards, or regular expressions. The asterisk (*) wildcard corresponds to a string of any length (including an empty string), the question mark corresponds to any single character (including none). To specify more complicated parts of the value, use regular expressions. For information on them, see the Remarks section below.

Values can be case-sensitive or case-insensitive depending on the Use case-sensitive parameters setting of your current project. Regular expression patterns are always case-insensitive.

You can view the list of object properties and their values in the Object Browser. See Exploring Object Properties and Methods in the Object Browser.

Depth

A positive number (greater than 0) that specifies the level of objects where FindAll will search for the desired objects. By default, Depth is 1 and means that the method will search in the testObj object and its child objects. If Depth is 2, FindAll will search in testObj, child and grandchild objects. If Depth is 3, FindAll will search in testObj, child, grandchild and great grandchild objects, and so on. To search in the whole testObj hierarchy, use a Depth value that is greater than the number of child levels in the hierarchy, for example, 20000.

Refresh

TestComplete performs the search in the cached copy of the object hierarchy, which may not correspond to the actual hierarchy of objects in the tested application. This may happen, for instance, if the actions that precede the search caused changes in the application state. The Refresh parameter lets you specify what TestComplete should do if no objects matching the search criteria were found in the cached object tree. If it is True (default), TestComplete will refresh the cached object tree and perform the search once again. If it is False, TestComplete will not refresh the object tree and will return an empty array indicating that no objects were found.

Result Value

An array of the objects that have the specified values of the specified properties. The returned collection includes the testObj object if it matches the search conditions.

Note for JScript, C#Script and C++Script users: The array returned by the FindAll method is in the safe array format, which is not compatible with standard JScript arrays. To use such an array in JScript, C#Script or C++Script code, you need to convert it to the native format using the toArray method of the variant array (see the examples below).

Remarks

  • We do not recommend that you use the VisibleOnScreen property in a search condition of the method. It may take much time for TestComplete to get the value of this property, and using it for searching for objects may decrease the test performance significantly.

  • When the FindAll method is used to search for objects by name (the Name property), TestComplete ignores spaces and the following characters in the name:

    ( ) [ ] . , " '

    This behavior is intended to eliminate differences between the object name syntax in different scripting languages during the search.

    In general, it is not recommended to use the Name property with FindAll; consider using other properties instead. For example, Name is a complex value that is composed of other properties, such as WndClass or WndCaption, so you can search by a combination of these individual properties.

  • Regular expressions should start with "regexp:", for example:

    obj = parent.Find("PropName", "regexp:gr[ae]y", 5)

    Regular expression patterns use the standard TestComplete syntax, but have the following specifics:

    • All patterns are case-insensitive. For example, "regexp:gr[ae]y" will match both "gray" and "GRAY".

    • Patterns search for partial matches. For example, regexp:notepad matches both "notepad" and "notepad++". To search for an exact match, use the ^ and $ anchors, for example "regexp:^notepad$".

    Native regular expressions of the scripting languages are not supported.

Example

The following example searches for all buttons of the Edit class in the Notepad’s Font dialog (Notepad must be running). The example uses a single search condition: WndClass equals to “Edit”. The single values are passed to the PropNames and PropValues parameters:

JavaScript

function FindEditbuttons()
{
  var p, w, textBoxes;

  // Obtain the Notepad process
  p = Sys.Process("notepad");

  // Open the Font dialog
  p.Window("Notepad", "*").MainMenu.Click("Format|Font...");
  w = p.Window("#32770", "Font");

  // Search for all edit buttons in the Font dialog
  textBoxes = w.FindAll("WndClass", "Edit", 5);

  // Log the search results
  if (textBoxes.length > 0)
  {
    for (let i = 0; i < textBoxes.length; i++)
      Log.Message("FullName: " + textBoxes[i].FullName + "\r\n" +
                  "Text: " + textBoxes[i].wText);
    Log.Message("Total number of found edit buttons: " + textBoxes.length);
  }
  else
    Log.Warning("No edit buttons found.");
}

JScript

function FindEditbuttons()
{
  var p, w, textBoxes, i;

  // Obtain the Notepad process
  p = Sys.Process("notepad");

  // Open the Font dialog
  p.Window("Notepad", "*").MainMenu.Click("Format|Font...");
  w = p.Window("#32770", "Font");

  // Search for all edit buttons in the Font dialog
  textBoxes = w.FindAll("WndClass", "Edit", 5).toArray();

  // Log the search results
  if (textBoxes.length > 0)
  {
    for (i = 0; i < textBoxes.length; i++)
      Log.Message("FullName: " + textBoxes[i].FullName + "\r\n" +
                  "Text: " + textBoxes[i].wText);
    Log.Message("Total number of found edit buttons: " + textBoxes.length);
  }
  else
    Log.Warning("No edit buttons found.");
}

Python

def FindEditbuttons():

  # Obtain the Notepad process
  p = Sys.Process("notepad")

  # Open the Font dialog
  p.Window("Notepad", "*").MainMenu.Click("Format|Font...")
  w = p.Window("#32770", "Font")

  # Search for all edit buttons in the Font dialog
  textBoxes = w.FindAllChildren("WndClass", "Edit", 5)

  # Log the search results
  if (len(textBoxes) > 0):
    for i in range (0, len(textBoxes)):
      Log.Message("FullName: " + textBoxes[i].FullName + "\r\n" +\
                  "Text: " + textBoxes[i].wText)
    Log.Message("Total number of found edit buttons: " + VarToStr(len(textBoxes)))
  else:
    Log.Warning("No edit buttons found.")

VBScript

Sub FindEditbuttons
  Dim p, w, textBoxes, i

  ' Obtain the Notepad process
  Set p = Sys.Process("notepad")

  ' Open the Font dialog
  p.Window("Notepad", "*").MainMenu.Click("Format|Font...")
  Set w = p.Window("#32770", "Font")

  ' Find all edit buttons in the Font dialog
  textBoxes = w.FindAll("WndClass", "Edit", 5)

  ' Log the search results
  If UBound(textBoxes) >= 0 Then
    For i = 0 To UBound(textBoxes)
      Log.Message("FullName: " & textBoxes(i).FullName & vbNewLine & _
                  "Text: " & textBoxes(i).wText)
    Next
    Log.Message("Total number of found edit buttons: " & (UBound(textBoxes) + 1))
  Else
    Log.Warning("No edit buttons found.")
  End If
End Sub

DelphiScript

procedure FindEditbuttons;
var p, w, textBoxes, i;
begin
  // Obtain the Notepad process
  p := Sys.Process('notepad');

  // Open the Font dialog
  p.Window('Notepad', '*').MainMenu.Click('Format|Font...');
  w := p.Window('#32770', 'Font');

  // Find all edit buttons in the Font dialog
  textBoxes := w.FindAll('WndClass', 'Edit', 5);

  // Log the search results
  if VarArrayHighBound(textBoxes, 1) >= 0 then
  begin
    for i := 0 to VarArrayHighBound(textBoxes, 1) do
      Log.Message('FullName: ' + textBoxes[i].FullName + #13#10 +
                  'Text: ' + textBoxes[i].wText);
    Log.Message('Total number of found edit buttons: ' + aqConvert.VarToStr(VarArrayHighBound(textBoxes, 1) + 1));
  end
  else
    Log.Warning('No edit buttons found.');
end;

C++Script, C#Script

function FindEditbuttons()
{
  var p, w, textBoxes, i;

  // Obtain the Notepad process
  p = Sys["Process"]("notepad");

  // Open the Font dialog
  p["Window"]("Notepad", "*")["MainMenu"]["Click"]("Format|Font...");
  w = p["Window"]("#32770", "Font");

  // Obtain all edit buttons in the Font dialog
  textBoxes = w["FindAll"]("WndClass", "Edit", 5)["toArray"]();

  // Log the search results
  if (textBoxes["length"] > 0)
  {
    for (i = 0; i < textBoxes["length"]; i++)
      Log["Message"]("FullName: " + textBoxes[i]["FullName"] + "\r\n" +
                  "Text: " + textBoxes[i]["wText"]);
    Log["Message"]("Total number of found edit buttons: " + textBoxes["length"]);
  }
  else
    Log["Warning"]("No edit buttons found.");
}

Below is a more complex example. It searches for all enabled buttons in Notepad’s Replace dialog (Notepad must be running). This example uses a multiple search condition: WndClass equals the “Button” and Enabled is equal to True. The PropNames and PropValues parameters of the FindAll method receive variant arrays containing the sought-for property names and values.

JavaScript

function FindEnabledButtons()
{
  var p, w, PropArray, ValuesArray, buttons;

  // Obtain the Notepad process
  p = Sys.Process("notepad");

  // Open the Replace dialog
  p.Window("Notepad", "*").MainMenu.Click("Edit|Replace...");
  w = p.Window("#32770", "Replace");

  // Specify the sought-for property names
  PropArray = new Array ("WndClass", "Enabled");
  // Specify the sought-for property values
  ValuesArray = new Array ("Button", true);

  // Find all enabled buttons in the Replace dialog
  buttons = w.FindAll(PropArray, ValuesArray, 5);

  // Log the search results
  if (buttons.length > 0)
  {
    for (let i = 0; i < buttons.length; i++)
      Log.Message(buttons[i].FullName);
    Log.Message("Total number of found enabled buttons: " + buttons.length)
  }
  else
    Log.Warning("No enabled buttons were found.");
}

JScript

function FindEnabledButtons()
{
  var p, w, PropArray, ValuesArray, buttons, i;

  // Obtain the Notepad process
  p = Sys.Process("notepad");

  // Open the Replace dialog
  p.Window("Notepad", "*").MainMenu.Click("Edit|Replace...");
  w = p.Window("#32770", "Replace");

  // Specify the sought-for property names
  PropArray = new Array ("WndClass", "Enabled");
  // Specify the sought-for property values
  ValuesArray = new Array ("Button", true);

  // Find all enabled buttons in the Replace dialog
  buttons = w.FindAll(PropArray, ValuesArray, 5).toArray();

  // Log the search results
  if (buttons.length > 0)
  {
    for (i = 0; i < buttons.length; i++)
      Log.Message(buttons[i].FullName);
    Log.Message("Total number of found enabled buttons: " + buttons.length)
  }
  else
    Log.Warning("No enabled buttons were found.");
}

Python

def FindEnabledButtons():

  # Obtain the Notepad process
  p = Sys.Process("notepad")

  # Open the Replace dialog
  p.Window("Notepad", "*").MainMenu.Click("Edit|Replace...")
  w = p.Window("#32770", "Replace")

  # Specify the sought-for property names 
  PropArray = ["WndClass", "Enabled"]
  # Specify the sought-for property values
  ValuesArray = ["Button", True]

  # Find all enabled buttons in the Replace dialog
  buttons = w.FindAllChildren(PropArray, ValuesArray, 5)

  # Log the search results
  if (len(buttons) > 0):
    for i in range (0, len(buttons)):
      Log.Message(buttons[i].FullName)
    Log.Message("Total number of found enabled buttons: " + VarToStr(len(buttons)))
  else:
    Log.Warning("No enabled buttons were found.")

VBScript

Sub FindEnabledButtons
  Dim p, w, buttons, i, PropArray, ValuesArray

  ' Obtain the Notepad process
  Set p = Sys.Process("notepad")

  ' Open the Replace dialog
  p.Window("Notepad", "*").MainMenu.Click("Edit|Replace...")
  Set w = p.Window("#32770", "Replace")

  ' Specify the sought-for property names
  PropArray = Array("WndClass", "Enabled")
  ' Specify the sought-for property values
  ValuesArray = Array("Button", True)

  ' Find all enabled buttons in the Replace dialog
  buttons = w.FindAll(PropArray, ValuesArray, 5)

  ' Log the search results
  If UBound(buttons) >= 0 Then
    For i = 0 To UBound(buttons)
      Log.Message(buttons(i).FullName)
    Next
    Log.Message("Total number of found enabled buttons: " & (UBound(buttons) + 1))
  Else
    Log.Warning("No enabled buttons were found.")
  End If
End Sub

DelphiScript

procedure FindEnabledButtons;
var p, w, PropArray, ValuesArray, buttons, i;
begin
  // Obtain the Notepad process
  p := Sys.Process('notepad');

  // Open the Replace dialog
  p.Window('Notepad', '*').MainMenu.Click('Edit|Replace...');
  w := p.Window('#32770', 'Replace');

  // Specify the sought-for property names
  PropArray := ['WndClass', 'Enabled'];
  // Specify the sought-for property values
  ValuesArray := ['Button', true];

  // Find all enabled buttons in the Replace dialog
  buttons := w.FindAll(PropArray, ValuesArray, 5);

  // Log the search results
  if VarArrayHighBound(buttons, 1) >= 0 then
  begin
    for i := 0 to VarArrayHighBound(buttons, 1) do
      Log.Message(buttons[i].FullName);
    Log.Message('Total number of found enabled buttons: ' + aqConvert.VarToStr(VarArrayHighBound(buttons, 1) + 1))
  end
  else
    Log.Warning('No enabled buttons were found.');
end;

C++Script, C#Script

function FindEnabledButtons()
{
  var p, w, PropArray, ValuesArray, buttons, i;

  // Obtain the Notepad process
  p = Sys["Process"]("notepad");

  // Open the Replace dialog
  p["Window"]("Notepad", "*")["MainMenu"]["Click"]("Edit|Replace...");
  w = p["Window"]("#32770", "Replace");

  // Specify the sought-for property names
  PropArray = new Array ("WndClass", "Enabled");
  // Specify the sought-for property values
  ValuesArray = new Array ("Button", true);

  // Find all enabled buttons in the Replace dialog
  buttons = w["FindAll"](PropArray, ValuesArray, 5)["toArray"]();

  // Log the search results
  if (buttons["length"] > 0)
  {
    for (i = 0; i < buttons["length"]; i++)
      Log["Message"](buttons[i]["FullName"]);
    Log["Message"]("Total number of found enabled buttons: " + buttons["length"])
  }
  else
    Log["Warning"]("No enabled buttons were found.");
}

See Also

FindChild Method
Find Method
FindAllChildren Method
FindId Method
Find Method
Child Method
WaitChild Method

Highlight search results