Selecting Items From Drop-Down Menus in Desktop Windows Applications

Applies to TestComplete 15.47, last modified on January 20, 2023

Besides standard push buttons, toolbars can contain drop-down buttons that display a menu or a popup window when clicked. Examples of such buttons are the Back, Forward and Views buttons on Windows Explorer toolbar. Usually, these buttons have an attached down arrow, however this is not necessary (for example, the Explorer’s Views button does not have an arrow). Depending on the button type, the popup menu is invoked upon clicking the button’s arrow, or the button itself.

While testing toolbar controls, you can use specific properties and methods of the corresponding program object to perform certain actions and obtain data stored in controls. You can call these methods and properties from your keyword tests, as well as from scripts. This topic describes how to work with the needed properties and methods from your scripts. However, when testing a control from your keyword test, you can use the same methods and properties calling them from keyword test operations. For more information, see Keyword Tests Basic Operations.

To check whether a button has a toolbar button or a popup menu, you can use the wIsDropDownButton property of the Win32ToolBar, StripToolBar and WPFToolBar objects. If you need to simulate a selection of drop-down menu items, you should write a script that performs the following actions:

  • Simulates a click on the toolbar button (this step is unnecessary if the tested application uses ToolStrip toolbars).
  • Obtains the Menu corresponding to the popup menu.
  • Selects the desired item from the menu.

The implementation of these steps is different for different toolbar types. Detailed information is provided in the sections below.

Win32 and WPF Toolbars

If your tested application is a Win32 or a WPF application and it uses standard toolbars, then in order to access the button’s popup menu you should first invoke it. In tests, you can do this using the ClickItem or ClickItemXY actions of the Win32ToolBar or WPFToolBar object. The ClickItem action can be used to click buttons that do not have an attached arrow; whereas ClickItemXY let you click on the arrow area of split buttons.

The ClickItemXY action requires you to know the down arrow coordinates within the button. You can determine them by recording a click on the arrow. Note however, that the toolbar look can change from one application run to another. For example, toolbars can be configured so that they display small or large buttons, show text labels under buttons, and so on. Since the arrow coordinates within the button can be different in different toolbar looks, a test recorded with one toolbar look may not work for another look. If you want to create a stable test that is independent on the toolbar look, you can determine the button’s arrow coordinates at run time using the wButtonBounds property (we will implement this approach in the script below).

After the button’s popup menu is displayed, you can access it using the PopupMenu property of the toolbar object. This property returns a Menu object that provides scripting access to the button’s menu. You can work with this menu using methods and properties of the obtained Menu object. For example, you can select menu items using the Menu.Click method, determine the items count using the Menu.Count property, and so on. For more information on how you can work with menu controls from your tests, see Working With Menus in Desktop Windows Applications.

The following example demonstrates how you can work with various kinds of drop-down buttons on a Windows Explorer toolbar.

JavaScript, JScript

function Main ()
{
  var p, w, ToolBar, btnBounds, x, y;

  // Open My Computer
  WshShell.Run("explorer.exe /select,C:\\", SW_SHOWNORMAL);

  // Obtain the Explorer process, window and toolbar
  p = Sys.Process("Explorer");
  w = p.Window("*WClass", "My Computer");
  ToolBar = w.Window("WorkerW", "", 1).Window("ReBarWindow32").Window("ToolbarWindow32", "", 1);

  // Open drive C:
  w.Window("SHELLDLL_DefView").Window("DUIViewWndClassName").Window("DirectUIHWND").Window("CtrlNotifySink").Window("SysListView32", "FolderView").DblClickItem("*C:*");

  // Select the Details view
  ToolBar.ClickItem("Views");
  ToolBar.PopupMenu.Click("Details");

  // Go back to the list of drives
  btnBounds = ToolBar.wButtonBounds("Back");
  x = btnBounds.Right - 1;
  y = (btnBounds.Top + btnBounds.Bottom) / 2;
  ToolBar.ClickItemXY("Back", x, y);
  ToolBar.PopupMenu.Click("My Computer");
}

Python

def Main():

  # Open My Computer
  WshShell.Run("explorer.exe /select,C:\\", SW_SHOWNORMAL)

  # Obtain the Explorer process, window and toolbar 
  p = Sys.Process("Explorer")
  w = p.Window("*WClass", "My Computer")
  ToolBar = w.Window("WorkerW", "", 1).Window("ReBarWindow32").Window("ToolbarWindow32", "", 1)

  # Open drive C:
  w.Window("SHELLDLL_DefView").Window("DUIViewWndClassName").Window("DirectUIHWND").Window("CtrlNotifySink").Window("SysListView32", "FolderView").DblClickItem("*C:*")

  # Select the Details view
  ToolBar.ClickItem("Views")
  ToolBar.PopupMenu.Click("Details")

  # Go back to the list of drives
  btnBounds = ToolBar.wButtonBounds("Back")
  x = btnBounds.Right - 1
  y = (btnBounds.Top + btnBounds.Bottom) / 2
  ToolBar.ClickItemXY("Back", x, y)
  ToolBar.PopupMenu.Click("My Computer")

