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>); } 
  • выполнитьTaskWithPathArgumentsTimeout в XCTest?
  • Тесты Xcode проходят изолированно, сбой при запуске с другими тестами
  • Тестирование iOS: dispatch_once вызывается дважды. Сначала в приложении, второй в тесте. Проблемы с наблюдателями
  • Как я могу рассчитать покрытие кода статической библиотеки в XCode 5, используя проект, который ссылается на эту статическую библиотеку?
  • Простой XCTest для UITest не работает постоянно?
  • Как я могу избежать исключения NSInternalInconsistencyException при нажатии на элементы пользовательского интерфейса с помощью XCTest?
  • Как я могу проверить HTTP-запрос и ответ с помощью NSURLSession в iOS 7.1?
  • XCTests являются flaky при запуске через командную строку или через jenkins
  • Файл "XXX-Swift.h" не найден в тестовом проекте
  • Почему я должен использовать отдельный тестовый узел для запуска XCTests и как мне это сделать?
  • Xcode 7 UI Testing: как отклонить ряд системных предупреждений в коде
  • Interesting Posts

    iOS: Как определить утечку из инструментов Xcode?

    iOS Swift Множественные размерные массивы – компиляция занимает много времени. Что я должен изменить?

    iOS симулятор сборки для Facebook утверждения утверждения аварии

    Остановка или воспроизведение AVAudioPlayer из другого класса – сбой приложений – Swift

    iOS: UITextView с пользовательскими сбоями NSTextStorage

    Копирование и вставка iOS

    Swift: добавление фотографии в пользовательский альбом

    Как использовать многопутевое обновление с REST API в Firebase? Ошибка 400

    Заменить символы (уникальные значения подстановочных знаков) в строке с другими символами

    Множественный выбор сегментов в UISegmentedControl

    В чем разница между оператором defer и заявлением прямо перед возвратом?

    Swift UIView: сделать путь всегда в конце пальца человека?

    Генерация кода Core Data не поддерживается для Swift 2.3

    Какой уровень использования памяти вызовет предупреждение памяти iOS?

    Firebase – эффективно проверять имя пользователя

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