C'est mon cas:
let passwordSecureTextField = app.secureTextFields["password"]
passwordSecureTextField.tap()
passwordSecureTextField.typeText("wrong_password") //here is an error
Échec du test de l'interface utilisateur - Aucun élément ni aucun descendant n'a le focus clavier. Élément:
Qu'est-ce qui ne va pas? Cela fonctionne bien pour la normale textFields
, mais le problème ne survient qu'avec secureTextFields
. Des solutions de contournement?
Réponses:
Ce problème m'a causé un monde de douleur, mais j'ai réussi à trouver une solution appropriée. Dans le simulateur, assurez-vous que «Matériel -> Clavier -> Connecter le clavier matériel» est désactivé.
la source
Récemment, nous avons trouvé un hack pour rendre la solution à partir de la réponse acceptée persistante. Pour désactiver les paramètres du simulateur: 'Matériel -> Clavier -> Connecter le clavier matériel' à partir de la ligne de commande, il faut écrire:
Cela n'affectera pas un simulateur en cours d'exécution - vous devez redémarrer le simulateur ou en démarrer un nouveau pour que ce paramètre ait son effet.
la source
defaults write com.apple.iphonesimulator ConnectHardwareKeyboard -bool true
, mais c'est le même concept.killall "Simulator"; defaults write com.apple.iphonesimulator ConnectHardwareKeyboard 0;
J'ai écrit une petite extension (Swift) qui fonctionne parfaitement pour moi. Voici le code:
L'idée principale est de continuer à taper sur un élément (champ de texte) avant que le clavier ne soit présenté.
la source
Stanislav a la bonne idée.
Dans un environnement d'équipe, vous avez besoin de quelque chose qui fonctionnera automatiquement. J'ai trouvé une solution ici sur mon blog.
En gros, vous venez de coller:
la source
Une autre cause de cette erreur est s'il existe une vue parent du champ de texte dans lequel vous essayez de saisir du texte défini comme élément d'accessibilité (
view.isAccessibilityElement = true
). Dans ce cas, XCTest n'est pas en mesure d'obtenir une poignée sur la sous-vue pour entrer le texte et renvoie l'erreur.Ce n'est pas qu'aucun élément n'a le focus (comme vous pouvez souvent voir le clavier vers le haut et le curseur clignotant dans UITextField), c'est juste qu'aucun élément qu'il peut atteindre n'a le focus. J'ai rencontré cela en essayant de saisir du texte dans un UISearchBar. La barre de recherche elle-même n'est pas le champ de texte, lors de sa définition en tant qu'élément d'accessibilité, l'accès à l'UITextField sous-jacent a été bloqué. Pour résoudre ce problème, a
searchBar.accessibilityIdentifier = "My Identifier"
été défini surUISearchBar
maisisAccessibilityElement
n'a pas été défini surtrue
. Après cela, testez le code du formulaire:Travaux
la source
Cela s'est produit avec moi plusieurs fois. Vous devez désactiver le matériel du clavier et la même disposition que OSX dans votre simulateur
Matériel / clavier (tout désactiver)
Après cela, le logiciel de clavier ne rejettera pas et vos tests pourront taper du texte
la source
Utilisez un sommeil entre le lancement de l'application et la saisie de données dans des champs de texte comme celui-ci:
Dans mon cas, je continuais à recevoir cette erreur à chaque fois et seule cette solution m'a aidé.
la source
Cela peut peut-être aider: j'ajoute simplement une action "tap" avant l'erreur; c'est tout :)
la source
la source
Enregistrez le boîtier comme vous le souhaitez, clavier ou sans clavier attaché. Mais faites ce qui suit avant de jouer au test.
Cette option suivante (connecter le clavier matériel) doit être décochée pendant la lecture du test.
la source
Dans mon cas ceci
Hardware -> Keyboard -> Connect Hardware Keyboard
-> Désactiver n'a pas fonctionné pour moi.Mais quand j'ai suivi
1)
Hardware -> Keyboard -> Connect Hardware Keyboard
-> Activé et exécutez l'application2)
Hardware -> Keyboard -> Connect Hardware Keyboard
-> Désactiver .Ça a marché pour moi
la source
[Republier le commentaire de Bartłomiej Semańczyk comme réponse car il a résolu le problème pour moi]
J'avais besoin de faire Simulateur> Réinitialiser le contenu et les paramètres dans la barre de menus du simulateur pour que cela commence à fonctionner pour moi.
la source
Parfois, les champs de texte ne sont pas implémentés en tant que champs de texte, ou ils sont enveloppés dans un autre élément de l'interface utilisateur et ne sont pas facilement accessibles. Voici un travail autour:
la source
Votre première ligne n'est qu'une définition de requête , ce qui ne veut pas dire qu'elle
passwordSecureTextField
existerait réellement.Votre deuxième ligne exécutera dynamiquement la requête et tentera de (re) lier la requête à l'élément d'interface utilisateur. Vous devez y mettre un point d'arrêt et vérifier qu'un et un seul élément est trouvé. Ou utilisez simplement une assertion:
Sinon, cela semble correct,
tap
devrait forcer le clavier visible et ensuitetypeText
fonctionner. Le journal des erreurs devrait vous donner plus d'informations.la source
passwordSecureTextField
existe. J'ai résolu le problème, mais en nettoyant la mémoire et en réécrivant ces lignes à nouveau. Bizarre, mais ça a marché.tap
pour moi, il a fallu du temps pour comprendre. Bonne pratique de débogage!Ne vous trompez pas, le problème est que vous avez enregistré votre temps de test.Votre application connectera le clavier matériel tandis que votre simulateur de temps de test automatique ne prend que le clavier logiciel. donc pour savoir comment résoudre ces problèmes. Utilisez simplement le clavier logiciel sur votre temps d'enregistrement. vous pouvez voir la magie.
la source
Le problème pour moi était le même que pour Ted. En fait, si le champ du mot de passe est tapé après le champ de connexion et que la base de connaissances matérielle est activée, le clavier logiciel se fermera lors du deuxième appui sur le champ, et ce n'est pas spécifique aux tests d'interface utilisateur.
Après un certain temps à déconner avec AppleScript, voici ce que j'ai proposé (les améliorations sont les bienvenues):
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
Créez un fichier de script avec le code ci-dessus et ajoutez-le aux cibles nécessaires (probablement la cible des tests d'interface utilisateur uniquement, vous pouvez ajouter un script similaire à vos cibles de développement pour réactiver le clavier matériel pendant le développement). Vous devez ajouter une
Run Script
phase dans les phases de construction et l'utiliser comme ceci:osascript Path/To/Script/script_name.applescript
la source
Nous avons rencontré la même erreur lors de la définition de la
accessibilityIdentifier
valeur d'une vue personnalisée (UIStackView
sous-classe) contenant des sous-UIControl
vues. Dans ce cas, XCTest n'a pas pu obtenir le focus clavier pour les éléments descendants.Notre solution consistait simplement à supprimer le
accessibilityIdentifier
de notre vue parent et à définir leaccessibilityIdentifier
pour les sous-vues via des propriétés dédiées.la source
Une autre réponse, mais pour nous, le problème était que la vue était trop proche d'une autre vue qu'un outil de reconnaissance de geste dessus. Nous avons constaté que la vue devait être distante d'au moins 20 pixels (dans notre cas ci-dessous). Littéralement, 15 n'ont pas fonctionné et 20 ou plus l'ont fait. C'est étrange, je l'admets, mais nous avions quelques UITextViews qui fonctionnaient et d'autres qui n'étaient pas et tous étaient sous le même parent et d'autres positionnements identiques (et des noms de variables bien sûr). Le clavier allumé ou éteint ou quoi que ce soit ne faisait aucune différence. L'accessibilité a montré les champs. Nous avons redémarré nos ordinateurs. Nous avons fait des constructions propres. Paiements à la source fraîche.
la source
Ce qui a résolu ce problème pour moi a été d'ajouter une seconde de sommeil:
la source
J'ai rencontré ce problème et j'ai pu le résoudre dans mon scénario en prenant la solution publiée par @AlexDenisov et en l'ajoutant à mes pré-actions pour l' exécution et le test .
la source
Pas besoin d'activer / désactiver le clavier dans les E / S. N'utilisez pas .typeText pour secureTextField, utilisez simplement
Bonus: vous obtenez le son du clavier :)
la source
Enfin, j'ai écrit un script qui édite le fichier .plist du simulateur et définit le
ConnectHardwareKeyboard
propriété sur false pour le simulateur sélectionné. Vous avez bien entendu, cela change la propriété du simulateur spécifiquement sélectionné dans le dictionnaire "DevicePreferences" plutôt que de modifier la propriété globale.Commencez par créer un script shell nommé disable-hardware-keyboard.sh avec le contenu suivant. Vous pouvez le placer dans "YourProject / xyzUITests / Scripts /":
Suivez maintenant ces étapes pour l'appeler en passant l'udid du simulateur sélectionné comme argument:
Script dans Test> Pré-actions:
Il est temps de le tester:
la source
Eu le même problème avec Securetextfields. L'option de connexion matérielle dans mon simulateur était de, mais rencontrait toujours le problème. Enfin, cela a fonctionné pour moi (Swift 3):
la source