2013-02-26 78 views
1

我試圖在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而不是幫助。

回答

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獨奏的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

我以前略有不同的狀態下使用這些輔助函數來處理大部分您需要的列表視圖:

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

有了這些函數stor ED的地方(也可以是靜態的,如果你喜歡...我寧願沒有這樣做,但很方便)

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

您當前的解決方案,其實是在試圖通過所有的列表視圖來迭代你在屏幕上,而不是listView中的元素。