web-dev-qa-db-ja.com

Espressoでダイアログが表示されるかどうかを確認します

新しい Android-test-kit(Espresso) を使用していくつかのテストを作成しようとしています。しかし、how-to-についての情報を見つけることができず、ダイアログが表示されているかどうかを確認し、ダイアログでいくつかのアクションを実行します(ポジティブボタンとネガティブボタンをクリックする、等)。ダイアログは、アプリケーション自体ではなくWebViewによっても表示される場合があることに注意してください。

任意の助けをいただければ幸いです。リンク、または基本的なコード例が必要です。

  1. ダイアログが表示されるかどうかを確認します
  2. ダイアログボタンをクリックする
  3. ダイアログの内部ビューと対話する(カスタムビューの場合)
  4. プリフォームはダイアログ外でクリックし、表示されているかどうかを確認します(たとえば、setCancelable(false)がダイアログビルダーで呼び出され、それを確認したい場合)

アドバイスありがとうございます!

73
Serj Lotutovici
  1. ダイアログが表示されるかどうかを確認するには、ダイアログ内にテキストが表示されているかどうかを確認するだけです。

    onView(withText("dialogText")).check(matches(isDisplayed()));
    

    または、IDのテキストに基づいて

    onView(withId(R.id.myDialogTextId)).check(matches(allOf(withText(myDialogText), isDisplayed()));
    
  2. ダイアログボタンをクリックするには、これを行います(button1-OK、button2-キャンセル):

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

    更新

  3. Espressoには マルチウィンドウサポート があるため、可能だと思います。
  4. カスタムダイアログビューの外側をクリックするかどうかはわかりませんが、表示されているかどうかを確認するには、カスタムマッチャーを作成して内部を確認する必要があります。
106
denys

私は現在これを使用していますが、うまくいくようです。

onView(withText(R.string.my_title))
    .inRoot(isDialog()) // <---
    .check(matches(isDisplayed()));
57
kiruwka

そのようなAlertDialogがある場合:

enter image description here

コンポーネントが表示されているかどうかを確認できます。

int titleId = mActivityTestRule.getActivity().getResources()
        .getIdentifier( "alertTitle", "id", "Android" );

onView(withId(titleId))
        .inRoot(isDialog())
        .check(matches(withText(R.string.my_title)))
        .check(matches(isDisplayed()));

onView(withId(Android.R.id.text1))
        .inRoot(isDialog())
        .check(matches(withText(R.string.my_message)))
        .check(matches(isDisplayed()));

onView(withId(Android.R.id.button2))
        .inRoot(isDialog())
        .check(matches(withText(Android.R.string.no)))
        .check(matches(isDisplayed()));

onView(withId(Android.R.id.button3))
        .inRoot(isDialog())
        .check(matches(withText(Android.R.string.yes)))
        .check(matches(isDisplayed()));

アクションを実行します。

onView(withId(Android.R.id.button3)).perform(click());
23
Luiz Augusto

私のように誰かがこの質問に出くわした場合に備えて。すべての回答は、ダイアログボタン付きのダイアログでのみ機能します。ユーザーの操作なしで、これを進行ダイアログに使用しないでください。 Espressoは、アプリがアイドル状態になるのを待ち続けます。進行状況ダイアログが表示されている限り、アプリはアイドル状態ではありません。

3
Diana Farin

受け入れられた答えではない質問4に答えるために、Toastが表示されたかどうかをテストするために、ここでStack Overflow( link )で見つけた次のコードを変更しました。

@NonNull
public static ViewInteraction getRootView(@NonNull Activity activity, @IdRes int id) {
    return onView(withId(id)).inRoot(withDecorView(not(is(activity.getWindow().getDecorView()))));
}

渡されるidは、ダイアログに現在表示されているViewのIDです。次のようにメソッドを書くこともできます。

@NonNull
public static ViewInteraction getRootView(@NonNull Activity activity, @NonNull String text) {
    return onView(withText(text)).inRoot(withDecorView(not(is(activity.getWindow().getDecorView()))));
}

そして今、特定のテキスト文字列を含むViewを探しています。

次のように使用します。

getRootView(getActivity(), R.id.text_id).perform(click());
2
AutonomousApps

ボタンID R.id.button1とR.id.button2は、デバイス間で同じになることはありません。 IDはOSのバージョンによって変わる場合があります。

これを実現する正しい方法は、UIAutomatorを使用することです。 build.gradleにUIAutomator依存関係を含めます

// Set this dependency to build and run UI Automator tests
  androidTestCompile 'com.Android.support.test.uiautomator:uiautomator-v18:2.1.2'

そして使用する

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

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