【问题标题】:EarlGrey - How do I check if multiple objects are being shown on the screenEarlGrey - 如何检查屏幕上是否显示多个对象
【发布时间】:2016-02-17 04:36:44
【问题描述】:

EarlGrey 文档says

You must narrow down the selection until it can uniquely identify a single UI element

我的 UI 上有三个 UIView,我需要检查使用 grey_sufficientlyVisible() 断言的可见性。但是,除非我真的使用它们各自的可访问性标签来挑选每一个,否则我无法匹配所有这些。有没有办法匹配一组超级视图,或者我应该为每个视图创建单独的测试条件?

【问题讨论】:

    标签: ios testing functional-testing earlgrey


    【解决方案1】:

    通过说匹配器必须能够唯一地标识一个元素,EarlGrey 让做错事变得更加困难。想象一下,当多个元素匹配并断言它是否可见时无意中选择了错误的元素,然后发现错误的元素被检查了可见性......哎呀!

    无论如何,您可以通过以下几种方式完成您想要完成的工作:

    1) 如果所有这些视图共享一个共同的父视图,那么您可以编写一个在父视图上匹配的自定义匹配器,并编写一个迭代子视图的自定义断言,存储具有所需可访问性标签的视图,然后运行每个通过可见性匹配器查看这些个人视图。比如:

    for (UIView *view in matchedViews) {
      GREYAssertTrue([grey_sufficientlyVisible() matches:view],
                     @"View %@ is not visible", view);
    }
    

    2) 或者,如果您不介意创建一种更复杂的技术来匹配多个视图,您可能可以从中创建一个可重用的函数,您可以执行类似于我为测试所做的事情,该测试检查是否存在表格视图有五行,可访问性标签为“Row 1”:

    - (void)testThereAreThreeViewsWithRow1AsAccessibilityLabel {
      NSMutableArray *evaluatedElements = [[NSMutableArray alloc] init];
      __block bool considerForEvaluation = NO;
      MatchesBlock matchesBlock = ^BOOL(UIView *view) {
        if (considerForEvaluation) {
          if (![evaluatedElements containsObject:view]) {
            [evaluatedElements addObject:view];
            considerForEvaluation = NO;
            return YES;
          }
        }
        return NO;
      };
      DescribeToBlock describeToBlock = ^void(id<GREYDescription> description) {
        [description appendText:@"not in matched list"];
      };
      id<GREYMatcher> notAlreadyEvaluatedListMatcher =
          [GREYElementMatcherBlock matcherWithMatchesBlock:matchesBlock
                                          descriptionBlock:describeToBlock];
      id<GREYMatcher> viewMatcher =
          grey_allOf(grey_accessibilityLabel(@"Row 1"), notAlreadyEvaluatedListMatcher, nil);
      for (int i = 0; i < 5; i++) {
        considerForEvaluation = YES;
        [[EarlGrey selectElementWithMatcher:viewMatcher] assertWithMatcher:grey_sufficientlyVisible()];
      }
    }
    

    【讨论】:

      【解决方案2】:

      正如@khandpur 所提到的,让匹配器唯一地标识一个元素确实很有意义。但是我认为如果你真的不在乎找到了多少元素,那么有一种方法可以做到这一点。

      id<GREYMatcher> matcher = grey_allOf(grey_accessibilityID(your_identifier), // or to match certain class
                                           grey_sufficientlyVisible(),
                                           nil);
      NSError *error;
      [[EarlGrey selectElementWithMatcher:matcher] assertWithMatcher:grey_isNil(!visible) error:&error];
      if (!error) {
      
        // Only one element exists
      } else if ([error.domain isEqual:kGREYInteractionErrorDomain] &&
          error.code == kGREYInteractionElementNotFoundErrorCode) {
      
        // Element doesn’t exist
      } else if ([error.domain isEqual:kGREYInteractionErrorDomain] &&
                 error.code == kGREYInteractionMultipleElementsMatchedErrorCode) {
      
        // Multiple elements exist
        // your logic ...
      }
      

      【讨论】:

        猜你喜欢
        • 2020-05-02
        • 1970-01-01
        • 1970-01-01
        • 2020-06-21
        • 2012-11-26
        • 1970-01-01
        • 1970-01-01
        • 2020-02-09
        • 2021-07-16
        相关资源
        最近更新 更多