EarlGrey
文件说_ _
You must narrow down the selection until it can uniquely identify a single UI element
我的 UI 上有三个 UIView,我需要检查使用grey_sufficientlyVisible()
断言的可见性。但是,除非我真的使用它们各自的可访问性标签来挑选每一个,否则我无法匹配所有这些。有没有办法匹配一组超级视图,或者我应该为每个视图创建单独的测试条件?
EarlGrey
文件说_ _
You must narrow down the selection until it can uniquely identify a single UI element
我的 UI 上有三个 UIView,我需要检查使用grey_sufficientlyVisible()
断言的可见性。但是,除非我真的使用它们各自的可访问性标签来挑选每一个,否则我无法匹配所有这些。有没有办法匹配一组超级视图,或者我应该为每个视图创建单独的测试条件?
通过说匹配器必须能够唯一地识别一个元素,EarlGrey 让做错事变得更加困难。想象一下,当多个元素匹配并断言它是否可见时无意中选择了错误的元素,然后发现错误的元素被检查了可见性......哎呀!
无论如何,您要完成的工作可以通过以下几种方式完成:
1)如果所有这些视图共享一个共同的父视图,那么您可以编写一个与父视图匹配的自定义匹配器,并编写一个迭代子视图的自定义断言,存储具有所需可访问性标签的视图,然后运行其中的每一个通过可见性匹配器查看。就像是:
for (UIView *view in matchedViews) {
GREYAssertTrue([grey_sufficientlyVisible() matches:view],
@"View %@ is not visible", view);
}
2) 或者,如果您不介意创建一种更复杂的技术来匹配多个视图,您可能可以从中创建一个可重用的函数,您可以执行类似于我为检查表视图是否具有的测试所做的事情带有可访问性标签“第 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()];
}
}
正如@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 ...
}