Android 4.1开始引入的Uiautomator测试框架非常好用,但由于不够重视还缺失很多功能以及Bug。

本文描述一则Bug,该Bug导致Uiautomator中Configure.setWaitForIdleTimeout()设置的值无效。

由于Uiautomator在所有操作前几乎都会waitForIdle(),对于界面持续变化的App来说总是需要等待10s超时后才能操作一步,解决方法之一是使用Configure.setWaitForIdleTimeout()设置超时时间,然而这个方法并没有起到预期的效果。

Bug之处在于当findAccessibilityNodeInfo中的waitForIdle()时,调用的是无参数waitForIdle(),由此调用到最终的UiAutomatorBridge中的无参数waitForIdle(),这个函数是这样的

public void waitForIdle() {
  waitForIdle(TOTAL_TIME_TO_WAIT_FOR_IDLE_STATE);
}

public void waitForIdle(long timeout) {
  try {
    mUiAutomation.waitForIdle(QUIET_TIME_TO_BE_CONSIDERD_IDLE_STATE, timeout);
  } catch (TimeoutException te) {
    Log.w(LOG_TAG, “Could not detect idle state.”, te);
  }
}

而TOTAL_TIME_TO_WAIT_FOR_IDLE_STATE正等于10s,由此可见这是Google的疏忽导致只有UiDevice.waitForIdle()会读取Configure中的超时值。