迭代List并单击Robotium中的列表项

时间:2013-02-26 16:21:09

标签: android robotium

我正在尝试在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而不是帮助。

2 个答案:

答案 0 :(得分:1)

我看到了几个问题:

  1. 代码正在迭代活动中的所有列表视图,但它没有对当前列表视图执行任何操作。
  2. 由于代码未显示chartPosition的值,因此无法保证当前列表中包含许多项目。
  3. 我相信您需要等待新活动加载。
  4. 试试这个:

      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)

答案 1 :(得分:1)

我以前使用这些辅助函数的状态略有不同,以处理listviews所需的大部分内容:

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

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