Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 意式浓缩咖啡onView不';不要等待元素_Android_Android Espresso_Android Espresso Recorder - Fatal编程技术网

Android 意式浓缩咖啡onView不';不要等待元素

Android 意式浓缩咖啡onView不';不要等待元素,android,android-espresso,android-espresso-recorder,Android,Android Espresso,Android Espresso Recorder,我刚开始使用浓缩咖啡录音机。我做了我的第一个测试,从我看到的函数onView,假设等待对象继续运行不会起作用。它总是返回: android.support.test.espresso.nomatchingvieweexception:在层次结构中找不到匹配的视图 是否有任何函数可以作为我可以使用的等待 package com.mytest; import android.support.test.espresso.ViewInteraction; import android.support

我刚开始使用浓缩咖啡录音机。我做了我的第一个测试,从我看到的函数
onView
,假设等待对象继续运行不会起作用。它总是返回:

android.support.test.espresso.nomatchingvieweexception:在层次结构中找不到匹配的视图

是否有任何函数可以作为我可以使用的
等待

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

    }
}
package com.mytest;
导入android.support.test.espresso.ViewInteraction;
导入android.support.test.rule.ActivityTestRule;
导入android.support.test.runner.AndroidJUnit4;
导入android.test.suitebuilder.annotation.LargeTest;
导入android.support.test.espresso.espresso;
导入android.support.test.espresso.IdlingResource;
导入org.junit.Rule;
导入org.junit.Test;
导入org.junit.Before;
导入org.junit.runner.RunWith;
导入com.mytest.R;
导入静态android.support.test.espresso.espresso.onView;
导入静态android.support.test.espresso.action.ViewActions.click;
导入静态android.support.test.espresso.contrib.RecycleServiceActions.ActionItemPosition;
导入静态android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
导入静态android.support.test.espresso.matcher.ViewMatchers.withId;
导入静态android.support.test.espresso.matcher.ViewMatchers.withParent;
导入静态org.hamcrest.Matchers.allOf;
@最大的
@RunWith(AndroidJUnit4.class)
公共类Test1{
@统治
public ActivityTestRule mActivityRule=新的ActivityTestRule(MainActivity.class);
私有资源;
@以前
公共无效registerIdlingResource(){
mIdlingResource=mActivityRule.getActivity().getIdlingResource();
浓缩咖啡注册资源(mIdlingResource);
}
@试验
公共void test1(){
ViewInteraction recyclerView=onView(
allOf(带id(R.id.recycler_视图),显示为();
执行(ActionItemPosition(0,click());
ViewInteraction relativeLayout=onView(
allOf(带id(R.id.capture_layout),显示为();
perform(单击());
ViewInteraction relativeLayout2=onView(
allOf(带id(R.id.like_布局),
withParent(allOf)(withId(R.id.cameraLayout),
withParent(withId(android.R.id.content)),
isDisplayed());
relativeLayout2.执行(单击());
ViewInteraction relativeLayout3=onView(
allOf(带id(R.id.exit_布局),显示为();
执行(单击());
}
}
更新: 看起来您正在使用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);

    }
@规则
public ActivityTestRule mActivityRule=新的ActivityTestRule(MainActivity.class,true,true);
private MainActivity mMainActivity=null;
私有资源;
@以前
公共无效registerIdlingResource(){
mMainActivity=mActivityRule.getActivity();
}
@试验
公共void test1(){
mIdlingResource=mActivityRule.getActivity().getIdlingResource();
浓缩咖啡注册资源(mIdlingResource);
mActivityRule.launchActivity(MainActivity.createIntent(getTargetContext());
ViewInteraction recyclerView=onView(
allOf(带id(R.id.recycler_视图),显示为();
执行(ActionItemPosition(0,click());
ViewInteraction relativeLayout=onView(
allOf(带id(R.id.capture_layout),显示为();
perform(单击());
ViewInteraction relativeLayout2=onView(
allOf(带id(R.id.like_布局),
withParent(allOf)(withId(R.id.cameraLayout),
withParent(withId(android.R.id.content)),
isDisplayed());
relativeLayout2.执行(单击());
ViewInteraction relativeLayout3=onView(
allOf(带id(R.id.exit_布局),显示为();
执行(单击());
浓缩咖啡。未注册的入口资源(mIdlingResource);
}

使用
ActivityTestRule
您需要设置initialTouchMode并启动Activity


使用此一种方法是循环匹配器,直到它发生。当我需要等待异步任务完成时,我使用以下帮助程序

public class ViewSynchronizer {
    private static final String TAG = "MC_Synchronizer";

    public static boolean viewExists(final Matcher<View> viewMatcher, final long millis) throws InterruptedException {
        final Boolean[] found = new Boolean[1];

        final CountDownLatch latch = new CountDownLatch(1);
        ViewAction action = new ViewAction() {
            @Override
            public Matcher<View> getConstraints() {
                return isRoot();
            }

            @Override
            public String getDescription() {
                return "wait for a specific view with id <" + viewMatcher.toString() + "> during " + millis + " millis.";
            }

            @Override
            public void perform(final UiController uiController, final View view) {
                uiController.loopMainThreadUntilIdle();
                final long startTime = System.currentTimeMillis();
                final long endTime = startTime + millis;


                do {
                    for (View child : TreeIterables.breadthFirstViewTraversal(view)) {

                        if (viewMatcher.matches(child)) {
                            Log.d(TAG, "perform: found match");
                            found[0] = true;
                            latch.countDown();
                            return;
                        }
                    }

                    uiController.loopMainThreadForAtLeast(50);
                }
                while (System.currentTimeMillis() < endTime);

                found[0] = false;
                latch.countDown();
            }
        };
        onView(isRoot()).perform(action);

        latch.await();
        return found[0];
    }
}

尝试使用空闲资源,UI线程可能正忙于更新视图。这里有一个例子@vk.4884所以据我所知,我想捕捉一个将启动测试的事件。我可以在“@Before”中完成。我在规则中使用了“@Before”。我可以通过MainActivity捕获该事件,因为它是IdlingResource。我检查了,在我的应用程序中,测试中的第一个函数应该在调用“onResume”时启动。问题是我不知道该怎么注册mIdlingResource=mActivityRule.getActivity().onResume();意式浓缩咖啡注册资源(mIdlingResource);'我试过了,但没用。我得到不兼容的类型错误。使用
mIdlingResource=mActivityRule.getActivity().getIdlingResource()
而不是
onResume()
@vk.4884我无法解析getIdlingResource()上的方法;尽管我得到了导入android.support.test.espresso.IdlingResource;你能公布你的测试结果吗?
 Assert.assertTrue(viewExists(allOf(withId(R.id.account_sign_out_btb),withEffectiveVisibility(ViewMatchers.Visibility.GONE)),2000)); //wait 2 seconds