VBScript

Sub Main
  Dim p, w, ToolBar, btnBounds, x, y

  ' Open My Computer
  Call WshShell.Run("explorer.exe /select,C:\\", SW_SHOWNORMAL)

  ' Obtain the Explorer process, window and toolbar
  Set p = Sys.Process("Explorer")
  Set w = p.Window("*WClass", "My Computer")
  Set ToolBar = w.Window("WorkerW", "", 1).Window("ReBarWindow32").Window("ToolbarWindow32", "", 1)

  ' Open drive C:
  w.Window("SHELLDLL_DefView").Window("DUIViewWndClassName").Window("DirectUIHWND").Window("CtrlNotifySink").Window("SysListView32", "FolderView").DblClickItem("*C:*")

  ' Select the Details view
  ToolBar.ClickItem("Views")
  ToolBar.PopupMenu.Click("Details")

  ' Go back to the list of drives
  Set btnBounds = ToolBar.wButtonBounds("Back")
  x = btnBounds.Right - 1
  y = (btnBounds.Top + btnBounds.Bottom) / 2
  Call ToolBar.ClickItemXY("Back", x, y)
  ToolBar.PopupMenu.Click("My Computer")
End Sub

DelphiScript

procedure Main;
var p, w, ToolBar, btnBounds, x, y : OleVariant;
begin
  // Open My Computer
  WshShell.Run('explorer.exe /select,C:\', SW_SHOWNORMAL);

  // Obtain the Explorer process, window and toolbar
  p := Sys.Process('Explorer');
  w := p.Window('*WClass', 'My Computer');
  ToolBar := w.Window('WorkerW', '', 1).Window('ReBarWindow32').Window('ToolbarWindow32', '', 1);

  // Open drive C:
  w.Window('SHELLDLL_DefView').Window('DUIViewWndClassName').Window('DirectUIHWND').Window('CtrlNotifySink').Window('SysListView32', 'FolderView').DblClickItem('*C:*');

  // Select the Details view
  ToolBar.ClickItem('Views');
  ToolBar.PopupMenu.Click('Details');

  // Go back to the list of drives
  btnBounds := ToolBar.wButtonBounds['Back'];
  x := btnBounds.Right - 1;
  y := (btnBounds.Top + btnBounds.Bottom) / 2;
  ToolBar.ClickItemXY('Back', x, y);
  ToolBar.PopupMenu.Click('My Computer');
end;

C++Script, C#Script

function Main ()
{
  var p, w, ToolBar, btnBounds, x, y;

  // Open My Computer
  WshShell["Run"]("explorer.exe /select,C:\\", SW_SHOWNORMAL);

  // Obtain the Explorer process, window and toolbar
  p = Sys["Process"]("Explorer");
  w = p["Window"]("*WClass", "My Computer");
  ToolBar = w["Window"]("WorkerW", "", 1)["Window"]("ReBarWindow32")["Window"]("ToolbarWindow32", "", 1);

  // Open drive C:
  w["Window"]("SHELLDLL_DefView")["Window"]("DUIViewWndClassName")["Window"]("DirectUIHWND")["Window"]("CtrlNotifySink")["Window"]("SysListView32", "FolderView")["DblClickItem"]("*C:*");

  // Select the Details view
  ToolBar["ClickItem"]("Views");
  ToolBar["PopupMenu"]["Click"]("Details");

  // Go back to the list of drives
  btnBounds = ToolBar["wButtonBounds"]("Back");
  x = btnBounds["Right"] - 1;
  y = (btnBounds["Top"] + btnBounds["Bottom"]) / 2;
  ToolBar["ClickItemXY"]("Back", x, y);
  ToolBar["PopupMenu"]["Click"]("My Computer");
}

ToolStrip Toolbars

If your tested application is a .NET application and it uses ToolStrip toolbars, selecting items is a lot easier. This is mostly because the first step -- simulating a toolbar button click -- is unnecessary, since TestComplete can access and work with the button’s popup menu even if it not displayed on screen. To access the Menu object corresponding to the popup menu of a specific button, use the StripToolBar.wDropDownMenu property. After having obtained the Menu object, you can perform the desired action of the popup menu (for more information, see Working With Menus in Desktop Windows Applications). For instance, you can select items from the popup menu using the following statement:

toolBarObj.wDropDownMenu(Button).Click(MenuItem)

Here, toolBarObj is a StripToolBar object that corresponds to the tested ToolStrip toolbar; Button is the caption or index of a toolbar button that has the popup menu, and MenuItem is the caption or index of the desired item in the popup menu.

See Also

Working With Toolbars in Desktop Windows Applications
wIsDropDownButton Property (ToolBar Controls)
wIsDropDownButton Property (Specific to Win32, MFC ToolBar and MFC MenuBar Controls)
PopupMenu Property (Window Objects)
wDropDownMenu Property (ToolBar Controls)
Working With Menus in Desktop Windows Applications

Highlight search results