lig*_*igi 20 android android-espresso
当我在运行一些espresso测试时显示的布局中有ProgressBar时,我会遇到:
Caused by: android.support.test.espresso.AppNotIdleException: Looped for 1670 iterations over 60 SECONDS. The following Idle Conditions failed .
Run Code Online (Sandbox Code Playgroud)
解决这个问题的好方法是什么?找到一些hackish东西,但寻找一个很好的方式
tha*_*sma 14
如果在ProgressBar测试开始时它是不可见的,则Drawable可以用自定义替换ViewAction:
// Replace the drawable with a static color
onView(isAssignableFrom(ProgressBar.class)).perform(replaceProgressBarDrawable());
// Click a button (that will make the ProgressBar visible)
onView(withText("Show ProgressBar").perform(click());
Run Code Online (Sandbox Code Playgroud)
习俗ViewAction:
public static ViewAction replaceProgressBarDrawable() {
return actionWithAssertions(new ViewAction() {
@Override
public Matcher<View> getConstraints() {
return isAssignableFrom(ProgressBar.class);
}
@Override
public String getDescription() {
return "replace the ProgressBar drawable";
}
@Override
public void perform(final UiController uiController, final View view) {
// Replace the indeterminate drawable with a static red ColorDrawable
ProgressBar progressBar = (ProgressBar) view;
progressBar.setIndeterminateDrawable(new ColorDrawable(0xffff0000));
uiController.loopMainThreadUntilIdle();
}
});
}
Run Code Online (Sandbox Code Playgroud)
我也有同样的问题.我无法找到一个完全优雅的解决方案,但我也会发布我的方法.
我试图做的是覆盖indeterminateDrawableProgressBar上的.当具有简单的可绘制时,不会发生动画并且Espresso测试不会遇到空闲问题.
不幸的是main,androidTest对待它们.我没有找到覆盖ProgressBar样式的方法.
它现在最终结合了https://gist.github.com/Mauin/62c24c8a53593c0a605e#file-progressbar-java中的一些想法以及如何检测Android应用程序是否正在使用Espresso运行UI测试.
起初我创建了自定义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);
}
}
Run Code Online (Sandbox Code Playgroud)
调试代码:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我还添加了一个检查我的应用程序是否正在运行Espresso测试,而我正在搜索的类是我的Espresso测试的基础.
不好的是,您必须更新所有代码才能使用自定义ProgressBar.但好处是您的发布代码对此解决方案没有重大影响.
小智 7
我有类似的问题.早在第一次调用getActivity()时测试就失败了.因此,在活动开始后,必须更换ProgressBar的不确定drawable.
Application application = (Application)this.getInstrumentation().getTargetContext().getApplicationContext();
application.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
//not here, it's too early
}
@Override
public void onActivityStarted(Activity activity) {
//find the progressBar in your activity
ProgressBar progressBar = ((ProgressBar) activity.findViewById(R.id.progress_bar));
if(progressBar != null) {
//replace progress bar drawable as not animated
progressBar.setIndeterminateDrawable(new ColorDrawable(0xffff0000));
}
}
@Override
public void onActivityResumed(Activity activity) {
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
}
});
//Now you can start the activity
getActivity();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4376 次 |
| 最近记录: |