web-dev-qa-db-ja.com

エスプレッソ-リストビューでテキストをクリック

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:「クラスから割り当て可能:クラス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())

34
Chad Bingham

問題は、リストビュー自体を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());
_
41
haffax

アダプタに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());
2
Veer
onData(hasEntry(equalTo(ListViewActivity.ROW_TEXT),is("List item: 25")))
        .onChildView(withId(R.id.rowTextView)).perform(click());

これは、行テキストデータの場合に最適です。

0
anuja jain