我也有同样的问题。我想不出一个完全优雅的解决方案,但我也会发布我的方法。
我试图做的是覆盖 ProgressBar 上的indeterminateDrawable。当有一个简单的 drawable 时,没有动画发生,并且 Espresso 测试没有遇到 Idle 问题。
很遗憾,main 和 androidTest 的处理方式相同。我没有找到覆盖我的 ProgressBar 样式的方法。
它现在最终结合了https://gist.github.com/Mauin/62c24c8a53593c0a605e#file-progressbar-java 和How to detect whether android app is running UI test with Espresso 的一些想法。
起初我创建了自定义 ProgressBar 类,一个用于调试,一个用于发布。发布版本只调用超级构造函数,不做任何其他事情。调试版本会覆盖方法setIndeterminateDrawable。有了这个,我可以设置一个简单的drawable而不是动画。
发布代码:
public class ProgressBar extends android.widget.ProgressBar {
public ProgressBar(Context context) {
super(context);
}
public ProgressBar(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ProgressBar(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public ProgressBar(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
}
调试代码:
public class ProgressBar extends android.widget.ProgressBar {
public ProgressBar(Context context) {
super(context);
}
public ProgressBar(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ProgressBar(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public ProgressBar(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
@SuppressWarnings("deprecation")
@Override
public void setIndeterminateDrawable(Drawable d) {
if (isRunningTest()) {
d = getResources().getDrawable(R.drawable.ic_replay);
}
super.setIndeterminateDrawable(d);
}
private boolean isRunningTest() {
try {
Class.forName("base.EspressoTestBase");
return true;
} catch (ClassNotFoundException e) {
/* no-op */
}
return false;
}
}
如您所见,我还添加了检查我的应用是否正在运行 Espresso 测试,而我正在搜索的类是我的 Espresso 测试的基础。
不好的是,您必须更新所有代码才能使用自定义 ProgressBar。但好在你的发布代码对这个解决方案没有重大影响。