Это мой случай:
let passwordSecureTextField = app.secureTextFields["password"]
passwordSecureTextField.tap()
passwordSecureTextField.typeText("wrong_password") //here is an error
UI Testing Failure - Ни элемент, ни потомок не имеют фокусировки на клавиатуре. Элемент:
Что случилось? Это нормально работает textFields
, но проблема возникает только с secureTextFields
. Есть обходные пути?
Ответы:
Эта проблема причиняла мне боль, но мне удалось найти правильное решение. В симуляторе убедитесь, что «Оборудование -> Клавиатура -> Подключить аппаратную клавиатуру» выключено.
источник
Недавно мы нашли хак, чтобы сделать решение из принятого ответа постоянным. Чтобы отключить настройку симулятора: «Оборудование -> Клавиатура -> Подключить аппаратную клавиатуру» из командной строки, необходимо написать:
Это не повлияет на работающий симулятор - вам нужно перезапустить симулятор или запустить новый, чтобы настройки вступили в силу.
источник
defaults write com.apple.iphonesimulator ConnectHardwareKeyboard -bool true
, но это та же самая концепция.killall "Simulator"; defaults write com.apple.iphonesimulator ConnectHardwareKeyboard 0;
Я написал небольшое расширение (Swift), которое идеально подходит для меня. Вот код:
Основная идея заключается в том, чтобы продолжать нажимать на элемент (текстовое поле) до того, как появится клавиатура.
источник
У Станислава правильная идея.
В командной среде вам нужно что-то, что будет работать автоматически. Я придумал исправить здесь на моем блоге.
В основном вы просто вставляете:
источник
Другой причиной этой ошибки является наличие родительского представления текстового поля, в которое вы пытаетесь ввести текст, который установлен как элемент доступности (
view.isAccessibilityElement = true
). В этом случае XCTest не может получить дескриптор подпредставления для ввода текста и возвращает ошибку.Дело не в том, что ни один элемент не имеет фокуса (как вы часто можете видеть клавиатуру вверх и мигающий курсор в UITextField), просто ни один элемент не может достичь фокуса. Я столкнулся с этим при попытке ввести текст в UISearchBar. Сама панель поиска не является текстовым полем, при установке его в качестве элемента доступности доступ к базовому UITextField был заблокирован. Чтобы решить эту проблему,
searchBar.accessibilityIdentifier = "My Identifier"
был установлен наUISearchBar
однакоisAccessibilityElement
не был установленtrue
. После этого протестируйте код вида:Работает
источник
Это происходило со мной много раз. Вы должны отключить аппаратное обеспечение клавиатуры и ту же раскладку, что и OSX в вашем симуляторе
Оборудование / Клавиатура (отключить все)
После этого программное обеспечение клавиатуры не исчезнет, и ваши тесты смогут набирать текст
источник
Используйте режим сна между запуском приложения и вводом данных в текстовые поля, например так:
В моем случае я продолжал получать эту ошибку каждый раз, и только это решение помогло мне.
источник
Это может помочь: я просто добавляю «касание» перед ошибкой; вот и все :)
источник
источник
Запишите случай, как хотите, с клавиатурой или без клавиатуры. Но перед игрой сделайте следующее.
Этот следующий параметр (подключить аппаратную клавиатуру) должен быть отключен во время воспроизведения теста.
источник
В моем случае это
Hardware -> Keyboard -> Connect Hardware Keyboard
-> Отключить не работает для меня.Но когда я последовал
1)
Hardware -> Keyboard -> Connect Hardware Keyboard
-> Включить и запустить приложение2)
Hardware -> Keyboard -> Connect Hardware Keyboard
-> Отключить .У меня сработало
источник
[Повторно комментируя комментарий Бартломея Семанчика, потому что он решил проблему для меня]
Мне нужно было сделать Simulator> Reset Contents and Settings в строке меню симулятора, чтобы это начало работать для меня.
источник
Иногда текстовые поля не реализуются как текстовые поля, или они заключены в другой элемент пользовательского интерфейса и не легко доступны. Вот работа вокруг:
источник
Ваша первая строка - это просто определение запроса , которое не означает, что
passwordSecureTextField
оно действительно существует.Ваша вторая строка будет динамически выполнять запрос и попытаться (повторно) связать запрос с элементом пользовательского интерфейса. Вы должны установить точку останова и убедиться, что найден один и только один элемент. Или просто используйте assert:
В противном случае все выглядит хорошо,
tap
должна быть видима клавиатура, а затемtypeText
просто должна работать. Журнал ошибок должен рассказать вам больше информации.источник
passwordSecureTextField
существуют. Я исправил проблему, но очистил память и снова переписал эти строки. Странно, но это сработало.tap
для меня, потребовалось некоторое время, чтобы понять это. Хорошая отладочная практика!Не перепутайте, проблема возникла из-за того, что вы записали время тестирования, в котором ваше приложение будет подключаться к аппаратной клавиатуре, а симулятор времени автоматического тестирования использует только программную клавиатуру. так что как решить эту проблему. Просто используйте программную клавиатуру на время записи. Вы можете увидеть магию.
источник
Проблема для меня была такой же, как и для Теда. На самом деле, если поле пароля будет выбрано после того, как поле входа в систему и аппаратное КБ включены, программная клавиатура будет отключена при втором нажатии поля, и это не относится к тестам пользовательского интерфейса.
После некоторого времени возни с AppleScript вот что я придумал (улучшения приветствуются):
tell application "Simulator" activate tell application "System Events" try tell process "Simulator" tell menu bar 1 tell menu bar item "Hardware" tell menu "Hardware" tell menu item "Keyboard" tell menu "Keyboard" set menuItem to menu item "Connect Hardware Keyboard" tell menu item "Connect Hardware Keyboard" set checkboxStatus to value of attribute "AXMenuItemMarkChar" of menuItem if checkboxStatus is equal to "✓" then click end if end tell end tell end tell end tell end tell end tell end tell on error tell application "System Preferences" activate set securityPane to pane id "com.apple.preference.security" tell securityPane to reveal anchor "Privacy_Accessibility" display dialog "Xcode needs Universal access to disable hardware keyboard during tests(otherwise tests may fail because of focus issues)" end tell end try end tell end tell
Создайте файл сценария с приведенным выше кодом и добавьте его к необходимым целям (возможно, только для целей тестирования пользовательского интерфейса, вы можете добавить аналогичный сценарий к целям разработки, чтобы повторно включить HW-клавиатуру во время разработки). Вы должны добавить
Run Script
фазу в фазы сборки и использовать ее следующим образом:osascript Path/To/Script/script_name.applescript
источник
Мы столкнулись с той же ошибкой при установке
accessibilityIdentifier
значения для пользовательского представления (UIStackView
подкласса), содержащегоUIControl
подпредставления. В этом случае XCTest не удалось получить фокус клавиатуры для дочерних элементов.Нашим решением было просто удалить
accessibilityIdentifier
из нашего родительского представления и установитьaccessibilityIdentifier
для подпредставлений через выделенные свойства.источник
Другой ответ, но для нас проблема заключалась в том, что представление было слишком близко к другому мнению, что распознаватель жестов на нем. Мы обнаружили, что нам нужно, чтобы изображение было не менее 20 пикселей (в нашем случае ниже). Буквально 15 не сработало, а 20 и более сработало. Это странно, я признаю, но у нас было несколько UITextViews, которые работали, и некоторые, которые не работали, и все находились под одним и тем же родителем и имели идентичное другое позиционирование (и, конечно, имена переменных). Клавиатура включена или выключена или что-то не имеет значения. Доступность показала поля. Мы перезагрузили наши компьютеры. Мы сделали чистые сборки. Свежий источник проверки.
источник
Что решило эту проблему для меня, так это добавив 1 секунду сна:
источник
Я столкнулся с этой проблемой и смог исправить ее в своем сценарии, взяв решение, опубликованное @AlexDenisov, и добавив его в свои предварительные действия для запуска и тестирования .
источник
Нет необходимости включать / выключать клавиатуру в I / O. Не используйте .typeText для secureTextField, просто используйте
Бонус: Вы получаете щелчок звука клавиатуры :)
источник
Наконец, я написал скрипт, который редактирует файл .plist симулятора и устанавливает для
ConnectHardwareKeyboard
свойства false значение для выбранного симулятора. Вы правильно поняли, это изменяет свойство для специально выбранного симулятора в словаре «DevicePreferences», а не редактирует глобальное свойство.Сначала создайте сценарий оболочки с именем disable-hardware-keyboard.sh со следующим содержимым. Вы можете поместить его в «YourProject / xyzUITests / Scripts /».
Теперь выполните следующие шаги, чтобы вызвать его, передав в качестве аргумента udid выбранного симулятора:
Скрипт внутри Test> Pre-actions:
Время проверить это:
источник
Была такая же проблема с Securetextfields. Опция подключения оборудования в моем симуляторе была, но все же столкнулась с проблемой. Наконец, это сработало для меня (Swift 3):
источник