如何使用浓缩咖啡按AlertDialog按钮

时间:2016-09-07 18:28:34

标签: android android-studio android-uiautomator android-espresso

我想使用Espresso按下面按钮,但我不确定如何。我应该获得资源ID吗?或者如何将ID设置为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:找不到层次结构中的视图匹配:with text:is&#34; GA NAAR INSTELLINGEN&#34;

6 个答案:

答案 0 :(得分:27)

根据StackOverflow类似问题:https://issues.apache.org/jira/browse/IGNITE-735

您应该更改以下代码:

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

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

如果它不起作用,请不要费力地使用Espresso另一个名为uiatomator的Google精彩仪器测试。

检查:Check if a dialog is displayed with Espresso

示例代码:

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

希望它会有所帮助

答案 1 :(得分:5)

由于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())
}

答案 2 :(得分:4)

您可能需要关闭软键盘,如下所示:

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

详见[{3}}。

答案 3 :(得分:0)

关于上次更新的好处是它允许您在每次测试之前设置权限,这样您就不必单击对话框(这会加快测试速度!)

使用以下规则(例如,用于位置/存储..用显然需要的权限替换它们)

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

答案 4 :(得分:0)

AlertController类中,Android操作系统将ID设置为AlertDialog按钮。检查setupButtons方法。例如,在撰写本文时,正按钮ID为16908313。因此,您可以编写如下内容

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

其中DIALOG_POSITIVE_BUTTON_ID = 16908313

使用否定按钮对我也有用

答案 5 :(得分:0)

对于AlertDialog,分配给每个按钮的ID为:

  • 正面:android.R.id.button1
  • 负数:android.R.id.button2
  • 中立:android.R.id.button3

您可以使用AlertController类的setupButtons()方法进行检查。 因此,您可以执行以下单击操作:

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