diff --git a/tests/system/shared/utils.py b/tests/system/shared/utils.py
index e16c1842ed7b18c410150c3a746c478b0600dd49..468d5eef16e4f404aba1629e729aa20a0b320d75 100644
--- a/tests/system/shared/utils.py
+++ b/tests/system/shared/utils.py
@@ -52,19 +52,28 @@ def verifyChecked(objectName):
     return object
 
 def ensureChecked(objectName, shouldBeChecked = True, timeout=20000):
-    object = waitForObject(objectName, timeout)
-    # synchronize to avoid false positives
-    waitFor('object.checked == shouldBeChecked', 1000)
-    if object.checked ^ shouldBeChecked:
-        clickButton(object)
     if shouldBeChecked:
+        targetState = Qt.Checked
         state = "checked"
     else:
+        targetState = Qt.Unchecked
         state = "unchecked"
+    widget = waitForObject(objectName, timeout)
+    try:
+        # needed for transition Qt::PartiallyChecked -> Qt::Checked -> Qt::Unchecked
+        clicked = 0
+        while not waitFor('widget.checkState() == targetState', 1000) and clicked < 2:
+            clickButton(widget)
+            clicked += 1
+        test.verify(waitFor("widget.checkState() == targetState", 1000))
+    except:
+        # widgets not derived from QCheckbox don't have checkState()
+        if not waitFor('widget.checked == shouldBeChecked', 1000):
+            clickButton(widget)
+        test.verify(waitFor("widget.checked == shouldBeChecked", 1000))
     test.log("New state for QCheckBox: %s" % state,
              str(objectName))
-    test.verify(waitFor("object.checked == shouldBeChecked", 1000))
-    return object
+    return widget
 
 # verify that an object is in an expected enable state. Returns the object.
 # param objectSpec  specifies the object to check. It can either be a string determining an object