35

Espresso を使用して、リスト ビュー内のテキストをクリックしようとしています。彼らがこのガイドを持っていることは知っていますが、テキストを探してこれを機能させる方法がわかりません。これは私が試したものです

Espresso.onData(Matchers.allOf(Matchers.is(Matchers.instanceOf(ListView.class)), Matchers.hasToString(Matchers.startsWith("ASDF")))).perform(ViewActions.click());

予想通り、これはうまくいきませんでした。エラーは、階層にビューがないことを示していました。文字列を選択する方法を知っている人はいますか? ("ASDF"この場合)よろしくお願いします。

@haffaxによる更新

エラーを受け取りました:

com.google.android.apps.common.testing.ui.espresso.AmbiguousViewMatcherException: 'is assignable from class: class android.widget.AdapterView' は、階層内の複数のビューに一致します。

2 番目のエラー

このコードで

onData(hasToString(startsWith("ASDF"))).inAdapterView(withContentDescription("MapList")).perform(click());

このエラーが発生します

com.google.android.apps.common.testing.ui.espresso.PerformException: ビューで「アダプター データの読み込み」を実行中にエラーが発生しました。「コンテンツの説明: is "MapList"」です。

原因: java.lang.RuntimeException: 一致するデータが見つかりません: asString("ASDF" で始まる文字列)


解決

onData(anything()).inAdapterView(withContentDescription("desc")).atPosition(x).perform(click())

4

3 に答える 3

44

instanceOf(ListView.class)問題は、リスト ビュー自体をas の引数と一致させようとすることですonData()onData()の適応データと一致するデータマッチャーが必要です。それ自体ではなく、ListView返されるではなく、実際のデータと一致します。ListViewViewAdapter.getView()

本番コードに次のようなものがある場合:

ListView listView = (ListView)findViewById(R.id.myListView);
ArrayAdapter<MyDataClass> adapter = getAdapterFromSomewhere();
listView.setAdapter(adapter);

次に、 の Matcher 引数はEspresso.onData()、 の目的のインスタンスと一致する必要がありますMyDataClass。したがって、次のようなものが機能するはずです。

onData(hasToString(startsWith("ASDF"))).perform(click());

( のメソッドを使用して別の Matcher を使用できますorg.hamcrest.Matchers)

アクティビティに複数のアダプター ビューがある場合はViewMatchers.inAdapterView()、次のように AdapterView を指定するビュー マッチャーを使用して呼び出すことができます。

onData(hasToString(startsWith("ASDF")))
    .inAdapterView(withId(R.id.myListView))
    .perform(click());
于 2014-04-09T19:58:31.840 に答える
0
onData(hasEntry(equalTo(ListViewActivity.ROW_TEXT),is("List item: 25")))
        .onChildView(withId(R.id.rowTextView)).perform(click());

これは、行テキストデータを使用する場合に最適です..

于 2016-01-30T09:02:26.760 に答える