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 - nem o elemento nem qualquer descendente têm o foco do teclado. Elemento:
O que está errado? Isso está funcionando bem para o normal textFields
, mas o problema surge apenas com secureTextFields
. Alguma solução alternativa?
Respostas:
Esse problema me causou muita dor, mas consegui descobrir uma solução adequada. No Simulador, verifique se 'Hardware -> Teclado -> Conectar teclado do hardware' está desativado.
fonte
Recentemente, encontramos um truque para tornar persistente a solução da resposta aceita. Para desativar a configuração do Simulador: 'Hardware -> Teclado -> Conectar teclado do hardware' na linha de comando, deve-se escrever:
Isso não afetará um simulador em execução - você precisará reiniciar o simulador ou iniciar um novo para que essa configuração tenha efeito.
fonte
defaults write com.apple.iphonesimulator ConnectHardwareKeyboard -bool true
, mas é o mesmo conceito.killall "Simulator"; defaults write com.apple.iphonesimulator ConnectHardwareKeyboard 0;
Eu escrevi uma pequena extensão (Swift) que funciona perfeita para mim. Aqui está o código:
A idéia principal é continuar tocando em um elemento (campo de texto) antes que o teclado seja apresentado.
fonte
Stanislav tem a ideia certa.
Em um ambiente de equipe, você precisa de algo que funcione automaticamente. Eu vim com uma correção aqui no meu blog.
Basicamente, basta colar:
fonte
Outra causa desse erro é se houver uma visualização pai do campo de texto no qual você está tentando inserir texto definido como um elemento de acessibilidade (
view.isAccessibilityElement = true
). Nesse caso, o XCTest não pode obter um identificador na subvisão para inserir o texto e retornar o erro.Não é que nenhum elemento tenha foco (como é possível ver o teclado para cima e o cursor piscando no UITextField), é apenas que nenhum elemento que ele possa alcançar tenha foco. Eu me deparei com isso ao tentar inserir texto em um UISearchBar. A barra de pesquisa em si não é o campo de texto. Ao defini-lo como um elemento de acessibilidade, o acesso ao UITextField subjacente foi bloqueado. Para resolver isso,
searchBar.accessibilityIdentifier = "My Identifier"
foi definido noUISearchBar
entantoisAccessibilityElement
não foi definido comotrue
. Depois disso, teste o código do formulário:Trabalho
fonte
Isso ocorreu comigo muitas vezes. Você precisa desativar o hardware do teclado e o mesmo layout que o OSX no seu simulador
Hardware / Teclado (desativar tudo)
Depois disso, o software do teclado não será descartado e seus testes poderão digitar texto
fonte
Durma entre iniciar o aplicativo e digitar dados em campos de texto como este:
No meu caso, eu continuava recebendo esse erro todas as vezes e apenas essa solução me ajudou.
fonte
Talvez isso ajude: eu apenas adicionei uma ação "tap" antes do erro; Isso é tudo :)
fonte
fonte
Grave o estojo da maneira que desejar, com ou sem o teclado conectado. Mas faça o seguinte antes de jogar o teste.
Esta opção a seguir (conectar o teclado do hardware) deve estar desmarcada durante a execução do teste.
fonte
No meu caso, este
Hardware -> Keyboard -> Connect Hardware Keyboard
-> Disable não funcionou para mim.Mas quando eu segui
1)
Hardware -> Keyboard -> Connect Hardware Keyboard
-> Ativado e execute o aplicativo2)
Hardware -> Keyboard -> Connect Hardware Keyboard
-> Desativar .Funcionou para mim
fonte
[ Reposicionando o comentário de Bartłomiej Semańczyk como resposta, porque resolveu o problema para mim]
Eu precisava fazer o Simulador> Redefinir conteúdo e configurações na barra de menus do simulador para fazer isso começar a funcionar para mim.
fonte
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á uma solução alternativa:
fonte
Sua primeira linha é apenas uma definição de consulta , o que não significa que
passwordSecureTextField
realmente existiria.Sua segunda linha executará dinamicamente a consulta e tentará (re) vincular a consulta ao elemento da interface do usuário. Você deve colocar um ponto de interrupção e verificar se um e apenas um elemento foi encontrado. Ou apenas use uma declaração:
Caso contrário, parece ok,
tap
deve forçar o teclado visível etypeText
deve funcionar. O log de erros deve informar mais informações.fonte
passwordSecureTextField
existe. Corrigi o problema, limpando a memória e reescrevendo essas linhas novamente. Estranho, mas funcionou.tap
para mim, demorou algum tempo para descobrir. Boa prática de depuração!Não erre, o problema é que você gravou seu tempo de teste, seu aplicativo conectará o teclado do hardware enquanto o simulador automático de tempo de teste usa apenas o teclado do software. Então, para saber como corrigir esses problemas. Basta usar o teclado do software no seu tempo de gravação. você pode ver a magia.
fonte
O problema para mim era o mesmo que para Ted. Na verdade, se o campo de senha for tocado após o campo de login e a KB de hardware estar ativada, o teclado do software será descartado no segundo toque de campo e não será específico para os testes da interface do usuário.
Depois de algum tempo brincando com o AppleScript, eis o que eu criei (melhorias são bem-vindas):
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
Crie um arquivo de script com o código acima e adicione-o aos destinos necessários (provavelmente apenas testes de interface do usuário, você pode adicionar scripts semelhantes aos seus destinos de desenvolvimento para reativar o teclado HW durante o desenvolvimento). Você deve adicionar a
Run Script
fase nas fases de construção e usá-lo desta forma:osascript Path/To/Script/script_name.applescript
fonte
Encontramos o mesmo erro ao definir o
accessibilityIdentifier
valor para uma visualização personalizada (UIStackView
subclasse) contendoUIControl
subvisões. Nesse caso, o XCTest não conseguiu obter o foco do teclado para os elementos descendentes.Nossa solução foi simplesmente remover a
accessibilityIdentifier
visualização principal e definiraccessibilityIdentifier
as subvisões por meio de propriedades dedicadas.fonte
Outra resposta, mas para nós o problema era que a visão estava muito próxima de outra visão que um reconhecedor de gestos nela. Descobrimos que precisávamos que a exibição estivesse a pelo menos 20 pixels de distância (no nosso caso abaixo). Literalmente 15 não funcionaram e 20 ou mais funcionaram. Isso é estranho, admito, mas tivemos alguns UITextViews que estavam funcionando e outros que não estavam e todos estavam sob o mesmo pai e outro posicionamento idêntico (e nomes de variáveis, é claro). O teclado ligado ou desligado ou o que quer que não faça diferença. Acessibilidade mostrou os campos. Nós reiniciamos nossos computadores. Fizemos construções limpas. Checkouts de fontes novas.
fonte
O que corrigiu esse problema para mim foi adicionar um segundo de sono:
fonte
Corri para esse problema e pude corrigi-lo no meu cenário, pegando a solução postada por @AlexDenisov e adicionando-a às minhas pré-ações para executar e testar .
fonte
Não há necessidade de ligar / desligar o teclado na E / S. Não use .typeText para secureTextField, basta usar
Bônus: você obtém o som do teclado, clique :)
fonte
Por fim, escrevi um script que edita o arquivo .plist do Simulator e define a
ConnectHardwareKeyboard
propriedade como false para o simulador selecionado. Você ouviu direito, ele altera a propriedade do simulador especificamente selecionado no dicionário "DevicePreferences", em vez de editar a propriedade global.Primeiro, crie um script de shell chamado disable-hardware-keyboard.sh com o seguinte conteúdo. Você pode colocá-lo em "YourProject / xyzUITests / Scripts /":
Agora siga estas etapas para chamá-lo passando o udid do simulador selecionado como argumento:
Script dentro de Teste> Pré-ações:
Hora de testá-lo:
fonte
Teve o mesmo problema com os Securetextfields. A opção de conexão de hardware no meu Simulador era de, mas ainda estava com o problema. Finalmente, isso funcionou para mim (Swift 3):
fonte