如何使用Android中的Espresso标记视图?

时间:2016-02-27 20:50:36

标签: android android-espresso

我的PinCodeView扩展了LinearLayout。我在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"));

3 个答案:

答案 0 :(得分:13)

由于withTagValue需要org.hamcrest.Matcher的实例作为参数,我们可以使用Matcher.is方法创建一个简单的实例 在您的expresso测试中查找具有特定标记的视图:

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

答案 1 :(得分:1)

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

首先我使用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"));

答案 2 :(得分:0)

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

withTagValue(`is`(EXPECTED_TAG))

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

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

简单:)