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

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

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

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

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

enter image description here

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

вот изолированная демонстрация с тестом UI: https://github.com/exchangegroup/UITestTextViewDemo

iOS 9.1 Simulator, OS X 10.11.1 (15B42), Xcode 7.1 (7B91b), OS X Server 5.0.15 (15S4033)

сообщается в Apple.

6 ответов


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

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

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

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


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

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

enter image description here


я обнаружил другое решение, так как предложенное Коннором не работало для меня: у меня было много проблем с использованием 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" и пароль, который вы выбрали


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

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

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

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


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

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


Я использую 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