it-swarm.com.ru

Сбой тестирования пользовательского интерфейса - ни элемент, ни какой-либо его потомок не имеют фокус клавиатуры на secureTextField

Это мой случай:

let passwordSecureTextField = app.secureTextFields["password"]
passwordSecureTextField.tap()
passwordSecureTextField.typeText("wrong_password") //here is an error

UI Testing Failure - Ни элемент, ни какой-либо потомок не имеют фокуса клавиатуры. Элемент:

Что случилось? Это работает хорошо для обычного textFields, но проблема возникает только с secureTextFields. Есть обходные пути?

87
Bartłomiej Semańczyk

Эта проблема причинила мне боль, но мне удалось найти правильное решение. В симуляторе убедитесь, что «Оборудование -> Клавиатура -> Подключить аппаратную клавиатуру» выключено.

163
Ted Kaminski

Недавно мы нашли хак, чтобы сделать решение из принятого ответа постоянным. Чтобы отключить настройку симулятора: «Оборудование -> Клавиатура -> Подключить аппаратную клавиатуру» из командной строки необходимо написать:

defaults write com.Apple.iphonesimulator ConnectHardwareKeyboard 0

Это не повлияет на работающий симулятор - вам нужно перезапустить симулятор или запустить новый, чтобы настройки вступили в силу.

14
AlexDenisov

Я написал небольшое расширение (Swift), которое идеально подходит для меня . Вот код:

extension XCTestCase {

    func tapElementAndWaitForKeyboardToAppear(element: XCUIElement) {
        let keyboard = XCUIApplication().keyboards.element
        while (true) {
            element.tap()
            if keyboard.exists {
                break;
            }
            NSRunLoop.currentRunLoop().runUntilDate(NSDate(timeIntervalSinceNow: 0.5))
        }
    }
}

Основная идея состоит в том, чтобы продолжать нажимать на элемент (текстовое поле) до того, как появится клавиатура.

13
berezhnyi oleksandr

У Станислава правильная идея. 

В командной среде вам нужно что-то, что будет работать автоматически. Я нашел исправление здесь в моем блоге.

В основном вы просто вставляете:

UIPasteboard.generalPasteboard().string = "Their password"
let passwordSecureTextField = app.secureTextFields["password"]
passwordSecureTextField.pressForDuration(1.1)
app.menuItems["Paste"].tap()
11
RyanPliske
func pasteTextFieldText(app:XCUIApplication, element:XCUIElement, value:String, clearText:Bool) {
    // Get the password into the pasteboard buffer
    UIPasteboard.generalPasteboard().string = value

    // Bring up the popup menu on the password field
    element.tap()

    if clearText {
        element.buttons["Clear text"].tap()
    }

    element.doubleTap()

    // Tap the Paste button to input the password
    app.menuItems["Paste"].tap()
}
4
Anthony

Другая причина этой ошибки - наличие родительского представления текстового поля, в которое вы пытаетесь ввести текст, который задан как элемент доступности (view.isAccessibilityElement = true). В этом случае XCTest не может получить дескриптор подпредставления для ввода текста и возвращает ошибку.

UI Testing Failure - Ни у элемента, ни у любого потомка нет клавиатуры фокус.

Дело не в том, что ни один элемент не имеет фокуса (как вы часто можете видеть клавиатуру вверх и мигающий курсор в UITextField), просто нет того, что ни один элемент он не может достичь не имеет фокуса. Я столкнулся с этим при попытке ввести текст в UISearchBar. Сама панель поиска не является текстовым полем, при установке его в качестве элемента доступности доступ к базовому UITextField был заблокирован. Чтобы решить эту проблему, searchBar.accessibilityIdentifier = "My Identifier" был установлен на UISearchBar, однако isAccessibilityElement не был установлен на true. После этого протестируйте код вида:

app.otherElements["My Identifier"].tap()
app.otherElements["My Identifier"].typeText("sample text")

Работает

4
user3847320

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

Оборудование/Клавиатура (отключить все)

После этого программное обеспечение клавиатуры не исчезнет, ​​и ваши тесты смогут набирать текст

 Disable Hardware

4
Fernando Martínez

Используйте режим сна между запуском приложения и вводом данных в текстовые поля, например так:

sleep(2)

В моем случае я продолжал получать эту ошибку каждый раз, и только это решение помогло мне.

4
Kingalione

