7

Voglio testare le autorizzazioni di Android 6, ma non ho trovato il modo di fare clic sul pulsante "Consenti" utilizzando Espresso. C'è un modo per fare questo?Espresso - fare clic sul pulsante della finestra di dialogo

enter image description here

La versione del Espresso è 2.2.1.

La prova:

@Test 
    public void acceptFirstPermission() throws Exception { 
     onView(withText("ALLOW")).perform(click()); 
    } 

Comportamento:

ho ancora ricevere lo schermo congelato con la finestra di dialogo (come nello screenshot). Prova a eseguire tutto il tempo finché non è finito.

uscita:

Running tests 
Test running started 
android.support.test.espresso.NoActivityResumedException: No activities in stage RESUMED. Did you forget to launch the activity. (test.getActivity() or similar)? 
at dalvik.system.VMStack.getThreadStackTrace(Native Method) 
at java.lang.Thread.getStackTrace(Thread.java:580) 
at android.support.test.espresso.base.DefaultFailureHandler.getUserFriendlyError(DefaultFailureHandler.java:82) 
at android.support.test.espresso.base.DefaultFailureHandler.handle(DefaultFailureHandler.java:53) 
at android.support.test.espresso.ViewInteraction.runSynchronouslyOnUiThread(ViewInteraction.java:184) 
at android.support.test.espresso.ViewInteraction.doPerform(ViewInteraction.java:115) 
at android.support.test.espresso.ViewInteraction.perform(ViewInteraction.java:87) 
at com.walletsaver.app.test.espresso.MarshmallowPermissionsTest.acceptFirstPermission(MarshmallowPermissionsTest.java:31) 
at java.lang.reflect.Method.invoke(Native Method) 
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
at android.support.test.internal.statement.UiThreadStatement.evaluate(UiThreadStatement.java:55) 
at android.support.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:257) 
at org.junit.rules.RunRules.evaluate(RunRules.java:20) 
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
at org.junit.runners.Suite.runChild(Suite.java:128) 
at org.junit.runners.Suite.runChild(Suite.java:27) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
at org.junit.runner.JUnitCore.run(JUnitCore.java:137) 
at org.junit.runner.JUnitCore.run(JUnitCore.java:115) 
at android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:54) 
at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:240) 
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1879) 

Finish 
+0

Eventuali duplicati di [Android Marshmallow:? I permessi di prova con Espresso] (http://stackoverflow.com/questions/33929937/android-marshmallow-test-permissions-with-espresso) –

risposta

7

Vedo che stai cercando di verificare l'autorizzazione dell'app. Penso che potrebbe essere praticamente impossibile provarlo con Espresso. Potrebbe essere necessario eseguire questa operazione con un altro strumento di test dell'interfaccia utente denominato uiatomator.

uiatomator, un altro ottimo strumento creato da Google consente di testare le funzioni del sistema Android come notifiche e blocco dello schermo. Puoi usarlo con la struttura di test Espresso.

Per trovare ulteriori informazioni, si prega di leggere questo articolo:

http://qathread.blogspot.com/2015/05/espresso-uiautomator-perfect-tandem.html

e uiautomator documentazione, che si dovrebbe trovare here.

+1

UI Automator funziona perfettamente con la finestra di dialogo dei permessi. Grazie! – Val

6

bene, può essere semplice come

onView(withText("Allow")).perform(click()); 

Naturalmente questa non è una soluzione perfetta, quindi ci sono due modi per andare per renderlo più robusto: analizza l'app con hierarchyviewer per trovare suggerimenti su come identificare il pulsante (ad es. descrizione del contenuto), o immergerti nel codice sorgente Android per i suggerimenti (ad esempio l'ID risorsa del pulsante).

EDIT

Beh, non è così semplice. Ho scritto an article sull'utilizzo di UiAutomator per farlo funzionare.

+0

Sfortunatamente, non funziona. Continuo a ricevere lo schermo bloccato con la finestra di dialogo (come nello screenshot nella domanda). Prova a eseguire tutto il tempo finché non è finito. – Val

+0

Potresti aggiornare la tua domanda con il codice del tuo test? Normalmente se il test non avesse trovato il pulsante per testo, sarebbe fallito. – Egor

+0

Hai ragione! Aggiornato. – Val

-2

Lo snippet riportato di seguito garantisce le autorizzazioni prima di eseguire i test. Speriamo che si risolve il problema :)

@Before 
    public void grantPhonePermission() { 
     // In M+, trying to call a number will trigger a runtime dialog. Make sure 
     // the permission is granted before running this test. 
     // goo.gl/C8T4BU 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
      getInstrumentation().getUiAutomation().executeShellCommand(
        "pm grant " + getTargetContext().getPackageName() 
          + " android.permission.READ_PHONE_STATE" 
          + " android.permission.PHONE"); 
     } 
    } 
Problemi correlati