web-dev-qa-db-ja.com

エスプレッソを使用してテキストビューからテキストを取得する方法

LinearLayoutのテキストビューに表示されるテキスト文字列を取得します。エスプレッソはそれを行うことができますか?そうでない場合、他に方法はありますか、またはAndroid apiを使用できますか?私はAPI 17 18以降のespresso 1.1を使用しています(最新のものである必要があります)。 。私にはこれについての手がかりはありません。

20
Nick Dong

基本的な考え方は、performメソッド内のテキストを取得する内部ViewActionを持つメソッドを使用することです。匿名クラスは最終フィールドにしかアクセスできないため、getText()のローカル変数を設定するだけではなく、Stringの配列を使用してViewActionから文字列を取得します。

String getText(final Matcher<View> matcher) {
    final String[] stringHolder = { null };
    onView(matcher).perform(new ViewAction() {
        @Override
        public Matcher<View> getConstraints() {
            return isAssignableFrom(TextView.class);
        }

        @Override
        public String getDescription() {
            return "getting text from a TextView";
        }

        @Override
        public void perform(UiController uiController, View view) {
            TextView tv = (TextView)view; //Save, because of check in getConstraints()
            stringHolder[0] = tv.getText().toString();
        }
    });
    return stringHolder[0];
}

注:この種のビューデータ検索機能は注意して使用する必要があります。この種のメソッドを常に作成していることに気付いている場合は、最初から何かが間違っている可能性があります。また、ViewAssertionまたはViewActionの外部でビューにアクセスしないでください。UIスレッドから実行され、実行前に、相互作用が安全であることが確認されているためです。他の相互作用が干渉しないことを確認します。

40
haffax

別のテキストでテキスト値をチェックする場合は、マッチャーを作成できます。あなたは私のコードを見てあなた自身のメソッドを作成することができます:

 public static Matcher<View> checkConversion(final float value){
    return new TypeSafeMatcher<View>() {

        @Override
        protected boolean matchesSafely(View item) {
            if(!(item instanceof TextView)) return false;

            float convertedValue = Float.valueOf(((TextView) item).getText().toString());
            float delta = Math.abs(convertedValue - value);

            return delta < 0.005f;
        }

        @Override
        public void describeTo(Description description) {
            description.appendText("Value expected is wrong");
        }
    };
}
6
emaleavil