web-dev-qa-db-ja.com

エスプレッソを使用してAlertDialogボタンを押す方法

エスプレッソで下のボタンを押したいのですが、どうすればいいのかわかりません。リソースIDを取得する必要がありますか?または、AlertDialogにIDを設定する方法は?

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 "GA NAAR INSTELLINGEN"

13
Jim Clermonts

StackOverflowによる同様の問題: ダイアログがEspressoで表示されるかどうかを確認

次のコードを変更する必要があります。

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

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

機能しない場合は、Espressoと呼ばれるGoogleのもう1つの優れたインストルメンテーションテストである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();
}

それが役に立てば幸い

31
piotrek1543

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())
}
6
IHeartAndroid

次のようにソフトキーボードを閉じる必要があるかもしれません:

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

この答え により詳細に説明されています。

4
CorayThan

AlertDialogの場合、各ボタンに割り当てられるIDは次のとおりです。

  • 正:_Android.R.id.button1_
  • ネガティブ:_Android.R.id.button2_
  • ニュートラル:_Android.R.id.button3_

AlertControllerクラス、setupButtons()メソッドで自分自身をチェックできます。したがって、次のようにクリックを実行できます。

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

1
giroxiii

最後の更新の良い点は、各テストの前にアクセス許可を設定できるため、ダイアログをクリックする必要がないことです(これによりテストが大幅にスピードアップします!)。

次のルールを使用します(たとえば、場所/ストレージ用です。これらを必要な権限に置き換えてください)

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

AlertControllerクラスでは、Android OSはAlertDialogボタンにIDを設定します。setupButtonsメソッドを確認してください。この記事の執筆時点では、たとえば、正のボタンIDは16908313。このように書くことができます

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

どこ DIALOG_POSITIVE_BUTTON_ID = 16908313

ネガティブボタンでも機能します

0
NovDanil