2013-11-11 3 views
4

Я пытаюсь протестировать приложение с ящиком меню с помощью Espresso.Android Espresso vs Actionbar

Теперь о странности.

В первом тесте я открываю ящик и нажимаю на элемент, а затем продолжаю остаток теста. Все это отлично работает.

Когда я добавляю второй тест, который делает то же самое, я получаю исключение. Похоже, что это связано с содержанием ящика меню, но я в недоумении.

Исключение заключается в следующем:

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

    } 
} 

ответ

1

Похоже зрения в ящике пока не видно. Вы могли бы, возможно, попытаться утверждать видимость зрения, прежде чем выполнять какие-либо действия на него:

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

Спасибо, я был в состоянии проверить visbility из представления, но как я могу обрабатывать исключение. Я имею в виду, если представление не является видимостью, то как я могу написать код else? – Khushboo

+0

Что вы хотите точно сказать? – Snicolas

+0

Я хотел проверить видимость вида. Если вид не отображается или установлен в View.Gone, это вызывает ошибку AssertionFailed. Я теперь обработал ошибку. – Khushboo

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 для этого приятного ответа, но, к сожалению, я все еще не могу объяснить, почему один и тот же тест запускается дважды, и в первый раз это нормально, а второй запуск завершается неудачно. Я всегда считал, что тесты, которые независимы друг от друга, по-видимому, подразумевают другое, что страшно. –

+0

Я не очень уверен в этом, но попытаюсь переместить selectMenu (R.string.menu_item_events); внутри ваших методов тестирования. – denys

+0

Я использовал это исправление, и он отлично работал, но после .perform (click()); на некоторых физических устройствах открылась программная клавиатура, охватывающая следующие кнопки, которые я хотел нажать. Мне пришлось добавить Espresso.closeSoftKeyboard(); чтобы решить эту проблему. Надеюсь, это поможет кому-то. –

Смежные вопросы