2016-08-24 17 views
4

私は以下の場合があります。私たちはGherkin言語を使用して、エスプレッソで独自のUIを自動化しています。当社ガーキンラインでは、と呼ばれるラインを持っている:配列内のビューからのリソースIDが表示されていることを確認し、それをクリックしてください(Android-Espresso)

「次は」私たちは私たちのグルーコードに渡す変数の文字列を(私たちはキュウリのフレームワークを使用している)である
And I tap on button "Next" 

私たちのアプリには、さまざまなリソースIDを持つ多くの「次へ」ボタンがあります。私はgherkinのような変数を使用して終了しました。

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

私のコードでは、Gherkin変数 "Next"だけを使用します。次のすべてのボタンからすべてのリソースIDを含むInteger配列が取得されますが、どのIDが画面に表示されているかをチェックしたい場合、NoMatchingViewExceptionが発生します。あなたは、私はちょうど投げNoMatchingViewExceptionをキャッチし、それを何もしない、それは右のIDを見つけるまでとforループから抜け出す見ることができるように

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

これが今の私の現在のソリューションです。


私の質問は:

我々はどのIDが表示された場合にそれをクリックされて見て、それをループするために使用することができ、より良いアプローチはありますか?私の心の中で

私はこのアイデアを思い付いたが、それはエスプレッソに統合されていません。

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

答えて

1

あなたの質問によると

私の質問は:

ですどのIDが表示されているかを確認するためにループするのに使うことができます。ご覧のとおり

@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)))); 

    } 

} 

:私の心の中で

私はこのアイデアを思い付いたが、それは エスプレッソに統合されていません。

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

は、ここに私の古いEspresso枠組みActivityテストですforeachとエスプレッソを使用することもできますが、exists()の代わりにcheck(matches(...)の値を使用します。isDisplayed,またはisCompletelyDisplayed

希望すると、

関連する問題