web-dev-qa-db-ja.com

エスプレッソは含まれているレイアウトの子を選択します

私はEspressoを使用してAndroidアプリで自動UIテストを実行しています。自宅で仕事中に問題の解決策を見つけようとしているので、正確な例とエラーですが、明日の朝に更新できます。単一のユーザーインターフェイスに複数回含まれているレイアウト内のユニットテストボタンで問題が発生しました。以下に簡単な例を示します。

<include 
   Android:id="@+id/include_one"
   Android:layout="@layout/boxes" />

<include 
   Android:id="@+id/include_two"
   Android:layout="@layout/boxes" />

<include 
    Android:id="@+id/include_three"
    Android:layout="@layout/boxes" />

@ layout/boxes内の例を次に示します。

<RelativeLayout
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">
    <Button
        Android:id="@+id/button1" />
    <Button
        Android:id="@+id/button2" />
</RelativeLayout>

3つのボタンすべてにアクセスしないと、「include_one」が必要なインクルード内のボタン1にアクセスできないようです。

次の方法でボタンにアクセスしてみました。

onView(allOf(withId(R.id.include_one), isDescendantOfA(withId(R.id.button1)))).perform(click());

そして

onView(allOf(withId(R.id.button1), hasParent(withId(R.id.include_one)))).perform(click());

どちらもこの回答から見つかりました: onChildViewおよびEspressoを使用したhasSiblings 残念ながら、成功していません!

これは素晴らしいことではないことはわかっていますが、仕事用のコンピュータを持っていないので、発生した正確なエラーを伝えることはできませんが、次のような問題が発生しました。

com.google.Android.apps.common.testing.ui.espresso.AmbiguousViewMatcherException

また、一致するものが見つからなかったことを通知するエラー。

Espressoを使用するのは初めてですが、使用しているコードには意味があります。誰かが何かアドバイスを提供したり、誤解していることを指摘したりできますか?

18
jordan_terry

これは、同じレイアウトで同じカスタムxmlを数回<include/>しようとするときによくある落とし穴です。

今電話してみたら

Button button1 = (Button) findViewById(R.id.button1);

boxes.xmlは複数回含まれているため、結果として最初のサブレイアウトにボタンが常に表示され、別のサブレイアウトは表示されません。

かなり近かったのですが、withParent()ビューマッチャーを使用する必要があります。

onView(allOf(withId(R.id.button1), withParent(withId(R.id.include_one))))
                .check(matches(isDisplayed()))
                .perform(click());
22
appoll