web-dev-qa-db-fra.com

Comment utiliser un expresso pour appuyer sur un bouton AlertDialog

Je veux appuyer sur le bouton ci-dessous avec Espresso, mais je ne sais pas comment. Devrais-je obtenir l'ID de ressource? Ou comment définir un identifiant sur 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 ne correspond à: avec le texte: est "GA NAAR INSTELLINGEN"

9
Jim Clermonts

Selon StackOverflow problème similaire: Vérifier si une boîte de dialogue s'affiche avec Espresso

Vous devriez changer votre code de:

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

à

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

Si cela ne fonctionne pas, ne tardez pas à utiliser Espresso, un autre excellent test d'instrumentation de Google appelé uiatomator.

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

Exemple de code:

// 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();
}

J'espère que ça va aider

22
piotrek1543

Puisque inRoot(isDialog()) ne semble pas fonctionner pour DialogFragment J'utilise cette solution de contournement 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())
}
4
IHeartAndroid

Vous devrez peut-être fermer le clavier logiciel comme ceci:

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

Comme détaillé plus en détail par cette réponse .

3
CorayThan

La bonne chose à propos de la dernière mise à jour est qu'elle vous permet de définir des autorisations avant chaque test, de sorte que vous n'ayez pas à cliquer sur la boîte de dialogue (cela accélère considérablement les tests!)

Utilisez la règle suivante (par exemple, pour l’emplacement/le stockage .. remplacez-les par les autorisations dont vous avez évidemment besoin)

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