Espressoを使用してリストビューでテキストをクリックしようとしています。私は彼らが このガイド を持っていることを知っていますが、テキストを探してこの作業を行う方法がわかりません。これは私が試したものです
Espresso.onData(Matchers.allOf(Matchers.is(Matchers.instanceOf(ListView.class)), Matchers.hasToString(Matchers.startsWith("ASDF")))).perform(ViewActions.click());
予想どおり、これは機能しませんでした。エラーは、階層にビューがないことを示しました。誰もが文字列を選択する方法を知っていますか? ("ASDF"
この場合)事前に感謝します。
エラーを受け取りました:
com.google.Android.apps.common.testing.ui.espresso.AmbiguousViewMatcherException:「クラスから割り当て可能:クラスAndroid.widget.AdapterView」は階層内の複数のビューに一致します。
このコードで
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())
問題は、リストビュー自体をinstanceOf(ListView.class)
の引数としてonData()
と一致させようとすることです。 onData()
には、ListView
自体ではなく、ListView
でもなく、Adapter.getView()
でもないView
の適合データに一致するデータマッチャーが必要です。戻りますが、実際のデータ。
本番コードに次のようなものがある場合:
_ListView listView = (ListView)findViewById(R.id.myListView);
ArrayAdapter<MyDataClass> adapter = getAdapterFromSomewhere();
listView.setAdapter(adapter);
_
次に、Espresso.onData()
のMatcher引数は、MyDataClass
の目的のインスタンスと一致する必要があります。だから、このような何かが動作するはずです:
_onData(hasToString(startsWith("ASDF"))).perform(click());
_
(_org.hamcrest.Matchers
_のメソッドを使用して別のマッチャーを使用できます)
アクティビティに複数のアダプタービューがある場合、次のようにAdapterViewを指定するビューマッチャーでViewMatchers.inAdapterView()
を呼び出すことができます。
_onData(hasToString(startsWith("ASDF")))
.inAdapterView(withId(R.id.myListView))
.perform(click());
_
アダプタにItem
などのカスタムモデルクラスがある場合:
public static Matcher<Object> withItemValue(final String value) {
return new BoundedMatcher<Object, Item>(Item.class) {
@Override
public void describeTo(Description description) {
description.appendText("has value " + value);
}
@Override
public boolean matchesSafely(Item item) {
return item.getName().toUpperCase().equals(String.valueOf(value));
}
};
}
次に、以下を呼び出します。
onData(withItemValue("DRINK1")).inAdapterView(withId(R.id.menu_item_grid)).perform(click());
onData(hasEntry(equalTo(ListViewActivity.ROW_TEXT),is("List item: 25")))
.onChildView(withId(R.id.rowTextView)).perform(click());
これは、行テキストデータの場合に最適です。