2014-05-21 9 views
12

Sto tentando di aggiornare un EditText come parte di un test di caffè espresso con:Aggiornamento di un EditText con Espresso

onView(allOf(withClassName(endsWith("EditText")), withText(is("Test")))).perform(clearText()) 
                     .perform(click()) 
                     .perform(typeText("Another test")); 

Tuttavia ricevo il seguente errore:

com.google.android.apps.common.testing.ui.espresso.NoMatchingViewException: No views in hierarchy found matching: (with class name: a string ending with "EditText" and with text: is "Test") 

Abbattendo il test linea posso vedere che questo si verifica dopo aver eseguito clearText(), quindi presumo che i matcher sono in fase di riesecuzione prima di ogni perform e fallire il precedente alla seconda azione. Anche se questo ha senso, mi lascia un po 'confuso su come aggiornare il EditText utilizzando Espresso. Come dovrei farlo?

Nota che non è possibile utilizzare un ID risorsa o simile in questo scenario e utilizzare la combinazione come mostrato sopra per identificare la vista corretta.

risposta

1

Si potrebbe provare due cose. In primo luogo vorrei provare ad usare

onView(withId(<id>).perform... 

In questo modo si dovrebbe sempre avere accesso al campo EditText anche quando gli altri campi EditText sono sullo schermo.

Se questa non è un'opzione, è possibile suddividere le chiamate di esecuzione.

onView(allOf(withClassName(endsWith("EditText")),withText(is("Test")))).perform(clearText()); 
onView(withClassName(endsWith("EditText"))).perform(click()); 
onView(withClassName(endsWith("EditText"))).perform(typeText("Another Test"); 
+0

Grazie per la risposta. Sfortunatamente ci sono più EditTexts nell'attività, generati in modo programmato senza ID, quindi nessuno di questi suggerimenti funzionerà. – jgm

+0

Capisco. Forse potresti impostare un tag per ogni EditText che crei e trovare la vista in base a quel tag. Il tag può essere usato solo per il test, ma ti darà almeno qualcosa per differenziare i campi EditText. Quindi, di nuovo, ciò potrebbe violare la condizione che hai citato alla fine della tua domanda (ho trascurato quella parte prima che avessi risposto). – Maxwell

8

Tre cose da provare:

1. È possibile eseguire esegue in successione.

onView(...) 
    .perform(clearText(), typeText("Some Text")); 

2. C'è una recorded issue on the Espresso page che è stato contrassegnato come non valido (ma è ancora molto un bug). Una soluzione alternativa per questo è di mettere in pausa le prestazioni intermedie del test.

public void test01(){ 
    onView(...).perform(clearText(), typeText("Some Text")); 
    pauseTestFor(500); 
    onView(...).perform(clearText(), typeText("Some Text")); 
} 

private void pauseTestFor(long milliseconds) { 
    try { 
     Thread.sleep(milliseconds); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 

3. Sei assolutamente sicuro che il vostro EditText contiene il testo, "Test"?

20

È possibile utilizzare il metodo replaceText.

onView(allOf(withClassName(endsWith("EditText")), withText(is("Test")))).perform(replaceText("Another test")); 
+0

replaceText() funziona! Questo mi ha salvato. Sembra che typeText() abbia qualche problema con la tastiera di input. – herbertD

2

ho avuto un problema simile e risolto utilizzando matcher containsString e Class.getSimpleName(). Come questo:

onView(withClassName(containsString(PDFViewPagerIVZoom.class.getSimpleName()))).check(matches(isDisplayed())); 

È possibile vedere il codice completo here