EarlGrey GREYCondition waitWithTimeout:15 不等待 15 秒
EarlGrey GREYCondition waitWithTimeout:15 does not wait for 15 seconds
我编写了一个测试,该测试应该等待 15 秒才能评估条件。它目前等待的时间要短得多,并立即进入评估块,产生错误。之后的秒参数:waitWithTimeout 似乎被忽略了。
我的测试代码:
- (void)testAsyncEvent {
[[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Button")]
performAction:grey_tap()];
// Wait for the main view controller to become the root view controller.
BOOL success = [[GREYCondition conditionWithName:@"Wait for label to change text"
block:^{
NSError *error;
[[EarlGrey selectElementWithMatcher:grey_text(@"Delayed Appearance")]
performAction:grey_tap()
error:&error];
if ([error.domain isEqual:kGREYInteractionErrorDomain] &&
error.code == kGREYInteractionElementNotFoundErrorCode) {
return NO;
}
return YES;
}] waitWithTimeout:15];
GREYAssertTrue(success, @"Label text should be changed after 5 seconds. ");
}
这是点击按钮的动作:
- (IBAction)buttonPressed:(id)sender
{
self.titleLabel.text = @"Button Pressed";
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 4 * NSEC_PER_SEC), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0),
^(void)
{
dispatch_async(dispatch_get_main_queue(), ^{
self.titleLabel.text = @"Delayed Appearance";
});
});
}
titleLabel 的文本应该在 4 秒后通过分派异步更改为 "Delayed Appearance"。但是测试中的块触发非常快,尽管它设置为 15 秒。 (并且失败,因为没有找到具有此类文本的元素)。
我不认为这是 API 的意图。 API 用于等待条件满足 X 秒。超时中的秒参数是真正应该等待条件满足的时间。如果届时仍不满足条件,则超时,return NO。如果您真的只想等待 15 秒,请使用:
[[NSRunLoop currentRunLoop] runUntilDate:]
而且,由于您使用的是 dispatch_after,您可以增加 dispatch_after 来电的跟踪时间:
[[GREYConfiguration sharedInstance] setValue:@(5.0)
forConfigKey:kGREYConfigKeyDispatchAfterMaxTrackableDelay];
如果您不再希望在未来 5.0 秒的呼叫后跟踪调度,请记住将其重置为默认值。
我编写了一个测试,该测试应该等待 15 秒才能评估条件。它目前等待的时间要短得多,并立即进入评估块,产生错误。之后的秒参数:waitWithTimeout 似乎被忽略了。
我的测试代码:
- (void)testAsyncEvent {
[[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Button")]
performAction:grey_tap()];
// Wait for the main view controller to become the root view controller.
BOOL success = [[GREYCondition conditionWithName:@"Wait for label to change text"
block:^{
NSError *error;
[[EarlGrey selectElementWithMatcher:grey_text(@"Delayed Appearance")]
performAction:grey_tap()
error:&error];
if ([error.domain isEqual:kGREYInteractionErrorDomain] &&
error.code == kGREYInteractionElementNotFoundErrorCode) {
return NO;
}
return YES;
}] waitWithTimeout:15];
GREYAssertTrue(success, @"Label text should be changed after 5 seconds. ");
}
这是点击按钮的动作:
- (IBAction)buttonPressed:(id)sender
{
self.titleLabel.text = @"Button Pressed";
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 4 * NSEC_PER_SEC), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0),
^(void)
{
dispatch_async(dispatch_get_main_queue(), ^{
self.titleLabel.text = @"Delayed Appearance";
});
});
}
titleLabel 的文本应该在 4 秒后通过分派异步更改为 "Delayed Appearance"。但是测试中的块触发非常快,尽管它设置为 15 秒。 (并且失败,因为没有找到具有此类文本的元素)。
我不认为这是 API 的意图。 API 用于等待条件满足 X 秒。超时中的秒参数是真正应该等待条件满足的时间。如果届时仍不满足条件,则超时,return NO。如果您真的只想等待 15 秒,请使用:
[[NSRunLoop currentRunLoop] runUntilDate:]
而且,由于您使用的是 dispatch_after,您可以增加 dispatch_after 来电的跟踪时间:
[[GREYConfiguration sharedInstance] setValue:@(5.0)
forConfigKey:kGREYConfigKeyDispatchAfterMaxTrackableDelay];
如果您不再希望在未来 5.0 秒的呼叫后跟踪调度,请记住将其重置为默认值。