Android UIautomator刷ViewAnimator

时间:2016-11-25 08:45:37

标签: android unit-testing testing ui-automation android-uiautomator

我正在测试我的应用,但是DatePicker有问题。 我需要的是向下滑动直到另一个月出现(搜索特定日期)。

Screenshot

结构有点棘手但我使用

使其工作
new UiScrollable(new UiSelector().className(android.widget.ViewAnimator.class.getName())).scrollTextIntoView("November")

问题是,即使视图滚动,也是

1)向错误的方向滚动(向上)

2)即使11月已经过去,也不会停止。(即使是2017年11月或2015年11月......)

如何创建此条件。在以独特方式命名所有视图之后,检查结构将有可能找到" 2016年11月1日"。

Structure

1 个答案:

答案 0 :(得分:0)

好吧,看起来我找到了一个或多或少都能正常运作的解决方案:

起初我尝试使用子条件,因为UiSelector可能有子定义。但事实证明这很难,因为ViewAnimator内部是一个包含“日历月”视图的(单个)子对象ListView。 所以在那里找到一个带有描述“12月15日......”的儿童观看是很棘手的。

新解决方案就是这样做的。

  1. while(尝试< MAX_TRIES)
  2. 如果存在描述为“12月15日......”的元素 - >点击并退出循环
  3. 向下滚动1个元素(下个月) - >试图++
  4. 我重复此操作,直到找到元素(并单击)或最大滚动尝试耗尽为止。 滚动后我让设备等待1秒钟。这很有用,因为滑动是异步调用的,并且在处理点击时会继续滑动片刻。 这并没有显示出问题(因为视图已被点击)但仍然可能令人困惑。

    我希望这有帮助!如果找到更好的解决方案,请随时发布更好的解决方案。

    int tries = 0;
    while (tries < MAX_TRIES) {
       UiObject2 dateField = mDevice.findObject(
               By.descStartsWith(SEARCH_DATE));
           if (dateField != null) {
               dateField.click();
               break;
           } else {
               tries ++;
               new UiScrollable(new UiSelector().
                       className(android.widget.ViewAnimator.class.getName())).
                       scrollToEnd(1);
               mDevice.wait(Until.findObject(By.descStartsWith(SEARCH_DATE)), 1000);
           }
    }