新しい Android-test-kit(Espresso) を使用していくつかのテストを作成しようとしています。しかし、how-to-についての情報を見つけることができず、ダイアログが表示されているかどうかを確認し、ダイアログでいくつかのアクションを実行します(ポジティブボタンとネガティブボタンをクリックする、等)。ダイアログは、アプリケーション自体ではなくWebView
によっても表示される場合があることに注意してください。
任意の助けをいただければ幸いです。リンク、または基本的なコード例が必要です。
setCancelable(false)
がダイアログビルダーで呼び出され、それを確認したい場合)アドバイスありがとうございます!
ダイアログが表示されるかどうかを確認するには、ダイアログ内にテキストが表示されているかどうかを確認するだけです。
onView(withText("dialogText")).check(matches(isDisplayed()));
または、IDのテキストに基づいて
onView(withId(R.id.myDialogTextId)).check(matches(allOf(withText(myDialogText), isDisplayed()));
ダイアログボタンをクリックするには、これを行います(button1-OK、button2-キャンセル):
onView(withId(Android.R.id.button1)).perform(click());
更新
私は現在これを使用していますが、うまくいくようです。
onView(withText(R.string.my_title))
.inRoot(isDialog()) // <---
.check(matches(isDisplayed()));
そのようなAlertDialogがある場合:
コンポーネントが表示されているかどうかを確認できます。
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());
私のように誰かがこの質問に出くわした場合に備えて。すべての回答は、ダイアログボタン付きのダイアログでのみ機能します。ユーザーの操作なしで、これを進行ダイアログに使用しないでください。 Espressoは、アプリがアイドル状態になるのを待ち続けます。進行状況ダイアログが表示されている限り、アプリはアイドル状態ではありません。
受け入れられた答えではない質問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());
ボタン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();
}