Это может помочь: я просто добавляю «касание» перед ошибкой; это все :)

[app.textFields[@"theTitle"] tap];
[app.textFields[@"theTitle"] typeText:@"kk"];
3
Carlos Peralta

Запишите случай, как хотите, с клавиатурой или без клавиатуры . Но перед игрой в тест выполните следующее.

Этот следующий параметр (подключить аппаратную клавиатуру) должен быть отключен во время воспроизведения теста.

 enter image description here

3
umairhhhs

[Reposting Bartłomiej Semańczyk комментарий как ответ, потому что это решило проблему для меня]

Мне нужно было выполнить Simulator> Reset Contents and Settings в строке меню симулятора, чтобы это начало работать для меня.

2
rogueleaderr

Другой ответ, но для нас проблема заключалась в том, что представление было слишком близко к другому мнению, что распознаватель жестов на нем. Мы обнаружили, что нам нужно, чтобы изображение было не менее 20 пикселей (в нашем случае ниже). Буквально 15 не сработало, а 20 и более сработало. Это странно, я признаю, но у нас было несколько UITextViews, которые работали, и некоторые, которые не работали, и все находились под одним и тем же родителем и имели идентичное другое позиционирование (и, конечно, имена переменных). Клавиатура включена или выключена или что-то не имеет значения. Доступность показала поля. Мы перезапустили наши компьютеры. Мы сделали чистые сборки. Свежий источник проверки. 

0
David J

Проблема для меня была такой же, как и для Теда. На самом деле, если поле пароля будет выбрано после того, как поле входа в систему и аппаратное КБ включены, программная клавиатура будет отключена при втором нажатии поля, и это не относится к тестам пользовательского интерфейса.

После некоторого времени возни с 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

Создайте файл сценария с приведенным выше кодом и добавьте его к необходимым целям (возможно, цель тестирования UI, возможно, вы захотите добавить аналогичный сценарий к вашим целям разработки для повторного включения HW-клавиатуры во время разработки) . Вы должны добавить фазу Run Script в этапы сборки и использовать его так: osascript Path/To/Script/script_name.applescript

0
Timur Kuchkarov

Иногда текстовые поля не реализуются как текстовые поля, или они заключены в другой элемент пользовательского интерфейса и не легко доступны. Вот работа вокруг:

//XCUIApplication().scrollViews.otherElements.staticTexts["Email"] the locator for the element
RegistrationScreenStep1of2.emailTextField.tap()
let keys = app.keys
 keys["p"].tap() //type the keys that you need
 
 //If you stored your data somewhere and need to access that string //you can cats your string to an array and then pass the index //number to key[]
 
 let newUserEmail = Array(newPatient.email())
 let password = Array(newPatient.password)
 
 //When you cast your string to an array the elements of the array //are Character so you would need to cast them into string otherwise //Xcode will compain. 
 
 let keys = app.keys
     keys[String(newUserEmail[0])].tap()
     keys[String(newUserEmail[1])].tap()
     keys[String(newUserEmail[2])].tap()
     keys[String(newUserEmail[3])].tap()
     keys[String(newUserEmail[4])].tap()
     keys[String(newUserEmail[5])].tap()       

0
Eugene Berezin

Ваша первая строка - это просто определение запроса , что не означает, что passwordSecureTextField действительно существует.

Ваша вторая строка динамически выполнит запрос и попытается (пере) связать запрос с элементом пользовательского интерфейса. Вы должны установить точку останова и убедиться, что найден один и только один элемент. Или просто используйте assert:

XCTAssertFalse(passwordSecureTextField.exists);

В противном случае это выглядит нормально, tap должен заставить клавиатуру быть видимой, и тогда typeText должен просто работать. Журнал ошибок должен рассказать вам больше информации.

0
JOM

Мы столкнулись с той же ошибкой при установке значения accessibilityIdentifier для настраиваемого представления (подкласс UIStackView), содержащего подпредставления UIControl. В этом случае XCTest не удалось получить фокус клавиатуры для дочерних элементов.

Нашим решением было просто удалить accessibilityIdentifier из родительского представления и установить accessibilityIdentifier для подпредставлений через специальные свойства. 

0
shadowhorst

Что исправило эту проблему для меня, так это добавив 1 секунду сна:

let textField = app.textFields["identifier"]
textField.tap()
sleep(1)
textField.typeText(text)
0
Przemysław Wrzesiński

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

0
codercat