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 _get_identical_items_index(item: BaseWrapper): top_item = item.top_level_parent() all_items = [ top_item, ] + top_item.descendants() identical = [] for one in all_items: if one.element_info.name == item.element_info.name: if one.element_info.automation_id == item.element_info.automation_id: if one.element_info.control_type == item.element_info.control_type: if one.element_info.control_id == item.element_info.control_id: identical.append(one) if len(identical) < 2: return None for index, one in enumerate(identical): if one.rectangle() == item.rectangle(): return index assert False
def __init__(self, control: BaseWrapper): self._container = control self._name = control.texts()[0] self._title = find_control(control, 'TabItem') self._callstacks = find_control(control, 'Pane', 'Callstacks', raise_on_failure=False) self._thread_states = find_control(control, 'Pane', 'ThreadState', raise_on_failure=False) self._tracepoints = find_control(control, 'Pane', 'Tracepoints', raise_on_failure=False) self._timers = find_control(control, 'Pane', 'Timers', raise_on_failure=False)
def find_control(parent: BaseWrapper, control_type, name=None, name_contains=None, auto_id_leaf=None, qt_class=None) -> BaseWrapper: """ 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. """ desc = parent.descendants(control_type=control_type) for elem in desc: if (not qt_class or elem.class_name() == qt_class) and \ (not name or elem.texts()[0] == name) and \ (not name_contains or name_contains in elem.texts()[0]) and \ (not auto_id_leaf or elem.automation_id().rsplit(".", 1)[-1]): return elem raise OrbitE2EError( 'Could not find element of type %s (name="%s", name_contains="%s", qt_class=%s)' % (control_type, name, name_contains, qt_class))
def _count_tabs(tab_control: BaseWrapper) -> int: return len(tab_control.children(control_type='TabItem'))