UIAutomation и XCTestCase: как дождаться активации кнопки

Я пишу тестовый пример UIAutomation, и мне нужно дождаться, когда пользователь будет активирован, прежде чем продолжить. Кажется, что нет хорошего способа проверить, чтобы кнопка изменилась на включенное состояние.

Лучше было ждать чего-то в пользовательском интерфейсе, прежде чем проверять его статус?

Ни диспетчер_после, ни NSTimer, похоже, не работают. Они просто блокируются, а затем терпят неудачу.

4 Solutions collect form web for “UIAutomation и XCTestCase: как дождаться активации кнопки”

На самом деле это довольно просто, если вы используете NSPredicates и ожидания. Вы даже можете установить значение тайм-аута. В этом примере показано, как это сделать с 5-секундным таймаутом.

let exists = NSPredicate(format:"enabled == true") expectationForPredicate(exists, evaluatedWithObject: app.tables.textFields["MY_FIELD_NAME"], handler: nil) waitForExpectationsWithTimeout(5, handler: nil) 

Лучший способ подождать и проверить элемент – это не функция delay() , а pushTimeout() . Apple рекомендует использовать вторую функцию. Вот пример кода:

 UIATarget.localTarget().pushTimeout(10) button.tap() UIATarget.localTarget().popTimeout() 

Apple будет многократно пытаться нажать кнопку и будет ждать до 10 секунд. Вот ссылка на документацию.

Ответ Murdock для старой системы тестирования JavaScript. Я в конце концов придумал это:

https://gist.github.com/briandw/59bf5a06afe8af67a690

 - (void)waitFor:(NSTimeInterval)seconds withExpectationBlock:(BOOL (^)())block { NSDate *timeoutDate = [[NSDate alloc] initWithTimeIntervalSinceNow:seconds]; while (YES) { if ([timeoutDate timeIntervalSinceNow] < 0 || !block()) { return; } [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; } } XCUIElement *nextButton = app.navigationBars[@"Title"].buttons[@"Next"]; XCTestExpectation *activationExpectation = [self expectationWithDescription:@"Waiting"]; [self waitFor:20.0 withExpectationBlock:^BOOL() { if (nextButton.exists && nextButton.enabled) { [activationExpectation fulfill]; return YES; } return NO; }]; 

Вы должны иметь возможность реализовать цикл while для проверки состояния, которое вы хотите (например, кнопка включена). Это остановит ход тестового теста до тех пор, пока не будет выполнено условие, и тесты будут продолжены. Постройте задержку для медленного опроса и убедитесь, что у вас есть тайм-аут, чтобы вы не застряли бесконечно.

Псевдокод :

 While (/*button is disabled*/) { if (/*timeout condition met*/) { /*handle error*/ break; } UIATarget.delay(<duration in seconds>); } 
  • iOS, блокировка устройства из кода
  • Cryptic NSInternalInconsistencyException при выполнении модульных тестов в Xcode 9 GM
  • Как установить XCTest для запуска на устройстве
  • Когда источники приложения должны быть включены в тестовые цели?
  • Использование необъявленной ошибки идентификатора в моем случае
  • Как запустить новую установку приложения каждый раз, когда выполняются модульные тесты?
  • Тест XCTest терпит неудачу, когда тестовый пример «не завершился», когда я NSLog из тестового примера
  • Как проверить простой класс объектов данных, который реализует NSCoding?
  • Ошибка тестирования пользовательского интерфейса - состояние приложения - XCApplicationStateRunningActive, а не XCApplicationStateNotRunning
  • Почему передача объекта NSString в параметр «format» XCTAssertTrue вызывает ошибку сборки?
  • XCTestCase waitForExpectationsWithTimeout: обработчик: бросает EXC_BAD_ACCESS, когда ожидание не выполняется
  • Interesting Posts

    Основные данные для предварительно загруженной информации

    Как сделать SKScene фиксированной шириной?

    Свойства IBOutlet nil после пользовательского представления, загруженного из xib

    обновить профиль Provisioning для push-уведомлений

    В App Purchase не изменяет свое состояние на SKPaymentTransactionStatePurchased

    Как обмениваться изображениями в Pinterest с использованием последней версии iOS SDK

    Существуют ли более чистые методы обработки асинхронных HTTP-запросов, чем делегирование в Objective-C?

    кодирование видео для циклирования?

    Как получить незанятое состояние приложения в IOS и Android?

    Реализовать методы анимации на основе блоков UIView с настраиваемой кривой ослабления

    Пользовательская ширина UILabel, основанная на длине текста, программно

    Огромный пик памяти – CGContextDrawImage

    CloudKit fetchRecordChangesOperation дает «AppDefaultZone не поддерживает семантику синхронизации»

    Подкласс NSTextStorage вызывает сбои в ссылке доступа

    Не удается удалить цель в Xcode 5

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.