2016-08-24 41 views
4

我有以下情況。我們使用小黃瓜語言通過Espresso驅動我們的本地UI自動化。在我們的小黃瓜線,我們已經有了一個叫行:檢查是否顯示數組中的資源ID並點擊它(Android-Espresso)

And I tap on button "Next" 

其中,「下一步」是一個可變的字符串,我們通過到我們的膠水代碼(我們使用的是黃瓜框架)。

碰巧,我們的應用程序有許多具有不同資源ID的「下一步」按鈕。我結束了使用類似變量的小黃瓜線:

And I tap on button "Next in screen 1" 
And I tap on button "Next in screen 2" 

現在我想只在我的代碼中使用小黃瓜變量「下一步」。我得到一個Integer數組,其中包含所有Next按鈕的所有資源ID,但是當我想要檢查屏幕上顯示的是哪個ID時,我得到了一個N​​oMatchingViewException。

這是我目前的解決方案,現在:

final int[] uiElementIds = getArrayWithIdsFromUIElement("Next"); 

    int testId = 0; 
    for(int id : uiElementIds) { 
     try { 
      onView(withId(id)).check(matches(isDisplayed())); 
      testId = id; 
      break; 
     } catch(NoMatchingViewException ex) { 
      // do nothing 
     } 
    } 

    final int uiElementId = testId; 
    onView(withId(uiElementId)).withFailureHandler(new FailureHandler() { 
      @Override 
      public void handle(Throwable error, Matcher<View> viewMatcher) { 
       onView(withId(uiElementId)).perform(scrollTo(), click()); 
      } 
     }).perform(click()); 

正如你可以看到我正好趕上拋出NoMatchingViewException,什麼也不做下去直到找到正確的ID,打破了for循環的。


我的問題是:

是否有更好的辦法,我們可以用它來循環通過它看到的是顯示其ID,如果是一下就可以了?

在我心目中,我想出了這個主意,但它沒有集成在咖啡:

for(int id : uiElementIds) { 
if(onView(withId(id)).exist()) { 
    performClick(); 
} 
} 

回答

1

根據你的問題

我的問題是:

是有更好的方法,我們可以用它來循環查看哪個id被顯示,如果是的話點擊它?

在我心目中,我想出了這個主意,但它沒有集成在 咖啡:

for(int id : uiElementIds) { 
if(onView(withId(id)).exist()) { 
    performClick(); 
} 
} 

這裏是我的老Espresso框架Activity測試:

@RunWith(AndroidJUnit4.class) 
@FixMethodOrder(MethodSorters.NAME_ASCENDING) 
public class DetailsActivityTest { 

    @Rule 
    public ActivityTestRule<MainActivity_> mRule = new ActivityTestRule<>(MainActivity_.class); 

    //TODO: Write tests to check if views are visible 
    private final int[] allDetailsActivityViewsIdis = { 
      R.id.dItem, 
      R.id.dDayAndDate, 
      R.id.dDay, 
      R.id.dDate, 
      R.id.dCity, 
      R.id.dTempAndIcon, 
      R.id.dTemperature, 
      R.id.dHighTemp, 
      R.id.dLowTemp, 
      R.id.dDescriptionLayout, 
      R.id.dDescription, 
      R.id.dForecast, 
      R.id.dHumidityLayout, 
      R.id.dHumidityDesc, 
      R.id.dHumidityVal, 
      R.id.dPressureLayout, 
      R.id.dPressureDesc, 
      R.id.dPressureVal, 
      R.id.dWindLayout, 
      R.id.dWindDesc, 
      R.id.dWindVal 

    }; 

    private final int[] detailsActivityTextViewsIdis = { 
      R.id.dDay, 
      R.id.dDate, 
      R.id.dHighTemp, 
      R.id.dLowTemp, 
      R.id.dDescription, 
      R.id.dHumidityVal, 
      R.id.dPressureVal, 
      R.id.dWindVal, 

    }; 

    private final int[] detailsActivityTextViewsDefaultValues = { 
      R.string.day, 
      R.string.date, 
      R.string.high_temp, 
      R.string.low_temp, 
      R.string.description, 
      R.string.humidity_val, 
      R.string.pressure_val, 
      R.string.wind_val, 

    }; 

    @Before 
    //TODO: Rewrite this code using espresso-intents 
    public void checkIfAllDetailActivityViewsAreDisplayed() throws InterruptedException { 
     for (int viewId : allDetailsActivityViewsIdis) 
      onView(withId(viewId)).perform(click()); 

    } 

    @Test 
    public void checkIfDetailsActivityViewsHaveNoDefaultValue() throws InterruptedException { 
     for (int viewId : detailsActivityTextViewsIdis) 
      for (int valueId : detailsActivityTextViewsDefaultValues) 
       onView(withId(viewId)).check(matches(not(withText(valueId)))); 

    } 

} 

正如你看到的,使用foreach與濃咖啡是可能的,但代替exists()使用check(matches(...)與價值:isDisplayedisDisplayedAtLeastisCompletelyDisplayed

希望它能幫到你