Question

I'm new to robotium and i'm trying to write a quick and dirty script to run through all screens in an app.

The problem i have mainly with the 'home button' in the app. I've tried lots of options but i cant seem to get it to click there except with index, which is not what i want.

When i check out the button with the hierarchyviewer it looks like this:

Link

However when i try for example:

assertTrue(
"Wait for text (id: myapp.R.id.home) failed.",
solo.waitForImageById("myapp.R.id.home", 20000));
solo.clickOnImage((ImageView) solo.findViewById("myapp.R.id.home"));            
solo.waitForActivity("MenuActivity");

It fails at the waitForImageByID line. Ive tried multiple options like waitForImageButton etc, but i just cant seem to get it clicked. What am i missing here?

junit.framework.AssertionFailedError: View with id: '0' is not found!
at com.jayway.android.robotium.solo.Solo.getView(Solo.java:1990)
at com.jayway.android.robotium.solo.Solo.getView(Solo.java:1970)
at com.bitbar.recorder.extensions.OtherUtils.a(OtherUtils.java:246)
at com.bitbar.recorder.extensions.OtherUtils.b(OtherUtils.java:241)
at com.bitbar.recorder.extensions.v.a(Waiter.java:71)
at com.bitbar.recorder.extensions.ExtSolo.waitForImageButtonById(ExtSolo.java:4176)
at com.example.android.apis.test.Test.testRecorded(Test.java:137)
at java.lang.reflect.Method.invokeNative(Native Method)
at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:214)
at android.test.InstrumentationTestCase.runTest(InstrumentationTestCase.java:199)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:191)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:176)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:554)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1740)
Was it helpful?

Solution

Use the following line to press the home button in the action bar

solo.clickOnActionBarHomeButton();

OTHER TIPS

The issue is that the id that it is referring is not in your application, it is in androids default R file, try android.R.id.home and it should work fine. It is worth noting though that if your application uses action bar sherlock to support the action bar pre 4.0 that this will have a different ID there and you will have to handle this in your test.

You can see this for yourself looking at: http://developer.android.com/reference/android/R.id.html

When you are using ActionBarSherlock there are two different Ids you have to check, android.R.id.home for API-Level>11 and abs__home for lower levels (provided by ActionBarSherlock):

    View homeButton = activity.findViewById(android.R.id.home);
    if (homeButton == null) {
        homeButton = activity.findViewById(R.id.abs__home);
    }

What about this code:

ArrayList<LinearLayout> ll = solo.getCurrentViews(LinearLayout.class);
//You can change 1 with the ordinal number of LinearLayout you want to click.
solo.clickOnView(ll.get(1));

or also

ArrayList<ImageView> iv = solo.getCurrentViews(ImageView.class);
//You can change 0 with the ordinal number of Image you want to click.
solo.clickOnView(iv.get(0));

I think if you identify the correct id for view or linear layout or image view it should work.

Dave C's answer was working only partially for me. The button was clicked but before the preceding screen was loaded assertions had started and thus were always false. The solution is to run "home click" on the main thread (Robotium 5.2.1):

getInstrumentation().runOnMainSync(new Runnable() {
        @Override
        public void run() {
            solo.clickOnActionBarHomeButton();
        }
});   

From your question I can see that it is an image view. You can click on any view using the following piece of code.

View view = solo.getView("View_name_from_hierachy_viewer");
solo.clickOnView(view);

View_name_from_hierachy_viewer in your case will be "home". Let me know if this does not work.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top