在 EarlGrey 中随机选择

Posted

技术标签:

【中文标题】在 EarlGrey 中随机选择【英文标题】:Randomly Selecting In EarlGrey 【发布时间】:2017-01-25 23:39:14 【问题描述】:

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

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

例如,在日历collectionView 上,我可以使用NSPredicate 查询所有带有“标识符”的collectionViewCells,然后使用[XCUIElementQuery count] 随机选择一天以获取索引,然后@ 987654325@.

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

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

【问题讨论】:

你看过atIndex API吗?您应该能够执行以下操作: [[[EarlGrey selectElementWithMatcher:grey_accessibilityLabel(@"Collectio‌​nViewCell")] atIndex:0] assert:foo()]; 不幸的是,EarlGrey 没有提供匹配的元素数量,因此您将不得不使用其他方法来计算。 【参考方案1】:

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

【讨论】:

这太好了,非常感谢。几个问题,只是因为我真的很想明白这一点: 1.为什么我们return NO;在区块中?如果我们返回YES,该块将停止迭代元素? 2. 下面的这些行是否断言每个增加count 的元素都存在? NSError *unused; [[EarlGrey selectElementWithMatcher:countMatcher] assertWithMatcher:grey_notNil() error:&amp;unused]; 再次,这很棒,非常感谢。 另外,这个效果很好!最后一个问题:为什么不创建 NSError *unused 就无法运行,即使我们从未对错误采取任何措施? 你在 1: YES 会停止迭代。关于 2:这些行实际上触发了我们在上面创建的 countMatcher 的搜索,并且我们传递了一个错误对象以防止 EarlGrey 引发异常,即使 EarlGrey 语句失败,如果 count 为 0(因为我们是只关心在这里获取元素计数)。欢迎您!

以上是关于在 EarlGrey 中随机选择的主要内容,如果未能解决你的问题,请参考以下文章

如何在 EarlGrey 中使用 tapAtPoint

在 EarlGrey 中,等待元素出现的非轮询方式是啥?

EarlGrey 可以使用多个可访问性标签或文本

为啥需要从随机森林的数据中随机选择样本?

xquery 随机选择文件而不重复选择

用于在随机加权选择之间进行选择的惯用 Clojure