在 Espresso 中测试相对布局的内容

Testing contents of a Relative Layout in Espresso

我有以下结构:

+------------>LinearLayout{id=2131689635, res-name=ll_monthly_advance_payments_container, 
|
+------------->LinearLayout{id=2131689636,  res-name=ll_monthly_advance_payments_list_container, 
|
+-------------->LeftRightListItemView{id=-1, 
|
+--------------->RelativeLayout{id=-1, 
|
+---------------->ScrollableTextView{id=2131689786, res-name=stv_left, text=Electricity
|
+---------------->AppCompatTextView{id=2131689787, res-name=tv_right, text=53.00 EUR
|
+-------------->LeftRightListItemView{id=-1, 
|
+--------------->RelativeLayout{id=-1, 
|
+---------------->ScrollableTextView{id=2131689786, res-name=stv_left, text=Water
|
+---------------->AppCompatTextView{id=2131689787, res-name=tv_right, text=251.00 EUR
|
+-------------->LeftRightListItemView{id=-1, 
|
+--------------->RelativeLayout{id=-1, 
|
+---------------->ScrollableTextView{id=2131689786, res-name=stv_left, text=Totals
|
+---------------->AppCompatTextView{id=2131689787, res-name=tv_right, text=304.00 EUR

我想做的是测试成对的 stv_lefttv_right 是否包含正确的值。我可以使用以下脚本分别确认每一个:

onView(allOf(withId(R.id.tv_right), withText("53.00 EUR"), isDescendantOfA(withId(R.id.ll_monthly_advance_payments_list_container))));

我无法确认他们是一对。我该如何解决这个问题?

你有 ListView 吗?然后你可以使用 onData DataInteraction 而不是 onView ViewInteraction。

如果这不可行,您可以使用 hasSibling 匹配器,例如这样:

onView(allOf(withId(R.id.stv_left), withText("Electricity"),
    hasSibling(allOf(withId(R.id.tv_right), withText("53.00 EUR"))),
    isDescendantOfA(withId(R.id.ll_monthly_advance_payments_list_container))));

但你可能想在 check() 中像这样进行文本匹配(我还删除了一些对我来说似乎不需要的匹配器):

onView(allOf(
    withId(R.id.tv_right),
    hasSibling(withText("Electricity"))))
.check(matches(withText("53.00Euro")));

两者都对我有用。

我偶然发现的另一种解决方案是:

onView(allOf(withText("Elecrtricity"),
    withText("53.00 EUR"),
    isDescendantOfA(withId(R.id.ll_monthly_advance_payments_list_container))));