I'd like to add borders to all buttons in the iOS simulator from my Mac app. First I get the simulator window. Then I access the children of all AXGroup and if it's a button or a static text, I add a border.
But for some buttons this does not work. In the example image the NavigationBarButtons are not found. I guess the problem is, that for some AXGroup the children array access with AXChildren is empty.
Here is some relevant code:
- (NSArray<DDHOverlayElement *> *)overlayChildrenOfUIElement:(AXUIElementRef)element index:(NSInteger)index {
    NSMutableArray<DDHOverlayElement *> *tempOverlayElements = [[NSMutableArray alloc] init];
    NSLog(@">>> -----------------------------------------------------");
    NSString *role = [UIElementUtilities roleOfUIElement:element];
    NSRect frame = [UIElementUtilities frameOfUIElement:element];
    NSLog(@"%@, role: %@, %@", element, role, [NSValue valueWithRect:frame]);
    NSArray *lineage = [UIElementUtilities lineageOfUIElement:element];
    NSLog(@"lineage: %@", lineage);
    NSArray<NSValue *> *children = [UIElementUtilities childrenOfUIElement:element];
    if (children.count < 1) {
        NSLog(@"NO CHILDREN");
    }
    for (NSInteger i = 0; i < [children count]; i++) {
        NSValue *child = children[i];
        AXUIElementRef uiElement = (__bridge AXUIElementRef)child;
        NSString *role = [UIElementUtilities roleOfUIElement:uiElement];
        NSRect frame = [UIElementUtilities frameOfUIElement:uiElement];
        NSLog(@"----%@, role: %@, %@", child, role, [NSValue valueWithRect:frame]);
    }
    NSLog(@"<<< -----------------------------------------------------");
    for (NSInteger i = 0; i < [children count]; i++) {
        NSValue *child = children[i];
        AXUIElementRef uiElement = (__bridge AXUIElementRef)child;
        NSString *role = [UIElementUtilities roleOfUIElement:uiElement];
        NSRect frame = [UIElementUtilities frameOfUIElement:uiElement];
        NSLog(@"%@, role: %@, %@", child, role, [NSValue valueWithRect:frame]);
        if ([role isEqualToString:@"AXButton"] ||
            [role isEqualToString:@"AXTextField"] ||
            [role isEqualToString:@"AXStaticText"]) {
            NSString *tag = [NSString stringWithFormat:@"%ld%ld", (long)index, (long)i];
            NSLog(@"tag: %@", tag);
            DDHOverlayElement *overlayElement = [[DDHOverlayElement alloc] initWithUIElementValue:child tag:tag];
            [tempOverlayElements addObject:overlayElement];
        } else if ([role isEqualToString:@"AXGroup"] ||
                   [role isEqualToString:@"AXToolbar"]) {
            [tempOverlayElements addObjectsFromArray:[self overlayChildrenOfUIElement:uiElement index:++index]];
        } else if ([role isEqualToString:@"AXWindow"]) {
            [self.overlayWindowController setFrame:[UIElementUtilities frameOfUIElement:uiElement]];
            [tempOverlayElements addObjectsFromArray:[self overlayChildrenOfUIElement:uiElement index:index]];
        }
    }
    return [tempOverlayElements copy];
}
For some AXGroup the children are found. For some they are empty. I cannot figure out why.
Does anyone have an idea what I'm doing wrong?