2

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

我在 EarlGrey 中无法做到但我可以在 XCTest 中做的一件事是随机选择一个元素。

例如,在 calendar 上,我可以使用 'identifier'collectionView查询所有s ,然后随机选择一天使用来获取索引,然后.collectionViewCellNSPredicate[XCUIElementQuery count]tap

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

如果我能详细说明,请告诉我,期待解决这个问题!

4

1 回答 1

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()];
于 2017-01-26T00:29:13.877 回答