wake-up-neo.net

So deaktivieren Sie die neue Autofill-Funktion von Android Oreo für Espresso-Tests

Das Ausführen von Tests auf Android-Geräten mit sdk 26 führt dazu, dass sie aufgrund der neuen Funktion Autofill fehlschlagen, durch die die Felder ausgeblendet werden, wenn Espresso auf sie klickt.

Ich führe meine Tests im Firebase-Testlabor aus, sodass ich sie auf meinen Testgeräten nicht manuell deaktivieren kann.

Einige Bilder:

1. Das Passwort ist sichtbar, bevor Sie auf das Feld Benutzername klicken.

 enter image description here

2. Nachdem Sie auf das Feld Benutzername geklickt haben, wird das Kennwortfeld durch dieses Dialogfeld zum automatischen Ausfüllen ausgeblendet:

 enter image description here

3. Nach dem Login wird ein weiterer Fill-Dialog angezeigt:

 enter image description here

Espresso kann nicht jetzt auf das Kennwortfeld klicken, da der Dialog zum automatischen Ausfüllen mein Feld und fail verbirgt.

Mit AutofillManager#disableAutofillServices() wurde nur die # 2 deaktiviert. Dialog aber # 3. ist immer noch hier.

Wie kann ich Autofill auf Testgeräten deaktivieren?

17
Caipivara

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

Dies sollte den Autofill-Dienst deaktivieren. Es ist dasselbe wie wenn Sie den Autofill-Dienst in den Systemeinstellungen manuell deaktivieren. Es hat zumindest am Emulator gearbeitet. Dies erfordert jedoch Root-Zugriff.

Eine andere Möglichkeit, den Autofill-Dienst zu deaktivieren, besteht darin, die autofill_service-Einstellungen zu ändern.

adb Shell settings put secure autofill_service null

2
UCZ

Basierend auf der Dokumentation können Sie die Autofill-Dienste mit AutofillManager#disableAutofillServices() API deaktivieren:

Wenn die App, die diese API aufruft, die AutoFill-Services aktiviert hat, werden sie deaktiviert.

Verwendungszweck:


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

Sie können dies im Schritt @Before Ihres Tests tun.

5
azizbekian

Ich hatte Glück, das automatische Ausfüllen während Espresso-Tests mit benutzerdefinierten ViewActions zu deaktivieren, die bei der Texteingabe angewendet wurden.

            .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.

Eine alternative Codeorganisation, die auf der Lösung von @Alan K basiert.

Erstellen Sie die Klasse 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();
            }
        }
    }
}

Und in Ihrem Code, wenn Sie AutoFill für editTextPassword deaktivieren müssen ...

editTextPassword.perform(..., ViewActions.closeSoftKeyboard(), DisableAutofillAction())
1

Laut Dokumentation: wenn sich die Ansicht auf einen Datensatz konzentriert und Teil eines Datensatzes ist. Die Anwendung kann benachrichtigt werden, wenn das Angebot angezeigt wird, indem ein AutofillManager.AutofillCallback über registerCallback (AutofillCallback) registriert wird. Wenn der Benutzer ein Dataset aus dem Angebot auswählt, werden alle in dem Dataset vorhandenen Ansichten durch Aufrufe von Autofill (AutofillValue) oder Autofill (SparseArray) automatisch gefüllt. 

Der Kontext ist dann beendet, wenn einer der folgenden Fälle eintritt:

  1. commit () wird aufgerufen oder alle speicherbaren Ansichten sind weg.
  2. cancel () wird aufgerufen. 

Es ist sicher, von jedem Thread aus seine Methoden aufzurufen.

Instanzen dieser Klasse müssen über Context.getSystemService (Class) mit dem Argument AutofillManager.class abgerufen werden.

Verwenden Sie die disableAutofillServices () -Methode, um den Dienst zu deaktivieren.

0
ANKIT KOTNALA

Das folgende Snippet kann verwendet werden, um die neuen Android Vorschläge zu ignorieren:

getWindow().getDecorView().setImportantForAutofill(View.IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS);
0
DoronK