使用Espresso更新EditText

时间:2014-05-21 10:41:06

标签: android android-espresso

我正在尝试使用以下内容更新EditText作为Espresso测试的一部分

onView(allOf(withClassName(endsWith("EditText")), withText(is("Test")))).perform(clearText())
                                                                        .perform(click())
                                                                        .perform(typeText("Another test"));

但是我收到以下错误:

com.google.android.apps.common.testing.ui.espresso.NoMatchingViewException: No views in hierarchy found matching: (with class name: a string ending with "EditText" and with text: is "Test")

通过分解测试线我可以看到在执行clearText()之后发生这种情况,所以我假设匹配器在每个perform之前重新运行并且在第二个动作之前失败。虽然这是有道理的,但是我对如何使用Espresso更新EditText感到有些困惑。我该怎么做?

请注意,我无法在此方案中使用资源ID或类似资源,必须使用上面所示的组合来识别正确的视图。

5 个答案:

答案 0 :(得分:34)

您可以使用replaceText方法。

onView(allOf(withClassName(endsWith("EditText")), withText(is("Test"))))
    .perform(replaceText("Another test"));

答案 1 :(得分:13)

尝试三件事:

1。您可以连续执行演出。

onView(...)
    .perform(clearText(), typeText("Some Text"));

2。有一个recorded issue on the Espresso page被标记为无效(但仍然是一个很大的错误)。对此的解决方法是在执行之间暂停测试。

public void test01(){
    onView(...).perform(clearText(), typeText("Some Text"));
    pauseTestFor(500);
    onView(...).perform(clearText(), typeText("Some Text"));
}

private void pauseTestFor(long milliseconds) {
    try {
        Thread.sleep(milliseconds);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

3。您是否完全确定您的EditText包含文字,"测试"?

答案 2 :(得分:2)

我遇到了类似的问题,并使用containsString matcher和Class.getSimpleName()解决了它。像这样:

onView(withClassName(containsString(PDFViewPagerIVZoom.class.getSimpleName()))).check(matches(isDisplayed()));

您可以看到完整代码here

答案 3 :(得分:2)

使用Espresso在EditText中设置值 像这样简单

onView(withId(R.id.yourIdEditText)).perform(typeText("Your Text"))

答案 4 :(得分:1)

你可以尝试两件事。首先我会尝试使用

onView(withId(<id>).perform... 

这样,即使屏幕上显示其他EditText字段,您也始终可以访问EditText字段。

如果这不是一个选项,您可以拆分执行调用。

onView(allOf(withClassName(endsWith("EditText")),withText(is("Test")))).perform(clearText());
onView(withClassName(endsWith("EditText"))).perform(click());
onView(withClassName(endsWith("EditText"))).perform(typeText("Another Test");