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);
}
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工作,但递归遍历经验需要很多时间不能被接受。
如果升级到Xcode 9和iOS 11模拟器,查询时间已经过优化,因此快照和重复遍历不再那么慢。 – Oletha
我在升级到Xcode 9和iOS 11模拟器后再次尝试,它仍然非常缓慢地通过childrenMatchingType类遍历子元素: –
在研究WebDriverAgent之前,我使用了一个XCUIElement类来递归元素树: –