Android UIAutomator测试:列表视图中存在的所有元素的计数

时间:2014-03-23 18:09:41

标签: android uiautomator

在使用Android UIAutomator进行移动UI自动化测试时,我需要找出列表视图中的所有元素。

使用' getChildCount()'如下所示的方法,我得到当前可见元素的计数,但列表视图中存在更多元素但不可见。

以下是示例代码:

    //Created UI Object for list view
UiObject listview_elements = new UiObject(new UiSelector().className("android.widget.ListView"));


//Printing the numbmer of child ements present in the List View by using getchildCount() method
System.out.println("List view elements : "+listview_elements.getChildCount());*

任何人都可以帮助计算所有列表视图元素,包括不可见元素(即当前未在屏幕上显示)。

注意: 请注意,这里我没有实现Android UI,而是我只使用Android的UIAutomator测试第三方Android应用程序的UI。

2 个答案:

答案 0 :(得分:1)

有点晚了,但这里有一些建议。

请记住,您可以使用UI Automator Viewer来识别资源ID等。 AndroidSDKPath \工具\ uiautomatorviewer

一些改变我们处理方式的考虑因素。

  • 列表中的项目是否可以点击?
  • 列表中的项目大小相同吗?
  • 这些项目是否包含不同的文本字段?

假设列表中的项目是可点击的,您可以使用这样的选择器:

UiSelector selector = new UiSelector().clickable(true);

如果项目确实包含不同的文本字段,那么您可以使用Java Set 来跟踪代表每个项目的字符串。

如果列表中的项目大小相同,那么您可以使用循环并每次向上滚动相同的数量。否则,您可以查看列表中的下一个项目,获取其边界,获取顶部坐标,然后向上滚动,直到到达列表顶部(这可能是工具栏的底部)。您可以通过查看边界来检查您是否达到顶峰。

当写一个循环时,想法只是在你到达列表末尾时才增加索引,因为当你向上滚动时,最顶层的项目将变为位置0。

你的循环看起来像这样:

//UiDevice device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());;
UiObject list = device.findObject(new UiSelector().resourceId(PACKAGE + ":id/" + resourceId));

int index = 0;
int count = 0;

while (index < list.getChildCount()) {
    UiObject listItem = list.getChild(selector.index(index));

    Set<String> examinedItems = new LinkedHashSet<>();

    //if first item is a bit out of view (under toolbar) then skip it
    if (listItem.getBounds().top < TOOLBAR_BOTTOM_Y) {
        index++;
        continue;
        //this will only ever happen once = reached end of list
    }

    //get unique details from each item
    //for example, you might get a text field for that list item list this
    //UiObject textField = listItem.getChild(new UiSelector().resourceId(PACKAGE + ":id/" + childResourceId));
    String itemDetails = ...;

    //this would be relevent if the list was perfectly scrolled to the top and we don't know we are at the end of the list
    if (examinedItems.contains(itemDetails)) {
        index++;
        continue;
    }

    //do any actual testing on the item here..
    count++;

    //if index > 0 we have reached the end of the list
    if (index == 0) {
        //you'll need to inherit from InstrumentationTestCase so you can pass an instance to this method
        TouchUtils.drag(this, CENTER_X, CENTER_X, START_SCROLL_Y, START_SCROLL_Y - ITEM_HEIGHT, 150);
    }

    examinedItems.add(itemDetails);
}

//maybe return count here

答案 1 :(得分:0)

如果列表大小统一,(您知道每个视图的高度),您可以执行以下操作:

首先将ListView作为UiScrollable

调用scrollToBeginning()从ListView的顶部开始。

调用getChildCount()以获取屏幕上的子项数

scrollForward()直到底部视图不再可见。

再次调用getChildCount()并重复此过程,直到您位于视图的底部。

你可以通过执行一次这样的滑动来找出你需要做多少滑动才能到达底部,然后看看scrollToEnd()是否返回false(它已经在底部)。如果scrollToEnd()返回true,则需要滚动回到顶部并重新开始,这次会增加您执行的滑动量。如果您需要验证列表视图中是否有单个元素(因为这种确定长度和滑动的方法会非常慢),您可以始终使用getChildBy ...()方法。