エスプレッソで下のボタンを押したいのですが、どうすればいいのかわかりません。リソースIDを取得する必要がありますか?または、AlertDialogにIDを設定する方法は?
@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"
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();
}
それが役に立てば幸い
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())
}
次のようにソフトキーボードを閉じる必要があるかもしれません:
onView(withId(R.id.username))
.perform(typeText("username"))
.perform(closeSoftKeyboard())
onView(withId(Android.R.id.button1)).perform((click()))
この答え により詳細に説明されています。
AlertDialog
の場合、各ボタンに割り当てられるIDは次のとおりです。
Android.R.id.button1
_Android.R.id.button2
_Android.R.id.button3
_AlertController
クラス、setupButtons()
メソッドで自分自身をチェックできます。したがって、次のようにクリックを実行できます。
onView(withId(Android.R.id.button1)).perform(click());
最後の更新の良い点は、各テストの前にアクセス許可を設定できるため、ダイアログをクリックする必要がないことです(これによりテストが大幅にスピードアップします!)。
次のルールを使用します(たとえば、場所/ストレージ用です。これらを必要な権限に置き換えてください)
@Rule
public GrantPermissionRule runtimePermissionRule = GrantPermissionRule.grant(
ACCESS_FINE_LOCATION, READ_EXTERNAL_STORAGE);
AlertController
クラスでは、Android OSはAlertDialogボタンにIDを設定します。setupButtons
メソッドを確認してください。この記事の執筆時点では、たとえば、正のボタンIDは16908313。このように書くことができます
onView(withId(DIALOG_POSITIVE_BUTTON_ID)).check(matches(isDisplayed()));
どこ DIALOG_POSITIVE_BUTTON_ID
= 16908313
ネガティブボタンでも機能します