EarlGrey GREYCondition waitWithTimeout:15 не ждет 15 секунд

Я написал тест, который должен ждать 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 секунды после отправки Async. Но блок в тесте срабатывает очень быстро, хотя и установлено на 15 секунд. (И терпит неудачу, потому что элемент с таким текстом не найден).


person FranticRock    schedule 30.05.2016    source источник
comment
Я обошел это, отключив синхронизацию в GREY API, например: [[GREYConfiguration sharedInstance] setValue:@(NO) forConfigKey:kGREYConfigKeySynchronizationEnabled]; Теперь он ждет полной суммы, которую я указал. Поэтому мне интересно, что заставляет его срабатывать раньше, когда включен API синхронизации....   -  person FranticRock    schedule 30.05.2016


Ответы (1)


Я не думаю, что это цель API. API предназначен для ожидания выполнения условия в течение X секунд. Параметр секунд в тайм-ауте показывает, как долго он действительно должен ждать выполнения условия. Если к тому времени условие все еще не выполнено, время ожидания истекает и возвращается NO. Если вы действительно хотите просто подождать 15 секунд, используйте: [[NSRunLoop currentRunLoop] runUntilDate:]

И, поскольку вы используете dispatch_after, вы можете увеличить отслеживаемое время вызовов dispatch_after: [[GREYConfiguration sharedInstance] setValue:@(5.0) forConfigKey:kGREYConfigKeyDispatchAfterMaxTrackableDelay];

Просто не забудьте сбросить его на значение по умолчанию, если вы больше не хотите отслеживать отправку после вызовов, которые в течение 5,0 секунд в будущем.

person khandpur    schedule 31.05.2016