Тестирование приложения с использованием ActivityInstrumentationcase2 - PullRequest
1 голос
/ 27 сентября 2011

, когда я тестирую свое приложение с помощью ActivityInstrumentationcase2 на моем эмуляторе, оно работает нормально, но когда я запускаю его на устройстве, оно показывает

java.lang.SecurityException: для внедрения в другое приложение требуетсяРазрешение INJECT_EVENTS

, но я дал это разрешение в файле манифеста.

Мой код:

package cybercom.datamatics.baba.test;

import static android.test.ViewAsserts.assertOnScreen;
import android.app.Activity;
import android.app.Instrumentation;
import android.content.Intent;
import android.test.InstrumentationTestCase;
import android.test.TouchUtils;
import android.test.suitebuilder.annotation.MediumTest;
import android.view.View;
import cybercom.datamatics.baba.CDIS_SMSActivity;
import cybercom.datamatics.baba.Compose;

public class CDIS_SMSTests extends InstrumentationTestCase 
{
    @MediumTest

    public void testActivity()
    {
        Instrumentation instrumentation = getInstrumentation();
        Instrumentation.ActivityMonitor monitor =instrumentation.addMonitor(CDIS_SMSActivity.class.getName(),null,false);
        Intent intent = new Intent(Intent.ACTION_MAIN);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.setClassName(instrumentation.getTargetContext(),CDIS_SMSActivity.class.getName());
        instrumentation.startActivitySync(intent);

        Activity currentActivity = getInstrumentation().waitForMonitorWithTimeout(monitor,5);
        assertNotNull(currentActivity);
        View view = currentActivity.findViewById(cybercom.datamatics.baba.R.id.Composemessage);
        assertNotNull(view);
        View origin = currentActivity.getWindow().getDecorView();
        assertOnScreen(origin, view);

        instrumentation.removeMonitor(monitor);     
        monitor = instrumentation.addMonitor(Compose.class.getName(),null,false);       
        Intent ointent = new Intent();
        ointent.setClassName(instrumentation.getTargetContext(),Compose.class.getName());
        ointent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        instrumentation.startActivitySync(ointent);     
        Activity nextActivity = getInstrumentation().waitForMonitorWithTimeout(monitor,5);
        assertNotNull(nextActivity);

        View numberview = nextActivity.findViewById(cybercom.datamatics.baba.R.id.number);
        assertNotNull(numberview);
        View nextview = nextActivity.getWindow().getDecorView();
        assertOnScreen(nextview, numberview);       
        TouchUtils.clickView(this,numberview);
        instrumentation.sendStringSync("9964973058");

        View messageview = nextActivity.findViewById(cybercom.datamatics.baba.R.id.message);
        assertNotNull(messageview);
        TouchUtils.clickView(this,messageview);
        assertOnScreen(nextview, messageview);

        instrumentation.sendStringSync("hi");       
        View sendview = nextActivity.findViewById(cybercom.datamatics.baba.R.id.send);
        assertNotNull(sendview);
        assertOnScreen(nextview, sendview);
        TouchUtils.clickView(this,sendview);


    }
}

Ответы [ 3 ]

1 голос
/ 27 сентября 2011

эта ссылка может вам помочь http://code.google.com/p/robotium/issues/detail?id=1

0 голосов
/ 09 августа 2014

Эта проблема также может возникнуть с эмулятором.

Вы должны убедиться, что ваш экран не заблокирован. Когда экран заблокирован, приложение, которое вы тестируете, не имеет фокуса, поэтому команды пользовательского интерфейса отправляются на экран блокировки, а не в ваше приложение. Это поднимает исключение безопасности.

Добавление разрешения не решит проблему, единственное решение - разблокировать экран вручную или программно.

0 голосов
/ 14 июля 2013

Убедитесь, что вы нажимаете, где вы думаете, - в моем случае это был метод Robotium Solo.clickOnView.

Когда я отладил в коде, я нашел метод View.getLocationOnScreen для представленияЯ пытался щелкнуть, заполнял значения как 0,0, что явно выходит за пределы моего приложения (и вашего).Я до сих пор не уверен, почему представление сообщало об этих значениях, но оно было потомком GridView внутри DialogFragment, и, к счастью, я смог определить правильные смещения, используя GridView, код для полученияправильное расположение экрана при таком виде выглядит следующим образом:

private int[] getLocationOnScreen(View view) {
    Rect r = new Rect();
    view.getGlobalVisibleRect(r);
    int[] xy = new int[2];
    View viewParent = (View) view.getParent();
    viewParent.getLocationOnScreen(xy);
    xy[0] += r.left;
    xy[1] += r.top;
    viewParent.getGlobalVisibleRect(r);
    xy[0] -= r.left;
    xy[1] -= r.top;
    return xy;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...