腾讯Android自动化测试实战
上QQ阅读APP看书,第一时间看更新

3.3.2 ListView列表遍历

编写Android端的自动化测试用例,最常见的控件有ListView,而要想测试ListView,就必然要涉及ListView的遍历。

关于ListView的遍历,可能首先想到的是类似如代码清单3-20的实现方式。

代码清单3-20 设想中的列表遍历

        for(int i=0; i<listView. getCount(); i++){
            listView.getChildAt(int index);
            ……;
        }

但是,在Android中,对于listView.getChildAt(int index)而言,如果子控件是在屏幕之外的话,那么是无法点击的,因此要想点击或测试屏幕之外的子控件,就需要不断向上滑动。因此我们可以先遍历当前屏幕内的子控件,然后翻一屏,再遍历屏幕内的子控件,如此反复就可以遍历ListView所有的子控件了。

对于ListView而言,通过getFirstVisiblePosition()和getLastVisiblePosition()可以获取ListView在屏幕中第一个可见子控件及最后一个可见子控件在列表中的位置。当遍历至当前最后一个子控件时,通过solo.scrollListToLine(listView, lastPosition)方法将列表滑至lastPosition所在的位置,即实现翻屏的效果。当遍历至每个child子控件时,可以通过该子控件的布局结构来判断该子控件是否为要查找的控件。另外,需要注意的是,正如前文所介绍的,scrollListToLine(listView, lastPosition)方法并不会直接产生上滑手势,因此如果列表需要产生上滑动作才能加载更多的话,则还需要配合使用drag方法进行上拉加载更多。

如代码清单3-21所示,遍历列表,查找列表中子节点为RelativeLayout且子节点的标题为×××的子控件。

代码清单3-21 遍历列表并找到指定标题的child

        public RelativeLayout findCardByType(int maxCount) {
            // 获取当前界面中的ListView
            ListView listView = getCurrentListView();
            int firstPosition = 0;
            int lastPosition = 0;
            RelativeLayout relativeLayout = null;
            int currentPosition = 1;
            labelAll:
            for (int i = 0; i < length; i++) {
                firstPosition = listView.getFirstVisiblePosition();
                lastPosition = listView.getLastVisiblePosition();
                for (int j = 1; j <= lastPosition - firstPosition; j++) {
                    currentPosition++;
                    if (currentPosition >= maxCount) {
                        break labelAll;
                    }
                    // 判断该节点是否为relativeLayout
                    if (listView.getChildAt(j) instanceof RelativeLayout) {
                        relativeLayout = (RelativeLayout) listView.getChildAt(j);
                        //    这里可以对该relativeLayount进行判断,例如获取该//relativeLayout
        中的子控件,如果有标题则判断标题等
                        if (isSatisfied(relativeLayout)) {
                              break labelAll;
                        }
                        relativeLayout = null;
                    }
                }
                solo.scrollListToLine(listView, lastPosition);
                if (lastPosition >= listView.getCount()) {
                    // 当需要上拉加载更多时,调用drag实现的方法进行上拉加载更多
                    dragUpToShowAll(listView);
                }
                sleeper.sleep();
            }
            sleeper.sleep();
            return relativeLayout;
        }