2015-01-11 3 views
15

Ich verwende Espresso, um automatisierte UI-Tests mit einer Android-App durchzuführen. (Ich habe versucht, eine Lösung für das Problem zu finden, während ich von zu Hause aus zu Hause bin, also habe ich nicht die genauen Beispiele und Fehler, aber ich kann morgen früh auf den neuesten Stand bringen). Ich bin auf ein Problem mit Unit-Test-Schaltflächen in einem Layout gestoßen, das mehrmals in einer einzigen Benutzeroberfläche enthalten ist. Im Folgenden finden Sie ein kurzes Beispiel:Espresso Kinder im Layout auswählen

<include 
    android:id="@+id/include_one" 
    android:layout="@layout/boxes" /> 

<include 
    android:id="@+id/include_two" 
    android:layout="@layout/boxes" /> 

<include 
    android:id="@+id/include_three" 
    android:layout="@layout/boxes" /> 

Hier ist ein Beispiel dafür, was innerhalb der @ Layout/Boxen:

<RelativeLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <Button 
     android:id="@+id/button1" /> 
    <Button 
     android:id="@+id/button2" /> 
</RelativeLayout> 

ich scheinbar nicht in der Lage bin Taste ein für den Zugriff auf die in I der „include_one“ wollen , ohne auf alle drei Tasten zuzugreifen.

Ich habe versucht, die Tasten mit folgendem Zugriff:

onView(allOf(withId(R.id.include_one), isDescendantOfA(withId(R.id.button1)))).perform(click()); 

und

onView(allOf(withId(R.id.button1), hasParent(withId(R.id.include_one)))).perform(click()); 

Beide, die ich von dieser Antwort gefunden: onChildView and hasSiblings with Espresso Leider habe ich keinen Erfolg gehabt!

Ich weiß, das ist nicht groß, aber wie ich mit meinem Computer bin nicht kann ich Ihnen nicht die genauen Fehler sagen, dass ich über gekommen sind, aber ich habe festgestellt:

com.google.android.apps.common.testing.ui.espresso.AmbiguousViewMatcherException 

auch ein Fehler sagte mir, dass keine Übereinstimmungen gefunden wurden.

Der Code verwende ich sinnvoll, obwohl ich bin hier zur Verwendung von Espresso Kann jemand einen Rat anbieten oder darauf hinweisen, was ich Missverständnis sein kann?

Antwort

15

Dies ist ein häufiger Fehler, wenn Sie versuchen, <include/> dasselbe benutzerdefinierte xml mehrmals im selben Layout.

Wenn Sie jetzt anrufen versuchen

Button button1 = (Button) findViewById(R.id.button1); 

da die boxes.xml mehr als einmal enthalten ist, werden Sie als Ergebnis erhalten immer die Taste in dem ersten Unterlayout und nie einen anderen.

Sie waren ziemlich nah, aber Sie müssen die withParent() View Matcher verwenden.

onView(allOf(withId(R.id.button1), withParent(withId(R.id.include_one)))) 
       .check(matches(isDisplayed())) 
       .perform(click()); 
+0

Danke für die Antwort! Ich hätte das eigentlich selbst beantworten sollen, als ich das Problem behoben habe. Aber Sie haben recht, ich hatte einen komplexen Selektor, um den richtigen Knopf auszuwählen, als ich an diesem Problem arbeitete. –