如何在 Android 中通过 Espresso 捕捉带有标签的视图?

How to catch a View with Tag by Espresso in Android?

我有一个扩展 LinearLayoutPinCodeView。我的 init() 方法中有以下代码。 DigitEditText 扩展 EditText 并且只接受一位数字。此视图将用于接收4位长的确认码。

private void init()
{
    ...

    for (int i = 0; i < 4; i++)
    {
        DigitEditText digitView = getDigitInput();
        digitView.setTag(R.id.etPinCodeView, i); // uses for Espresso testing
        digitView.setKeyEventCallback(this);
        ...
}

我创建了 res/values/ids.xml,这是它的内容:

<resources>
    <item name="etPinCodeView" type="id"/>
</resources>

现在,在 Espresso 中,我想捕捉每个 DigitEditText 并在其中输入一个数字。我怎么能做到这一点?我看到有两种方法,withTagKey()withTagValue() 但我不知道如何让它们起作用。

我认为这样的事情可能有效,但似乎我无法将 0 分配给 withTagValue()

onView(allOf(withTagKey(R.id.etPinCodeView), withTagValue(matches(0)))).perform(typeText("2"));

我用这个技巧解决了我的问题。希望它能为您节省一些时间。

首先我使用 Id 而不是 tag

for (int i = 0; i < 4; i++)
    {
        DigitEditText digitView = getDigitInput();
        digitView.setId(R.id.etPinCodeView + i); // uses for Espresso testing
        digitView.setKeyEventCallback(this);
        ...

这是测试:

onView(withId(R.id.etPinCodeView + 0)).perform(typeText("2"));
onView(withId(R.id.etPinCodeView + 1)).perform(typeText("0"));
onView(withId(R.id.etPinCodeView + 2)).perform(typeText("1"));
onView(withId(R.id.etPinCodeView + 3)).perform(typeText("6"));

因为 withTagValue needs an instance of org.hamcrest.Matcher as an argument, we can create a simple one using the Matcher.is 方法 在您的 expresso 测试中查找带有特定标签的视图:

String tagValue = "lorem impsum";
ViewInteraction viewWithTagVI = onView(withTagValue(is((Object) tagValue)));

在应用中某处的视图中设置标签后,对于那些对 Kotlin 中的语法感到困惑的人:

withTagValue(`is`(EXPECTED_TAG))

在特定视图上断言标记的完整语法:

onView(
   allOf(
       withId(R.id.some_id),
       withTagValue(`is`(EXPECTED_TAG))
   )
)

简单:)