Как использовать эспрессо для нажатия кнопки AlertDialog

Я хочу нажать кнопку ниже, используя эспрессо, но я не знаю, как это сделать. Должен ли я получить идентификатор ресурса? Или как установить идентификатор для AlertDialog??

введите описание изображения здесь

@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: в иерархии не найдено ни одного представления, соответствующего: с текстом: is "GA NAAR INSTELLINGEN"


person Jim Clermonts    schedule 07.09.2016    source источник
comment
Я думаю, вы могли бы использовать метод withText() вместо сопоставления по идентификатору   -  person jeprubio    schedule 07.09.2016
comment
onView(withText(GA NAAR INSTELLINGEN)).perform(click()); не работает   -  person Jim Clermonts    schedule 07.09.2016


Ответы (6)


Согласно StackOverflow аналогичной проблеме: Проверьте, отображается ли диалоговое окно с эспрессо

Вы должны изменить свой код с:

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

to

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

Если это не сработает, не утруждайте себя длительным использованием Espresso другого замечательного инструментального теста Google под названием uiatomator.

Проверить: http://qathread.blogspot.com/2015/05/espresso-uiautomator-perfect-tandem.html

Пример кода:

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

Надеюсь, это поможет

person piotrek1543    schedule 07.09.2016
comment
Это сработало для меня без метода check(). - person Taslim Oseni; 08.02.2021

Поскольку inRoot(isDialog()), похоже, не работает для DialogFragment, я пока использую этот обходной путь:

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())
}
person JoachimR    schedule 15.08.2017
comment
Спасибо! isDialog() у меня не работал, но я смог найти кнопку1 и кнопку2. Спасибо, что четко написали, как разные кнопки соответствуют своим идентификационным номерам. - person Zeek Aran; 22.02.2018

Возможно, вам придется закрыть программную клавиатуру следующим образом:

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

Как более подробно описано в этом ответе.

person CorayThan    schedule 12.06.2017
comment
Не знаю, новинка это или нет, но у androidx.test.espresso.action.ViewActions есть метод closeSoftKeyboard(). - person nasch; 30.11.2019

Преимущество последнего обновления в том, что оно позволяет вам устанавливать разрешения перед каждым тестом, так что вам не нужно нажимать на диалоговое окно (это значительно ускоряет тестирование!)

Используйте следующее правило (например, для местоположения/хранилища... замените их разрешениями, которые вам нужны, очевидно)

@Rule
  public GrantPermissionRule runtimePermissionRule = GrantPermissionRule.grant(
      ACCESS_FINE_LOCATION, READ_EXTERNAL_STORAGE);
person Emmaaa    schedule 23.08.2017

В классе AlertController ОС Android устанавливает идентификаторы для кнопок AlertDialog. Проверьте метод setupButtons. Например, на момент написания этой статьи идентификатор положительной кнопки был 16908313. Таким образом, вы можете написать что-то вроде этого.

onView(withId(DIALOG_POSITIVE_BUTTON_ID)).check(matches(isDisplayed()));

где DIALOG_POSITIVE_BUTTON_ID = 16908313

У меня тоже сработала кнопка "минус"

person NovDanil    schedule 02.06.2019
comment
Для меня это лучшее решение. - person Safety; 01.04.2020

Для AlertDialog идентификатор, присвоенный каждой кнопке:

  • ПОЗИТИВНО: android.R.id.button1
  • ОТРИЦАТЕЛЬНО: android.R.id.button2
  • НЕЙТРАЛЬНО: android.R.id.button3

Вы можете проверить себя в классе AlertController, методе setupButtons(). Таким образом, вы можете выполнить щелчок следующим образом:

onView(withId(android.R.id.button1)).perform(click());

person giroxiii    schedule 20.11.2019