【问题标题】:How to catch a View with Tag by Espresso in Android?如何在 Android 中通过 Espresso 捕捉带有标签的视图?
【发布时间】:2021-05-18 05:24:47
【问题描述】:

我有一个扩展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"));

【问题讨论】:

    标签: android android-espresso


    【解决方案1】:

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

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

    【讨论】:

    • 哪里有is,我没找到
    • @LavekushAgrawal,感谢您的评论。我通过链接和更好的解释改进了我的答案。
    • 我需要:onView(withTagValue(Matchers.`is`(object)))
    • @hmac 检查你的导入。这个答案可以满足您的需要。如果您的文件缺少对 is 的访问权限,请检查您的导入行
    【解决方案2】:

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

    withTagValue(`is`(EXPECTED_TAG))
    

    在特定视图上声明标签的完整语法:

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

    简单:)

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 当您在 init() 方法中设置标签 setTag(...) 时,为什么在测试中使用 withId(...) 匹配器而不是 withTagValue(...) ?
      猜你喜欢
      • 1970-01-01
      • 2018-08-22
      • 1970-01-01
      • 2010-11-09
      • 2012-12-21
      • 2013-07-12
      • 1970-01-01
      • 2012-11-03
      • 2011-10-25
      相关资源
      最近更新 更多