45

我正在尝试通过以下方式更新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")

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

请注意,在这种情况下,我不能使用资源 ID 或类似名称,必须使用如上所示的组合来识别正确的视图。

4

5 回答 5

52

您可以使用该replaceText方法。

onView(allOf(withClassName(endsWith("EditText")), withText(is("Test"))))
    .perform(replaceText("Another test"));
于 2015-11-13T20:10:33.153 回答
26

尝试三件事:

1.可以连续执行。

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

2. Espresso 页面上有一个被标记为无效的记录问题(但仍然是一个非常大的错误)。解决方法是在执行之间暂停测试。

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 包含文本“Test”吗?

于 2014-10-15T17:28:01.023 回答
4

使用 Espresso 在 EditText 中设置值很简单,如下所示

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

于 2019-09-20T03:51:47.877 回答
2

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

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

你可以在这里看到完整的代码

于 2016-03-08T19:55:41.327 回答
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");
于 2014-05-21T20:45:23.533 回答