Android UIautomator 滑动 ViewAnimator

Android UIautomator swiping ViewAnimator

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

该结构有点棘手,但我使用

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

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

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

2) 11月都过去了(甚至2017年11月或2015年11月...)

我怎样才能创造这个条件。在所有视图都以独特的方式命名之后,检查结构可能会找到“2016 年 11 月 1 日”。

好的,看来我找到了一个或多或少可以正常工作的解决方案:

起初我尝试使用子条件,因为 UiSelector 可能有子定义。但事实证明这很难,因为 ViewAnimator 内部是一个包含 "calendar month" 视图的(单个)子对象 ListView。 因此,在其中找到描述为“12 月 15 日...”的子视图很棘手。

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

  1. 同时(尝试 < MAX_TRIES)
  2. 如果描述为“12 月 15 日 ...”的元素存在 -> 单击并退出循环
  3. 向下滚动 1 个元素(下个月) -> 尝试++

我重复此操作,直到找到(并单击)该元素或用尽最大滚动尝试次数。 滚动后我让设备等待 1 秒。这很有用,因为滑动是异步调用的,并且会在处理点击时继续滑动片刻。 这没有显示为问题(因为视图已被单击)但仍然可能令人困惑。

希望对您有所帮助!如果您找到更好的解决方案,请随时post。

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);
       }
}