Тест пользовательского интерфейса завершается сбоем, когда он вводит текст в текстовое представление при запуске ботом Xcode

У меня есть следующий тест пользовательского интерфейса XCTest, который вводит текст в текстовое представление.

let textView = app.textViews.elementBoundByIndex(0)
textView.tap()
textView.typeText("Hello world")

При запуске в качестве бота Xcode отображается следующая ошибка для вызова typeText.

Утверждение: сбой тестирования пользовательского интерфейса - сбой: истекло время ожидания завершения ключевого события

введите описание изображения здесь

Интересно, что когда я запускаю его вручную из Xcode на том же компьютере, тест проходит. Этот тест также проходил в боте Xcode перед обновлением до Xcode 7.1/iOS 9.1. Что может быть источником проблемы?

Вот отдельная демонстрация с тестом пользовательского интерфейса: https://github.com/exchangegroup/UITestTextViewDemo

Симулятор iOS 9.1, OS X 10.11.1 (15B42), Xcode 7.1 (7B91b), OS X Server 5.0.15 (15S4033)

Сообщили в Apple.


person Evgenii    schedule 27.10.2015    source источник
comment
Apple что-то напортачила с обновлением XC7.1/iOS 9.1 для ботов. Наш зеленый набор тестов мгновенно превратился в красный. Сбой с этой ошибкой, тайм-аут ожидания снимка экрана или тайм-аут запуска сима. Очень надеюсь, что XC7.2 это исправит.   -  person juhan_h    schedule 28.10.2015
comment
Я вижу ту же проблему. Я не думаю, что у меня есть исправление, но я обнаружил, что если я «подожду» немного дольше, иногда тест будет пройден. Моя конкретная проблема связана с WKWebView, который имеет внутреннее редактируемое поле содержимого, но принцип здесь тот же. После «нажатия» на редактор я запускаю цикл ожидания: NSRunLoop.currentRunLoop().runUntilDate(NSDate(timeIntervalSinceNow: 3))   -  person Ravi Desai    schedule 06.11.2015
comment
что-то новое? у меня такая же проблема в xcode 7.3.1   -  person emoleumassi    schedule 08.08.2016


Ответы (6)


Я нашел решение для своего случая, и я надеюсь, что оно поможет и вам.

В моих setUp() и tearDown() (кажется избыточным, я знаю) я поставил XCUIApplication().terminate(). Это гарантирует, что приложение завершится перед запуском следующего теста, и, похоже, оно выполняет свою работу.

override func setUp() {
    XCUIApplication().terminate()
    super.setUp()
    continueAfterFailure = false
    XCUIApplication().launch()
}
override func tearDown() {
    super.tearDown()
    XCUIApplication().terminate()
}

Я сообщил об ошибке в Apple, но на данный момент это помогает мне обойти ошибку, которую вы видели. Надеюсь, это поможет!

person cakes88    schedule 11.11.2015

Я считаю, что основная проблема заключается в том, что «Подключение аппаратной клавиатуры» включено по умолчанию. Даже если вы отключите его для основного пользователя, пользователь _xcsbuildd по-прежнему будет использовать значение по умолчанию. Мне удалось решить проблему, добавив в схему предтестовое действие со следующим скриптом:

if [ `defaults read com.apple.iphonesimulator ConnectHardwareKeyboard` -eq 1 ]
 then
  defaults write com.apple.iphonesimulator ConnectHardwareKeyboard -bool false
  killall "Simulator"
fi

введите описание изображения здесь

person David Beck    schedule 18.02.2016
comment
Сценарий действительно полезен, мне всегда нужно помнить об отключении аппаратной клавиатуры при выполнении тестов на моей машине разработки. Я никогда не сталкивался с этой проблемой на сервере Xcode, но полезно просто убедиться, что он работает должным образом. - person Alessandro Orrù; 19.02.2016

Я нашел другое решение, поскольку то, что предложил Коннор, у меня не работало: у меня было много проблем с использованием UITest на Xcode Bot, и общий симптом заключался в том, что тестирование на симуляторе занимало намного больше времени, чем на локальном машине, поэтому я подумал, что пользователь _xcsbuildd, используемый для запуска тестов, каким-то образом замедлился.

Мое решение простое: просто сделайте пользователя _xcsbuildd «обычным» пользователем. У этого есть еще одно преимущество: если вы хотите, вы можете войти в систему с этим пользователем и увидеть, как тесты выполняются в симуляторе во время интеграции, поэтому его легче отлаживать!

Вот как я это сделал:

sudo dscl . -create /Users/_xcsbuildd UserShell /bin/bash
sudo dscl . -create /Users/_xcsbuildd FirstName Xcode
sudo dscl . -create /Users/_xcsbuildd LastName Server
sudo dscl . -create /Users/_xcsbuildd FullName "Xcode Server"
sudo dscl . -create /Users/_xcsbuildd PrimaryGroupID 20

Затем измените пароль с помощью:

sudo dscl . -passwd /Users/_xcsbuildd

Мне не удалось заставить пользователя отображаться в окне быстрого входа, в любом случае вы должны увидеть «другого пользователя», куда вы можете вставить имя пользователя «_xcsbuildd» и пароль, который вы выбрали.

person Alessandro Orrù    schedule 17.02.2016

Я тоже столкнулся с этой проблемой. Я написал тест пользовательского интерфейса для захвата снимков экрана с помощью Snapshot (fastlane), и он отлично работает на симуляторе iPad Air и Pro. Однако на симуляторе iPad Retina или iPad 2 я получаю это сообщение об ошибке либо из командной строки, либо непосредственно из Xcode.

В моем случае решением было добавить некоторые функции sleep() между операторами typeText(), и ошибка исчезла.

Редактировать: это исправляет только запуск вручную из Xcode, через командную строку это по-прежнему вызывает сбой теста. Я также заметил, что это работает на всех симуляторах для 64-битных устройств, но не на более ранних устройствах.

Изменить 2: я нашел способ обойти эту проблему, используя симулятор iOS 9.0 вместо iOS 9.3, как указано в этом ответе: https://stackoverflow.com/a/36334816/5334132. Это кажется хорошим обходным путем, пока он не будет исправлен в новой версии Xcode.

person Phontana    schedule 11.05.2016

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

Если эти две настройки отключены, я все еще получаю несколько случайных сбоев при тестировании пользовательского интерфейса. Однако подключение аппаратных мониторов или совместное использование экрана, чтобы симулятор отображался на экране где-то, похоже, решает эти проблемы.

person Chase Holland    schedule 01.06.2016

Я использую xcode 8.2.1 и запускаю тесты на версиях ios 9.3. Один простой хак — добавить сон на 2-5 секунд после нажатия на текстовое поле и перед вводом текста. Хотя это не постоянное решение.

ЕЩЕ НАДЕЖНОЕ РЕШЕНИЕ

Отмените все настройки клавиатуры в настройках перед запуском тестов.

"KeyboardAllowPaddle": false,
"KeyboardAssistant": false,
"KeyboardAutocapitalization": false,
"KeyboardAutocorrection": false,
"KeyboardCapsLock": false,
"KeyboardCheckSpelling": false,
"KeyboardPeriodShortcut": false,
"KeyboardPrediction": false,
"KeyboardShowPredictionBar": false
person Devansh Agarwal    schedule 15.05.2017