我的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"));
答案 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))
)
)
简单:)