Espresso onView 不等待元素

Meg*_*ami 5 android android-espresso android-espresso-recorder

我刚刚开始与Espresso recorder. 我进行了第一次测试,从我所看到的功能来看onView,等待对象继续并不能完成工作。它总是返回:

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

有没有什么功能可以代替wait for我使用?

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

    }
}
Run Code Online (Sandbox Code Playgroud)

vk.*_*884 2

更新: 看起来您正在使用 RecyclerView,请尝试以下代码。

此外,如果您进行任何网络调用,您需要实现 RecyclerView/Network IdlingResource 来告诉 Espresso 在执行测试步骤之前等待数据填充。

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

    }
Run Code Online (Sandbox Code Playgroud)

使用时ActivityTestRule需要设置initialTouchMode和launchActivity。

用这个

@Rule
public ActivityTestRule<MainActivity> mActivityRule = new ActivityTestRule<>(MainActivity.class, true, true);
Run Code Online (Sandbox Code Playgroud)

另外不要忘记在 @After 测试方法中取消注册 IdlingResources。