Android Espresso vs Actionbar

时间:2013-11-11 16:30:48

标签: android testing android-espresso

我一直在尝试使用Espresso来测试具有菜单抽屉的应用。

现在为了陌生。

在第一次测试中,我打开抽屉并点击一个项目,然后继续进行剩下的测试。一切都很好。

当我添加第二个完全相同的测试时,我得到一个例外。它似乎与菜单抽屉的内容有关,但我不知所措。

例外是:

com.google.android.apps.common.testing.ui.espresso.PerformException: Error performing 'single click' on view '(with id: is <2131099739> and with text: is "Events")'.
at com.google.android.apps.common.testing.ui.espresso.PerformException$Builder.build(PerformException.java:67)
at com.google.android.apps.common.testing.ui.espresso.base.DefaultFailureHandler.getUserFriendlyError(DefaultFailureHandler.java:57)
at com.google.android.apps.common.testing.ui.espresso.base.DefaultFailureHandler.handle(DefaultFailureHandler.java:40)
at com.google.android.apps.common.testing.ui.espresso.ViewInteraction.runSynchronouslyOnUiThread(ViewInteraction.java:146)
at com.google.android.apps.common.testing.ui.espresso.ViewInteraction.doPerform(ViewInteraction.java:77)
at com.google.android.apps.common.testing.ui.espresso.ViewInteraction.perform(ViewInteraction.java:69)
at com.xxx.app.events.StackOverflowExampleTest.selectMenu(StackOverflowExampleTest.java:83)
at com.xxx.app.events.StackOverflowExampleTest.setUp(StackOverflowExampleTest.java:72)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:192)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:177)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:555)
at com.google.android.apps.common.testing.testrunner.GoogleInstrumentationTestRunner.onStart(GoogleInstrumentationTestRunner.java:119)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1608)
Caused by: java.lang.RuntimeException: Action will not be performed because the target view does not match one or more of the following constraints:
at least 90 percent of the view's area is displayed to the user.
Target view: "TextView{id=2131099739, res-name=menu_item_content, visibility=VISIBLE, width=432, height=112, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=24.0, y=2.0, text=Events, input-type=0, ime-target=false}"
at com.google.android.apps.common.testing.ui.espresso.ViewInteraction$1.run(ViewInteraction.java:100)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:442)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4898)
at java.lang.reflect.Method.invokeNative(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
at dalvik.system.NativeStart.main(Native Method)

这是测试类

public class StackOverflowExampleTest extends ActivityInstrumentationTestCase2<MainActivity_>
{
    public StackOverflowExampleTest()
    {
        super(MainActivity_.class);
    }

    /**
     * Basic check for content displayed
     */
    @SuppressWarnings("unchecked")
    public void testSanityCheck()
    {
        // check title is shown
        onView(allOf(withId(R.id.event_view_title), isDisplayed())).check(
                        matches(withText("Isaac Vladimir Sinead Stacey"))); //$NON-NLS-1$

        // check content is shown
        onView(allOf(withId(R.id.event_view_text), isDisplayed())).check(
                        matches(withText(startsWith("Arcu ipsumcurabitur. Aliquammauris sodalessed arcu.")))); //$NON-NLS-1$

        // check "more details" is shown
        onView(allOf(withId(R.id.event_view_link), isDisplayed()))
                        .check(matches(withText(R.string.events_button_text)));
    }

    /**
     * Basic check for content displayed
     */
    @SuppressWarnings("unchecked")
    public void testSanityCheck2()
    {
        // check title is shown
        onView(allOf(withId(R.id.event_view_title), isDisplayed())).check(
                        matches(withText("Isaac Vladimir Sinead Stacey"))); //$NON-NLS-1$

        // check content is shown
        onView(allOf(withId(R.id.event_view_text), isDisplayed())).check(
                        matches(withText(startsWith("Arcu ipsumcurabitur. Aliquammauris sodalessed arcu.")))); //$NON-NLS-1$

        // check "more details" is shown
        onView(allOf(withId(R.id.event_view_link), isDisplayed()))
                        .check(matches(withText(R.string.events_button_text)));
    }

    @Override
    protected void setUp() throws Exception
    {
        super.setUp();

        // start the activity
        this.getActivity();

        // show events fragment
        this.selectMenu(R.string.menu_item_events);
    }

    @SuppressWarnings("unchecked")
    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    protected void selectMenu(final int menuItemResId)
    {
        // open the drawer
        onView(withId(android.R.id.home)).perform(click());

        // click the supplied menu item (aka list item)
        onView(allOf(withId(R.id.menu_item_content), withText(this.getActivity().getString(menuItemResId)))).perform(
                        click());

    }
}

2 个答案:

答案 0 :(得分:15)

当您要操作的视图在屏幕上看不到或部分可见时,我遇到了同样的问题。因此,如果您对屏幕上的某些视图有问题 - 只需滚动到它然后单击:

onView(withId(is(R.id.button_login))).perform(
    scrollTo(), 
    click());

如果您在抽屉中出现此问题,该问题包含项目列表,并且您想要单击不可见的项目 - 请使用onData(...)。但您必须先显示抽屉(请参阅如何打开抽屉here):

onData(is(instanceOf(com.your.package.SomeDrawerItem.class)))
    .inAdapterView(withId(R.id.drawer_listview))
    .atPosition(itemPositionInDrawer).perform(click());

答案 1 :(得分:1)

看起来抽屉里的视图还不可见。您可以尝试在对其执行任何操作之前声明视图的可见性:

assertTrue(withEffectiveVisibility(Visibility.VISIBLE).matches(myView));
assertFalse(withEffectiveVisibility(Visibility.VISIBLE).matches(myView));