Тестирование цвета фона espresso Android

Можно ли проверить, соответствует ли цвет фона данному цвету эспрессо?

Обновление:

Я сделал собственное сопоставление, похожее на то, что предложил @Irfan, спасибо!

public static Matcher<Object> backgroundShouldHaveColor(int expectedColor) {
    return buttondShouldHaveBackgroundColor(equalTo(expectedColor));
}
private static Matcher<Object> buttonShouldHaveBackgroundColor(final Matcher<Integer> expectedObject) {
    final int[] color = new int[1];
    return new BoundedMatcher<Object, Button>( Button.class) {
        @Override
        public boolean matchesSafely(final Button actualObject) {

            color[0] =((ColorDrawable) actualObject.getBackground()).getColor();


            if( expectedObject.matches(color[0])) {
                return true;
            } else {
                return false;
            }
        }
        @Override
        public void describeTo(final Description description) {
            // Should be improved!
            description.appendText("Color did not match "+color[0]);
        }
    };
}

Ответ 1

Я не уверен в этом, но мы можем получить цвет некоторых элементов, таких как кнопки и текстовые представления.

Button button = (Button) findViewById(R.id.my_button);
Drawable buttonBackground = button.getBackground();

и ты можешь попробовать вот так

ColorDrawable b_color = (ColorDrawable) button.getBackground();

а потом

int color = b_color.getColor();
if (color == R.color.green) {
    log("color is green");
}

Надеюсь, это поможет вам начать.

Ответ 2

В моих тестах у меня есть следующий матчи для тестирования цвета EditText:

public static Matcher<View> withTextColor(final int color) {
    Checks.checkNotNull(color);
    return new BoundedMatcher<View, EditText>(EditText.class) {
        @Override
        public boolean matchesSafely(EditText warning) {
            return color == warning.getCurrentTextColor();
        }
        @Override
        public void describeTo(Description description) {
            description.appendText("with text color: ");
        }
    };
}

И используется:

onView(withId(R.id.password_edittext)).check(matches(withTextColor(Color.RED)));

Ответ 3

private fun hasBackgroundColor(colorRes: Int): Matcher<View> {
    Checks.checkNotNull(colorRes)

    return object : TypeSafeMatcher<View>() {
        override fun describeTo(description: Description?) {
            description?.appendText("background color: $colorRes")
        }

        override fun matchesSafely(item: View?): Boolean {

            val context = item?.context
            val textViewColor = (item?.background as ColorDrawable).color
            val expectedColor: Int?

            if (Build.VERSION.SDK_INT <= 22) {
                expectedColor = context?.resources?.getColor(colorRes)
            } else {
                expectedColor = context?.getColor(colorRes)
            }

            return textViewColor == expectedColor
        }
    }
}

Ответ 4

Вот что я использую в своих тестах

public static Matcher<View> withTextColor(final int color) {
    Checks.checkNotNull(color);
        return new BoundedMatcher<View, TextView>(TextView.class) {
            @Override
            public boolean matchesSafely(TextView textView) {
                return ContextCompat.getColor(getTargetContext(),color)==textView.getCurrentTextColor();
            }
            @Override
            public void describeTo(Description description) {
                description.appendText("with text color: ");
            }
        };
}

и назовите его

OnView (withId (R.id.price_value)) проверить (матчи (withTextColor (R.color.black)));.

Ответ 5

Другой подход для проверки цвета текста TextView может быть через hasTextColor(int color), поскольку он приходит непосредственно из Espresso.

import static android.support.test.espresso.matcher.ViewMatchers.hasTextColor;

onView(withId(R.id.anyTextView)).check(matches(hasTextColor(R.color.red)));

Имейте в виду, что этот метод в настоящее время находится в бета-версии для Espresso 3.0.1

Ответ 6

Можно проверить на цвете. Я создал метод для тестирования на цвет фона TextView как TextView ниже. Также обратите внимание, что пропускаю цветной ресурс.

 private fun withBackgroundColor(@ColorInt color: Int): Matcher<View> {
        Checks.checkNotNull(color)
        return object : BoundedMatcher<View, TextView>(TextView::class.java) {
            override fun describeTo(description: Description?) {
                description?.appendText("TextView background color to be $color")
            }

            override fun matchesSafely(item: TextView?): Boolean {
                val backgroundColor = item?.background as ColorDrawable
                val colorDrawable = ColorDrawable(ContextCompat.getColor(item.context, color))
                return colorDrawable.color == backgroundColor.color
            }

        }
    }

Я создаю объект ColorDrawable из цветового ресурса и получаю цвет от объекта.

Сравнение цвета из ресурса без ColorDrawable не проходит. Надеюсь, это поможет вам.

Ответ 7

Учитывая, что у вас есть список цветов, создайте их массив:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="black">#000000</color>
    <color name="white">#FFFFFF</color>
    <array name="colors">
        <item>@color/black</item>
        <item>@color/white</item>
    </array>
</resources>

Затем вы получите этот массив и цикл:

int[] colors = context.getResources().getIntArray(R.array.colors);

for (int i = 0; i < colors.length; i++) {
    // Compare your color with 'colors[i]'
}