ios - Falha de teste da interface do usuário-Nenhum elemento nem qualquer descendente tem o foco do teclado em secureTextField



xcode swift (13)

Caso de registro, no entanto, você quer, teclado ou sem teclado anexado. Mas faça o seguinte antes de jogar o teste.

Esta opção a seguir (conectar teclado de hardware) deve ser desmarcada durante a reprodução do teste.

Este é o meu caso:

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

Falha no teste da interface do usuário - Nenhum elemento nem qualquer descendente tem foco no teclado. Elemento:

O que está errado? Isso está funcionando bem para textFields normais, mas o problema surge apenas com secureTextFields . Qualquer solução alternativa?


Em algum momento, os campos de texto não são implementados como campos de texto ou são agrupados em outro elemento da interface do usuário e não são facilmente acessíveis. Aqui está um trabalho:

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


Esse problema me causou um mundo de dor, mas consegui descobrir uma solução adequada. No Simulador, certifique-se de que 'Hardware -> Teclado -> Conectar teclado de hardware' esteja desligado.


Eu escrevi uma pequena extensão (Swift) que funciona perfeito para mim. Aqui está o código:

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))
        }
    }
}

A idéia principal é continuar tocando um elemento (campo de texto) antes do teclado ser apresentado.


Isso talvez ajude: basta adicionar uma ação de "toque" antes do erro; Isso é tudo :)

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

Não estraguei tudo, Problema pegou o motivo é que você está gravado o seu tempo de teste seu aplicativo irá conectar hardware teclado enquanto seu simulador de tempo de teste automático leva apenas teclado de software. então, como corrigir esses problemas. Basta usar o teclado do software no seu tempo de gravação. Você pode ver a magia.


O que resolveu esse problema para mim foi adicionar um segundo de sono:

let textField = app.textFields["identifier"]
textField.tap()
sleep(1)
textField.typeText(text)

Outra causa desse erro é se houver uma exibição pai do campo de texto no qual você está tentando inserir o texto definido como um elemento de acessibilidade ( view.isAccessibilityElement = true ). Nesse caso, o XCTest não consegue obter um identificador na subvisualização para inserir o texto e retorna o erro.

Falha no teste da interface do usuário - Nenhum elemento nem qualquer descendente tem foco no teclado.

Não é que nenhum elemento tenha foco (como você pode ver muitas vezes o teclado para cima e o cursor piscando no UITextField), é apenas que nenhum elemento que ele pode alcançar tem foco. Eu corri para isso ao tentar inserir texto em um UISearchBar. A barra de pesquisa em si não é o campo de texto, ao configurá-lo como um elemento de acessibilidade, o acesso ao UITextField subjacente foi bloqueado. Para resolver isso, searchBar.accessibilityIdentifier = "My Identifier" foi definido no isAccessibilityElement mas o isAccessibilityElement não foi definido como true . Depois disso, teste o código do formulário:

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

Trabalho


Recentemente, encontramos um hack para tornar a solução da resposta aceita persistente. Para desativar a configuração do Simulador: 'Hardware -> Teclado -> Conectar teclado de hardware' na linha de comando, deve-se escrever:

defaults write com.apple.iphonesimulator ConnectHardwareKeyboard 0

Isso não afetará um simulador que está sendo executado - você precisa reiniciar o simulador ou iniciar um novo para fazer com que essa configuração tenha efeito.


Stanislav tem a ideia certa.

Em um ambiente de equipe, você precisa de algo que funcione automaticamente. Eu encontrei uma correção here no meu blog.

Basicamente você acabou de colar:

UIPasteboard.generalPasteboard().string = "Their password"
let passwordSecureTextField = app.secureTextFields["password"]
passwordSecureTextField.pressForDuration(1.1)
app.menuItems["Paste"].tap()

Tive o mesmo problema com Securetextfields. A opção de hardware de conexão no meu Simulador era de, mas ainda corri para o problema. Finalmente, isso funcionou para mim (Swift 3):

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

Use um intervalo entre o lançamento do aplicativo e a digitação de dados em campos de texto como este:

sleep(2)

No meu caso, eu estava recebendo esse erro toda vez e somente essa solução ajudou a minha saída.


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




xcode-ui-testing