2017-01-18 5 views
0

Je viens de commencer à travailler avec Espresso recorder. J'ai fait mon premier test, et à partir de ce que je peux voir la fonction onView, cela suppose que l'attente de l'objet pour continuer ne fait pas le travail. Il retourne toujours:Espresso onView n'attend pas l'élément

android.support.test.espresso.NoMatchingViewException: No views in hierarchy found matching.

Y at-il une fonction qui fonctionnerait comme wait for que je pourrais utiliser à la place?

package com.mytest; 


import android.support.test.espresso.ViewInteraction; 
import android.support.test.rule.ActivityTestRule; 
import android.support.test.runner.AndroidJUnit4; 
import android.test.suitebuilder.annotation.LargeTest; 
import android.support.test.espresso.Espresso; 
import android.support.test.espresso.IdlingResource; 



import org.junit.Rule; 
import org.junit.Test; 
import org.junit.Before; 
import org.junit.runner.RunWith; 

import com.mytest.R; 



import static android.support.test.espresso.Espresso.onView; 
import static android.support.test.espresso.action.ViewActions.click; 
import static android.support.test.espresso.contrib.RecyclerViewActions.actionOnItemAtPosition; 
import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; 
import static android.support.test.espresso.matcher.ViewMatchers.withId; 
import static android.support.test.espresso.matcher.ViewMatchers.withParent; 
import static org.hamcrest.Matchers.allOf; 

@LargeTest 
@RunWith(AndroidJUnit4.class) 
public class Test1 { 

    @Rule 
    public ActivityTestRule<MainActivity> mActivityRule = new ActivityTestRule<>(MainActivity.class); 

    private IdlingResource mIdlingResource; 

    @Before 
    public void registerIdlingResource() { 
     mIdlingResource = mActivityRule.getActivity().getIdlingResource(); 
     Espresso.registerIdlingResources(mIdlingResource); 
    } 

    @Test 
    public void test1() { 
     ViewInteraction recyclerView = onView(
       allOf(withId(R.id.recycler_view), isDisplayed())); 
     recyclerView.perform(actionOnItemAtPosition(0, click())); 

     ViewInteraction relativeLayout = onView(
       allOf(withId(R.id.capture_layout), isDisplayed())); 
     relativeLayout.perform(click()); 

     ViewInteraction relativeLayout2 = onView(
       allOf(withId(R.id.like_layout), 
         withParent(allOf(withId(R.id.cameraLayout), 
           withParent(withId(android.R.id.content)))), 
         isDisplayed())); 
     relativeLayout2.perform(click()); 

     ViewInteraction relativeLayout3 = onView(
       allOf(withId(R.id.exit_layout), isDisplayed())); 
     relativeLayout3.perform(click()); 

    } 
} 
+0

Essayez d'utiliser les ressources de ralenti, le thread de l'interface utilisateur peut être occupé à mettre à jour les vues. Voici un exemple. https://github.com/googlesamples/android-testing/blob/master/ui/espresso/IdlingResourceSample/app/src/androidTest/java/com/example/android/testing/espresso/IdlingResourceSample/ChangeTextBehaviorTest.java –

+0

@vk .4884 Donc, si je comprends, je suppose d'attraper un événement qui va commencer à tester. Je peux le faire dans '@Before'. Et im en utilisant '@Before' dans '@Rule'. Je peux attraper cet événement avec MainActivity comme c'est IdlingResource. J'ai vérifié, et dans mon application, la première fonction dans le test devrait commencer quand onResume est appelé. Le problème est que je ne sais pas exactement comment l'enregistrer. 'mIdlingResource = mActivityRule.getActivity(). OnResume(); Espresso.registerIdlingResources (mIdlingResource); ' J'ai essayé cela, mais ça ne marche pas. Je reçois une erreur de type Incompatible. – Megami

+0

Utilisez 'mIdlingResource = mActivityRule.getActivity(). GetIdlingResource();' au lieu de 'onResume()' –

Répondre

0

Mise à jour: On dirait que vous utilisez RecyclerView, essayez ci-dessous le code.

De même, si vous effectuez des appels réseau, vous devez implémenter RecyclerView/Network IdlingResource pour indiquer à Espresso d'attendre le remplissage des données avant d'exécuter les étapes de test.

@Rule 
public ActivityTestRule<MainActivity> mActivityRule = new ActivityTestRule<>(MainActivity.class, true, true); 

    private MainActivity mMainActivity = null; 
    private IdlingResource mIdlingResource; 

    @Before 
    public void registerIdlingResource() { 
     mMainActivity = mActivityRule.getActivity(); 
    } 

    @Test 
    public void test1() { 

     mIdlingResource = mActivityRule.getActivity().getIdlingResource(); 
     Espresso.registerIdlingResources(mIdlingResource); 

     mActivityRule.launchActivity(MainActivity.createIntent(getTargetContext())); 

     ViewInteraction recyclerView = onView(
       allOf(withId(R.id.recycler_view), isDisplayed())); 
     recyclerView.perform(actionOnItemAtPosition(0, click())); 

     ViewInteraction relativeLayout = onView(
       allOf(withId(R.id.capture_layout), isDisplayed())); 
     relativeLayout.perform(click()); 

     ViewInteraction relativeLayout2 = onView(
       allOf(withId(R.id.like_layout), 
         withParent(allOf(withId(R.id.cameraLayout), 
           withParent(withId(android.R.id.content)))), 
         isDisplayed())); 
     relativeLayout2.perform(click()); 

     ViewInteraction relativeLayout3 = onView(
       allOf(withId(R.id.exit_layout), isDisplayed())); 
     relativeLayout3.perform(click()); 

     Espresso.unregisterIdlingResources(mIdlingResource); 

    } 

En utilisant ActivityTestRule vous devez régler initialTouchMode et launchActivity.

Utilisez cette

@Rule 
public ActivityTestRule<MainActivity> mActivityRule = new ActivityTestRule<>(MainActivity.class, true, true); 

Aussi ne pas oublier de désenregistrer IdlingResources dans la méthode d'essai @After.