web-dev-qa-db-fra.com

Comment désactiver la nouvelle fonctionnalité de remplissage automatique d'Android Oreo pour les tests d'espresso

L'exécution de tests sur des appareils Android avec sdk 26 entraîne leur échec en raison de la nouvelle fonctionnalité Remplissage automatique qui masque les champs lorsque les expresso essaient de cliquer dessus.

J'exécute mes tests sur le laboratoire de test firebase afin que je ne puisse pas les désactiver manuellement sur mes périphériques de test.

Quelques images:

1. Le mot de passe est visible avant de cliquer sur le champ Nom d'utilisateur.

 enter image description here

2. Après avoir cliqué sur le nom d'utilisateur, le mot de passe est masqué par la boîte de dialogue Remplissage automatique:

 enter image description here

3. Après la connexion, une autre boîte de dialogue de remplissage apparaît:

 enter image description here

Le mot de passe pour le clic maintenant sur espresso ne peut pas, car la boîte de dialogue de saisie automatique masque mon champ et fail.

L'utilisation de AutofillManager#disableAutofillServices() a uniquement désactivé le n ° 2. dialogue mais # 3. est toujours là.

Comment désactiver la saisie automatique sur les appareils de test?

17
Caipivara

adb Shell pm disable com.google.Android.gms/com.google.Android.gms.autofill.service.AutofillService 

Cela devrait désactiver le service de remplissage automatique. Cela revient à désactiver manuellement le service de saisie automatique dans les paramètres système. Cela a au moins fonctionné sur l'émulateur. Mais cela nécessite un accès root.

Un autre moyen de désactiver le service de remplissage automatique consiste à modifier les paramètres autofill_service.

adb Shell settings put secure autofill_service null

2
UCZ

Selon la documentation, vous pouvez désactiver les services de remplissage automatique à l’aide de AutofillManager#disableAutofillServices() API:

Si l'application qui appelle cette API a activé les services de remplissage automatique, ils seront désactivés.

Usage:


    val autofillManager: AutofillManager = context.getSystemService(AutofillManager::class.Java)
    autofillManager.disableAutofillServices()

Vous pouvez le faire à l’étape @Before de votre test.

5
azizbekian

J'ai eu de la chance en désactivant le remplissage automatique lors des tests Espresso avec ViewActions personnalisé appliqué à chaque saisie de texte.

            .onView(...)
            .perform(
                    new ViewAction() {
                        @Override
                        public Matcher<View> getConstraints() {
                            return Matchers.any(View.class);
                        }

                        @Override
                        public String getDescription() {
                            return "Marking view not important for autofill";
                        }

                        @Override
                        public void perform(UiController uiController, View view) {
                            // Required to disable autofill suggestions during tests on API 26+
                            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                                view.setImportantForAutofill(View.IMPORTANT_FOR_AUTOFILL_NO);
                            }
                        }
                    })
            .perform(click())
            .perform(clearText())
            .perform(typeText(textToType))
            .perform(
                    new ViewAction() {
                        @Override
                        public Matcher<View> getConstraints() {
                            return Matchers.any(View.class);
                        }

                        @Override
                        public String getDescription() {
                            return "Dismissing autofill picker";
                        }

                        @Override
                        public void perform(UiController uiController, View view) {
                            // Required to dismiss the autofill picker during tests on API 26+
                            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                                AutofillManager autofillManager =
                                        view.getContext()
                                                .getSystemService(AutofillManager.class);
                                if (autofillManager != null) autofillManager.cancel();
                            }
                        }
                    });
3
Alan K.

Une organisation de code alternative basée sur la solution de @Alan K.

Créez la classe DisableAutofillAction:

public class DisableAutofillAction implements ViewAction {

    @Override
    public Matcher<View> getConstraints() {
        return Matchers.any(View.class);
    }

    @Override
    public String getDescription() {
        return "Dismissing autofill picker";
    }

    @Override
    public void perform(UiController uiController, View view) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

            AutofillManager autofillManager = view.getContext().getSystemService(AutofillManager.class);

            if (autofillManager != null) {
                autofillManager.cancel();
            }
        }
    }
}

Et, dans votre code lorsque vous devez désactiver la saisie automatique pour editTextPassword ...

editTextPassword.perform(..., ViewActions.closeSoftKeyboard(), DisableAutofillAction())
1
Luis E. Fernandez

Selon la documentation: lorsque la vue est focalisée sur et fait partie d'un jeu de données. L'application peut être avertie lorsque l'offre est affichée en enregistrant un AutofillManager.AutofillCallback via registerCallback (AutofillCallback). Lorsque l'utilisateur sélectionne un jeu de données parmi les prix disponibles, toutes les vues présentes dans le jeu de données sont automatiquement remplies, via des appels à remplissage automatique (AutofillValue) ou à remplissage automatique (SparseArray). 

Le contexte est alors terminé lorsque l'un des événements suivants se produit:

  1. commit () est appelé ou toutes les vues sauvegardables ont disparu.
  2. cancel () est appelé. 

Il est prudent d'appeler dans ses méthodes à partir de n'importe quel thread.

Les instances de cette classe doivent être obtenues à l'aide de Context.getSystemService (Class) avec l'argument AutofillManager.class.

Utilisez la méthode disableAutofillServices () pour désactiver le service.

0
ANKIT KOTNALA