iOS UI中元素的lastSnapshot中子元素的属性测试始终为空,为什么?

问题描述:

我正在研究UI测试框架WebDriverAgent来自facebook。这非常棒,乐于助人。它几乎包含iOS UI测试的所有知识。iOS UI中元素的lastSnapshot中子元素的属性测试始终为空,为什么?

XCTest有许多未公开的类和属性。例如,XCUIElement有一个名为lastSnapshot属性,lastSnapshot还具有许多有用的特性,如标签标识符孩子pathDescription,等。问题如下:

孩子属性用于从某个元素中获取所有子元素,就像从视图中的子视图一样。但是,当我试图从元素的lastSnapshot中获取子项的值时,它始终为空。虽然我可以正确地得到其他属性的值,如标签,标识符,父母等,这让我困扰了好几天。这里的exapmle代码:

- (void)testExample { 
    XCUIApplication *app = [[XCUIApplication alloc] init]; 
    XCUIElement *windowElement = [app.windows elementBoundByIndex:2]; 
    XCUIElement *statusBarElement = [windowElement.query elementBoundByIndex:0]; 
    XCUIElement *otherElement = [statusBarElement.query elementBoundByIndex:1]; 
    XCUIElement *timeElement = [otherElement.query elementBoundByIndex:2]; 

    [timeElement query]; 
    [timeElement resolve]; 
    NSLog(@"lastSnapshot = %@", timeElement.lastSnapshot); 
    NSLog(@"children = %@", timeElement.lastSnapshot.children); 
} 
+0

在研究WebDriverAgent之前,我使用了一个XCUIElement类来递归元素树: –

STUDING WebDriverAgent之前,我用XCUIElement的一类递归元素树:

- (XCUIElementNode *)recursiveUIElementsWithLevel:(NSInteger)elementLevel { 
    XCUIElementNode *node = [XCUIElementNode new]; 
    node.elementLevel = elementLevel; 
    node.elementValue = self; 
    NSArray *arrayNotIncludeSelf = [self recursiveUIElementsNotIncludeSelfWithLevel:elementLevel]; 
    node.subNodes = [NSMutableArray arrayWithArray:arrayNotIncludeSelf]; 

    return node; 
} 

- (NSArray *)recursiveUIElementsNotIncludeSelfWithLevel:(NSInteger)elementLevel { 
    NSMutableArray *elementArray = [NSMutableArray new]; 

    XCUIElementQuery *childrenQuery = [self childrenMatchingType:XCUIElementTypeAny]; 

    for (NSUInteger elementIndex = 0; elementIndex < childrenQuery.count; elementIndex ++) { 
     XCUIElement *element = [childrenQuery elementBoundByIndex:elementIndex]; 
     XCUIElementNode *subNode = [XCUIElementNode new]; 
     subNode.elementLevel = elementLevel + 1; 
     subNode.elementValue = element; 
     subNode.subNodes = [NSMutableArray arrayWithArray:[element recursiveUIElementsNotIncludeSelfWithLevel:subNode.elementLevel]]; 
     [elementArray addObject:subNode]; 
    } 

    return [NSArray arrayWithArray:elementArray]; 
} 

它通过这种方式doese工作,但递归遍历经验需要很多时间不能被接受。

+0

如果升级到Xcode 9和iOS 11模拟器,查询时间已经过优化,因此快照和重复遍历不再那么慢。 – Oletha

+0

我在升级到Xcode 9和iOS 11模拟器后再次尝试,它仍然非常缓慢地通过childrenMatchingType类遍历子元素: –