Skip to main content

Automating alternate menus with Squish for Mac

The menus on macOS allow for a menu item to have an alternate version: if you press the "Option" key with an open menu, you see the alternate versions and can select them. For example the Squish addressbook example app has a menu item "Bring All to Front" in the "Window" menu.

Normal "Window" menu with "Bring All to Front" menu item The normal "Window" menu.

And if you press the "Option" key, then this changes to "Arrange in Front".

The "Window" menu when "Option" key is pressed with "Arrange in Front" menu item The alternate "Window" menu when the "Option" key is pressed.

Automating the activation of the "Arrange in Front" menu item is possible, but there is one small gotcha: when you record the activation of this menu by clicking the "Window" menu, pressing the "Option" key and then clicking on the "Arrange in Front" menu item, you end up with the following script:
[code language="python"]# -*- coding: utf-8 -*-

def main():
startApplication("SquishAddressBook")
waitForObject(":Window_NSMenuItem")
activateItem(":Window_NSMenuItem")
waitForObject(":Arrange in Front_NSMenuItem")
activateItem(":Arrange in Front_NSMenuItem")[/code]
If you play back this script, it fails with the error

LookupError: Object ':Arrange in Front_NSMenuItem' not found.

This is because Squish did not record the pressing of the "Option". So let's fix this by adding the necessary script statements for pressing and releasing the "Option" key (which is also labelled "Alt" and which is the name used in the Squish script):
[code language="python" highlight="7,10"]# -*- coding: utf-8 -*-

def main():
startApplication("SquishAddressBook")
waitForObject(":Window_NSMenuItem")
activateItem(":Window_NSMenuItem")
keyPress("<Alt>")
waitForObject(":Arrange in Front_NSMenuItem")
activateItem(":Arrange in Front_NSMenuItem")
keyRelease("<Alt>")[/code]
And if we play back this test now, Squish activates the alternate menu item as expected.

Comments

    The Qt Company acquired froglogic GmbH in order to bring the functionality of their market-leading automated testing suite of tools to our comprehensive quality assurance offering.