在 EarlGrey 中随机选择

Randomly Selecting In EarlGrey

我正在使用 XCTest 编写非常复杂的 UI 测试,并且最近切换到 EarlGrey,因为它更快并且更可靠 - 测试不会在构建服务器和测试套件上随机失败运行 最多可能需要半小时!

有一件事我在 EarlGrey 中做不到,但我在 XCTest 中可以做,是随机 select 一个元素。

例如,在日历 collectionView 上,我可以使用 NSPredicate 查询所有具有 'identifier' 的 collectionViewCell,然后随机 select一天使用 [XCUIElementQuery count] 获取索引,然后 tap.

现在,我将对其进行硬编码,但我希望随机化日期 selection,这样我就不必在更改应用程序代码时重写测试。

能不能详细说说,期待解决!

第 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 使用 % 到 select 随机索引

NSUInteger randomIndex = arc4random() % count;

步骤 3 最后使用 atIndex: 到 select 那个随机元素并对其执行 action/assertion。

// 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()];