def find_control(parent: BaseWrapper, control_type=None, name=None, name_contains=None, auto_id_leaf=None, qt_class=None, recurse=True, raise_on_failure=True) -> BaseWrapper or None: """ Returns the first child of BaseWrapper that matches all of the search parameters. As soon as a matching child is encountered, this function returns. If no child is found, an exception is thrown. """ if not recurse: desc = parent.children(control_type=control_type) else: desc = parent.descendants(control_type=control_type) for elem in desc: # This seems to be a lot more reliable than the properties exposed by the wrapper element # At least, this seems to consistently return the accessible name if it exists... elem_name = elem.element_info.element.CurrentName elem_text = elem.texts()[0] if elem.texts() else "" if (not qt_class or elem.class_name() == qt_class) and \ (not name or elem_text == name or elem_name == name) and \ (not name_contains or name_contains in elem_text or name_contains in elem_name) and \ (not auto_id_leaf or elem.automation_id().rsplit(".", 1)[-1]): return elem if raise_on_failure: raise OrbitE2EError('Could not find element of type %s (name="%s", name_contains="%s", qt_class="%s", recurse=%s).' % (control_type, name, name_contains, qt_class, recurse)) else: return None
def _count_tabs(tab_control: BaseWrapper) -> int: return len(tab_control.children(control_type='TabItem'))