1

我试图通过遍历列表并单击每个列表元素以开始另一个活动来在 Robotium 中运行一些自动化测试。我的测试方法中有以下代码:

代码:

      solo.assertCurrentActivity("Wrong activity", MainActivity.class);
      //Clicks on the action bar tab
      solo.clickOnText("Charts"); 


      ArrayList<ListView> list = solo.getCurrentListViews();

      for(int i = 0; i < list.size(); i++) {


         //Clicks on the list item assert that the new activity is started
         solo.clickInList(chartPosition);
         solo.assertCurrentActivity("Json Class", JsonActivity.class);
         //Go back to the list  
         solo.goBack();         


     }

上面的代码没有点击任何列表项,JUnit 测试结果显示所有测试都通过了,这非常令人困惑。

有谁如何成功地遍历 Robotium 中的列表?

我见过另一个与此类似的问题,但答案建议查看 jMock 而不是这没有帮助。

4

2 回答 2

1

我看到几个问题:

  1. 该代码正在遍历活动中的所有列表视图,但它没有对当前列表视图做任何事情。
  2. 由于代码没有显示chartPosition的值,所以不能保证当前列表有那么多项目。
  3. 我相信您需要等待新活动加载。

尝试这个:

  for(int i = 0; i < list.size(); i++) {
      assertTrue("There are no listviews in this activity.", list.size() > 0);
      chartPosition = 0;  // just to be safe, point at the first item in the list.
      for(int i = 0; i < list.size(); i++) {
         solo.clickInList(chartPosition, i);  // Note that "i" identifies the ListView

         solo.waitForActivity("name.of.the.expected.activity");

      }
     ...
  }

免责声明 - 此建议纯粹基于代码检查和 Robotium Solo Javadoc:http ://www.jarvana.com/jarvana/view/com/jayway/android/robotium/robotium-solo/1.4.0/robotium-solo-1.4 .0-javadoc.jar!/com/jayway/android/robotium/solo/Solo.html#clickInList(int)

于 2013-02-26T18:32:07.730 回答
1

我之前曾在稍微不同的状态下使用这些辅助函数来处理列表视图所需的大部分内容:

public View getViewAtIndex(final ListView listElement, final int indexInList, Instrumentation instrumentation) {
    ListView parent = listElement;
    if (parent != null) {
        if (indexInList <= parent.getAdapter().getCount()) {
            scrollListTo(parent, indexInList, instrumentation);
            int indexToUse = indexInList - parent.getFirstVisiblePosition();
            return parent.getChildAt(indexToUse);
        }
    }
    return null;
}

public <T extends AbsListView> void scrollListTo(final T listView,
        final int index, Instrumentation instrumentation) {
    instrumentation.runOnMainSync(new Runnable() {
        @Override
        public void run() {
            listView.setSelection(index);
        }
    });
    instrumentation.waitForIdleSync();
}

将这些函数存储在某处(如果您愿意,它们可以是静态的……我不想那样做,但很方便)

ListView list = solo.getCurrentListViews().get(0);
for(int i=0; i < list.getAdapter().getCount(); i++){
    solo.clickOnView(getViewAtIndex(list, i, getInstrumentation()))
    solo.assertCurrentActivity("Json Class", JsonActivity.class);
    solo.goBack();
}

您当前的解决方案实际上是尝试遍历屏幕上的所有列表视图,而不是列表视图中的元素。

于 2013-02-26T22:21:59.030 回答