我正在使用XCTest编写非常复杂的UI测试,最近切换到EarlGrey,因为它更快,更可靠 - 测试不会在构建服务器上随机失败,测试套件可能需要一半时间小时跑!
我在EarlGrey中无法做到的一件事,就是我在XCTest中可以做的,是随机选择一个元素。
例如,在日历collectionView
上,我可以使用collectionViewCell
查询包含'标识符'的所有NSPredicate
,然后使用[XCUIElementQuery count]
随机选择一天获取索引,然后tap
。
现在,我要对它进行硬编码,但我希望随机选择日期选择,以便在更改应用程序代码时不必重写测试。
如果我能详细说明,请告诉我,期待解决这个问题!
答案 0 :(得分:4)
第1步编写一个匹配器,可以使用GREYElementMatcherBlock
计算匹配给定匹配器的元素:
- (NSUInteger)elementCountMatchingMatcher:(id<GREYMatcher>)matcher {
__block NSUInteger count = 0;
GREYElementMatcherBlock *countMatcher = [GREYElementMatcherBlock matcherWithMatchesBlock:^BOOL(id element) {
if ([matcher matches:element]) {
count += 1;
}
return NO; // return NO so EarlGrey continues to search.
} descriptionBlock:^(id<GREYDescription> description) {
// Pass
}];
NSError *unused;
[[EarlGrey selectElementWithMatcher:countMatcher] assertWithMatcher:grey_notNil() error:&unused];
return count;
}
第2步使用%
选择随机索引
NSUInteger randomIndex = arc4random() % count;
第3步最后使用atIndex:
选择随机元素并对其执行操作/断言。
// Count all UIView's
NSUInteger count = [self elementCountMatchingMatcher:grey_kindOfClass([UIView class])];
// Find a random index.
NSUInteger randIndex = arc4random() % count;
// Tap the random UIView
[[[EarlGrey selectElementWithMatcher:grey_kindOfClass([UIView class])]
atIndex:randIndex]
performAction:grey_tap()];