如何使用 espresso 按下 AlertDialog 按钮
How to use espresso to press a AlertDialog button
我想使用 Espresso 按下面的按钮,但我不确定如何操作。我应该获取资源 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:层次结构中未找到匹配的视图:与文本:是 "GA NAAR INSTELLINGEN"
根据 Whosebug
类似的问题:Check if a dialog is displayed with Espresso
您应该更改您的代码:
onView(withText("GA NAAR INSTELLINGEN")).perform(click());
到
onView(withText("GA NAAR INSTELLINGEN")))
.inRoot(isDialog()) // <---
.check(matches(isDisplayed()))
.perform(click());
如果它不起作用,请不要费心将 long 用于 Espresso
另一个很棒的 Google 仪器测试 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();
}
希望对您有所帮助
您可能需要像这样关闭软键盘:
onView(withId(R.id.username))
.perform(typeText("username"))
.perform(closeSoftKeyboard())
onView(withId(android.R.id.button1)).perform((click()))
如 this answer 所详述。
因为 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())
}
上次更新的好处是它允许您在每次测试前设置权限,这样您就不必单击对话框(这大大加快了测试速度!)
使用以下规则(例如 location/storage.. 用您显然需要的权限替换这些规则)
@Rule
public GrantPermissionRule runtimePermissionRule = GrantPermissionRule.grant(
ACCESS_FINE_LOCATION, READ_EXTERNAL_STORAGE);
在 AlertController
class 中,Android OS 将 ID 设置为 AlertDialog 按钮。检查 setupButtons
方法。在写这篇文章的时候,例如,正面按钮的 id 是 16908313。所以你可以这样写
onView(withId(DIALOG_POSITIVE_BUTTON_ID)).check(matches(isDisplayed()));
其中 DIALOG_POSITIVE_BUTTON_ID
= 16908313
它也适用于我的否定按钮
对于 AlertDialog
,为每个按钮分配的 ID 是:
- 正面:
android.R.id.button1
- 否定:
android.R.id.button2
- 中性:
android.R.id.button3
您可以在AlertController
class、setupButtons()
方法中进行自我检查。
所以你可以按如下方式执行点击:
onView(withId(android.R.id.button1)).perform(click());
我想使用 Espresso 按下面的按钮,但我不确定如何操作。我应该获取资源 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:层次结构中未找到匹配的视图:与文本:是 "GA NAAR INSTELLINGEN"
根据 Whosebug
类似的问题:Check if a dialog is displayed with Espresso
您应该更改您的代码:
onView(withText("GA NAAR INSTELLINGEN")).perform(click());
到
onView(withText("GA NAAR INSTELLINGEN")))
.inRoot(isDialog()) // <---
.check(matches(isDisplayed()))
.perform(click());
如果它不起作用,请不要费心将 long 用于 Espresso
另一个很棒的 Google 仪器测试 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();
}
希望对您有所帮助
您可能需要像这样关闭软键盘:
onView(withId(R.id.username))
.perform(typeText("username"))
.perform(closeSoftKeyboard())
onView(withId(android.R.id.button1)).perform((click()))
如 this answer 所详述。
因为 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())
}
上次更新的好处是它允许您在每次测试前设置权限,这样您就不必单击对话框(这大大加快了测试速度!)
使用以下规则(例如 location/storage.. 用您显然需要的权限替换这些规则)
@Rule
public GrantPermissionRule runtimePermissionRule = GrantPermissionRule.grant(
ACCESS_FINE_LOCATION, READ_EXTERNAL_STORAGE);
在 AlertController
class 中,Android OS 将 ID 设置为 AlertDialog 按钮。检查 setupButtons
方法。在写这篇文章的时候,例如,正面按钮的 id 是 16908313。所以你可以这样写
onView(withId(DIALOG_POSITIVE_BUTTON_ID)).check(matches(isDisplayed()));
其中 DIALOG_POSITIVE_BUTTON_ID
= 16908313
它也适用于我的否定按钮
对于 AlertDialog
,为每个按钮分配的 ID 是:
- 正面:
android.R.id.button1
- 否定:
android.R.id.button2
- 中性:
android.R.id.button3
您可以在AlertController
class、setupButtons()
方法中进行自我检查。
所以你可以按如下方式执行点击:
onView(withId(android.R.id.button1)).perform(click());