6

Je veux appuyer sur le bouton ci-dessous en utilisant Espresso, mais je ne sais pas comment. Devrais-je obtenir l'identifiant de ressource? Ou comment définir un ID à AlertDialog ??Comment utiliser expresso pour appuyer sur un bouton AlertDialog

enter image description here

@RunWith(AndroidJUnit4.class) 
public class ApplicationTest { 

@Rule 
public ActivityTestRule<LoadingActivity> mActivityRule = 
     new ActivityTestRule<>(LoadingActivity.class); 

@Test 
public void loginClickMarker() { 
//Doesn't work: 
    onView(withText("GA NAAR INSTELLINGEN")).perform(click()); 
} 
} 

public class PopupDialog { 

public static void showGPSIsDisabled(Context context, String msg, final PopupDialogCallback popupDialogCallback) { 
    new AlertDialog.Builder(context) 
      .setTitle(context.getString(R.string.location_turned_off)) 
      .setMessage(msg) 
      .setPositiveButton(context.getString(R.string.go_to_settings), new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        dialog.dismiss(); 
        popupDialogCallback.hasClicked(); 
       } 
      }).show(); 
} 
} 

android.support.test.espresso.NoMatchingViewException: Aucune vue dans la hiérarchie trouvé correspondance: avec le texte: est "GA CRN Instellingen"

+0

Je pense que vous pourriez utiliser la méthode withText() au lieu de faire correspondre par l'ID – jeprubio

+0

onView (withText ("GA NAAR INSTELLINGEN")). Perform (cliquez sur()); ne fonctionne pas –

Répondre

11

Selon StackOverflow problème similaire: Check if a dialog is displayed with Espresso

Vous devez changer votre code de:

onView(withText("GA NAAR INSTELLINGEN")).perform(click()); 

à

onView(withText("GA NAAR INSTELLINGEN"))) 
    .inRoot(isDialog()) // <--- 
    .check(matches(isDisplayed())) 
    .perform(click()); 

Si elle ne fonctionne pas, ne prenez pas la peine d'utiliser longtemps avec Espresso un autre grand test de l'instrumentation de Google appelé uiatomator.

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

code Exemple:

// Initialize UiDevice instance 
UiDevice uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); 

// Search for correct button in the dialog. 
UiObject button = uiDevice.findObject(new UiSelector().text("GA NAAR INSTELLINGEN")); 
if (button.exists() && button.isEnabled()) { 
    button.click(); 
} 

espère que cela vous aidera

1

Vous pourriez avoir besoin de fermer la SoftKeyboard comme ceci:

 onView(withId(R.id.username)) 
       .perform(typeText("username")) 
       .perform(closeSoftKeyboard()) 
     onView(withId(android.R.id.button1)).perform((click())) 

Comme plus à fond en détail par this answer.

2

Depuis inRoot(isDialog()) ne semble pas fonctionner pour DialogFragment J'utilise cette solution jusqu'à présent:

enum class AlertDialogButton(@IdRes val resId: Int) { 
    POSITIVE(android.R.id.button1), 
    NEGATIVE(android.R.id.button2), 
    NEUTRAL(android.R.id.button3) 
} 

fun clickOnButtonInAlertDialog(button: AlertDialogButton) { 
    onView(withId(button.resId)).perform(click()) 
} 
+0

Merci! isDialog() ne fonctionnait pas pour moi, mais j'étais capable de trouver button1 et button2. Merci d'écrire explicitement comment les différents boutons s'alignent avec leurs numéros d'identification. –

0

La bonne chose au sujet de la dernière mise à jour est-il vous permet de définir des autorisations avant chaque test, de sorte que vous n » t devez cliquer sur la boîte de dialogue (ce qui accélère le test par beaucoup!)

Utilisez la règle suivante (par exemple pour l'emplacement/stockage .. remplacer ceux-ci avec les autorisations dont vous avez besoin évidemment)

@Rule 
    public GrantPermissionRule runtimePermissionRule = GrantPermissionRule.grant(
     ACCESS_FINE_LOCATION, READ_EXTERNAL_STORAGE);