EarlGrey GREYCondition waitWithTimeout:15不等待15秒

时间:2016-05-30 15:09:21

标签: ios xctest ui-testing earlgrey

我写了一个应该在评估条件之前等待15秒的测试。它目前等待更短,并立即进入评估块,产生错误。之后的seconds参数: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. ");
}

这是Button按钮动作:

- (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秒后通过dispatch Async更改为“Delayed Appearance”。但测试中的阻挡很快就会发射,尽管它设置为15秒。 (并且因为没有找到具有此类文本的元素而失败)。

1 个答案:

答案 0 :(得分:2)

我认为这不是API的用意。 API用于等待满足X秒数的条件。超时中的秒参数是它应该等待条件满足的时间。如果当时仍未满足条件,则超时并返回NO。如果你真的只想等待15秒钟使用: [[NSRunLoop currentRunLoop] runUntilDate:]

而且,由于您正在使用dispatch_after,您可以增加dispatch_after调用的跟踪时间: [[GREYConfiguration sharedInstance] setValue:@(5.0) forConfigKey:kGREYConfigKeyDispatchAfterMaxTrackableDelay];

在您不再希望在将来拨打5.0秒后跟踪调度后,请记住将其重置为默认值。