Android Espresso - 等待异步加载

时间:2017-01-13 18:09:16

标签: android asynchronous android-recyclerview android-espresso ui-testing

我有一个RecyclerView,数据以异步方式加载。

底层引擎不使用AsyncTasks,而是使用java Executor。

如何让Espresso在超时后等待(或定期检查),直到满足给定条件?

我读过有关IdlingResource的内容,但在我看来,根据具体情况进行挖掘太深,可能存在一些通用的东西,可以定期检查条件,直到它已完成或超时发生。

如果符合条件,

无法每隔几百毫秒检查一次?无需钻研内部工作...... 这会是性能问题吗?

1 个答案:

答案 0 :(得分:0)

您可以使用类似waitFor方法的内容。

public class WaitAction implements ViewAction {

  /** The amount of time to allow the main thread to loop between checks. */

  private final Matcher<View> condition;
  private final long timeoutMs;

  public WaitAction(Matcher<View> condition, long timeout) {
    this.condition = condition;
    this.timeoutMs = timeout
  }

  @Override
  public Matcher<View> getConstraints() {
    return (Matcher) anything();
  }

  @Override
  public String getDescription() {
    return "wait";
  }

  @Override
  public void perform(UiController controller, View view) {
    controller.loopMainThreadUntilIdle();
    final long startTime = System.currentTimeMillis();
    final long endTime = startTime + timeoutMs;

    while (System.currentTimeMillis() < endTime) {
      if (condition.matches(view)) {
        return;
      }

      controller.loopMainThreadForAtLeast(100);
    }

    // Timeout.
    throw new PerformException();
  }

  public static ViewAction waitFor(Matcher<View> condition, long timeout) {
    return new WaitAction(condition, timeout);
  }
}

您可以将其用作以下内容

onView(<some view matcher>).perform(WaitAction.waitFor(<Some condition>));