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