Тестирование цвета фона 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]'
}