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


- Это мое дело:

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

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

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

17 83

17 ответов:

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

недавно мы нашли хак, чтобы сделать решение из принятого ответа постоянным. Чтобы отключить настройку симулятора: 'Hardware - > Keyboard - > Connect hardware keyboard' из командной строки следует написать:

defaults write com.apple.iphonesimulator ConnectHardwareKeyboard 0

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

Я написал небольшое расширение (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))
        }
    }
}

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

Станислав имеет правильную идею.

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

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

UIPasteboard.generalPasteboard().string = "Their password"
let passwordSecureTextField = app.secureTextFields["password"]
passwordSecureTextField.pressForDuration(1.1)
app.menuItems["Paste"].tap()
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()
}

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

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

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

Disable Hardware

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

sleep(2)

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

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

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

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

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

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

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

работает

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

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

enter image description here

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

Мне нужно было сделать симулятор > сбросить содержимое и настройки в строке меню симулятора, чтобы это начало работать для меня.

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

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

XCTAssertFalse(passwordSecureTextField.exists);

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

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

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

через некоторое время возиться с 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 keyboard во время разработки). Вы должны добавить Run Script фаза в фазах сборки и использовать его следующим образом: osascript Path/To/Script/script_name.applescript

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

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

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

//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()       

была такая же проблема с Securetextfields. Опция подключения оборудования в моем симуляторе была, но все же столкнулась с проблемой. Наконец, это сработало для меня (Swift 3):

 let enterPasswordSecureTextField = app.secureTextFields["Enter Password"]
    enterPasswordSecureTextField.tap()
    enterPasswordSecureTextField.typeText("12345678")