Introduction¶
When recording a testscript that opens the systemtray context-menu you will get different recordings depending on the current operating system.
On Linux/X11:import * as names from 'names.js'
function main() {
startApplication("systray");
sendEvent("QMouseEvent", waitForObject(names.QWidget), QEvent.MouseButtonPress, 15, 9, Qt.RightButton, 2, 0);
activateItem(waitForObjectItem(names.Systray_QMenu, "Quit"));
}
On Windows:import * as names from 'names.js'
function main() {
startApplication("systray");
mouseClick(waitForObject(names.Heart_Button), 11, 12, MouseButton.RightButton);
activateItem(waitForObjectItem(name.Systray_QMenu, "Quit"));
}
The code interacting with the tray-icon is platform-dependant and works on different objects ("names.Heart_Button
" vs "names.QWidget
"), something which is undesirable for testing cross-platform applications.
Solution¶
Replace the sendEvent
/ mouseClick
that opens the tray-icon context menu with something similar to the following:
function main() {
startApplication("systray");
// Fetch object:
trayIcon = waitForObject({"type": "QSystemTrayIcon", "unnamed": 1});
// Retrieve geometry:
trayCenter = trayIcon.geometry().center();
// Show context menu - variant #1:
trayMenu = trayIcon.contextMenu();
trayMenu.popup(trayCenter);
// Show context menu - variant #2:
//nativeMouseClick(trayCenter.x, trayCenter.y, MouseButton.RightButton);
activateItem(waitForObjectItem(names.Systray_QMenu, "Quit"));
}
This example makes use of the
QSystemTrayIcon
API which is cross-platform. It first tries to lookup the first QSystemTrayIcon
object in the application, fetches the context-menu assigned to the tray-icon followed by opening the context-menu at the current position of the tray-icon.
Alternatively you may use nativeMouseClick()
to achieve a replay that is closer to what a real user would do at the expensive of possible test-instabilities in case the tray-icon unexpectedly changes its position (i.e. appearance of new tray-icons from other applications)
Limitations¶
- The
QSystemTrayIcon
must have been created as a child of some object that can already be found within Squish (i.e. your main window).