使用Espresso更新EditText

我正在尝试使用以下内容更新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或类似信息,并且必须使用上面显示的组合来标识正确的视图。

您可以使用replaceText方法。

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

要尝试三件事:

你可以连续运行表演。

 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”吗?

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

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

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

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

 onView(withId().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");