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:
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?
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
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.
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();
}
}
});
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())
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:
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.