UIAutomator - Ошибка - Вызов виртуального метода

Я запускаю простой тест на UIautomator. У меня есть класс с двумя методами (один для настройки окружения, а другой для взаимодействия с пользовательским интерфейсом на устройстве.

И у меня есть еще один класс, который создает экземпляр первого класса и вызывает его методы. Однако я вижу эту ошибку при запуске кода:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.test.uiautomator.UiObject2.click()' on a null object reference
   at com.example.rcorrea.AutoCSP.testCSP(AutoCSP.java:147)
   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:555)
   at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1873)

Мой код:

Основной класс (AutoCSP_new):

package com.example.rcorrea;

import android.support.test.uiautomator.By;
import android.support.test.uiautomator.BySelector;
import android.support.test.uiautomator.UiDevice;
import android.support.test.uiautomator.UiObject;
import android.support.test.uiautomator.UiObject2;
import android.support.test.uiautomator.Until;
import android.test.InstrumentationTestCase;
import java.util.*;
import static java.lang.System.out;


/**
 * Created by rcorrea on 10/1/2015.
 */
public class AutoCSP_new extends InstrumentationTestCase {


    private UiDevice mDevice;
    private AutoCSP_Generica autocsp;
    private Vector numeros;

    public void test() throws Exception

    {
        numeros = new Vector (5);

        numeros.addElement(new String ("0191234"));
        numeros.addElement(new String ("0191234"));
        numeros.addElement(new String ("0191234"));
        numeros.addElement(new String ("0191234"));


        //numeros[0] = "0191234";
        //numeros[1] = "0191234567";
       // numeros[2] = "01912345678";
        //numeros[3] = "019123456789";
        autocsp = new AutoCSP_Generica (numeros);

        autocsp.setUp();
        autocsp.testCSP();
    }
}

Класс, который делает вещи:

package com.example.rcorrea;

import android.support.test.uiautomator.By;
import android.support.test.uiautomator.BySelector;
import android.support.test.uiautomator.UiDevice;
import android.support.test.uiautomator.UiObject;
import android.support.test.uiautomator.UiObject2;
import android.support.test.uiautomator.Until;
import android.test.InstrumentationTestCase;
import java.util.*;

import static android.support.test.uiautomator.UiDevice.*;
import static java.lang.System.out;


import java.sql.Time;

/**
 * Created by rcorrea on 10/1/2015.
 */
public class AutoCSP_Generica extends InstrumentationTestCase {


    private UiDevice mDevice;
    //private String[] numeros = new String[10];
    private Vector numeros;

    public AutoCSP_Generica(Vector num)
    {
        this.numeros = num;
    }


    public void setUp() throws Exception {
        super.setUp();

        mDevice = UiDevice.getInstance(getInstrumentation());

        mDevice.pressHome();

        mDevice.wait(Until.hasObject(By.text("Telefone")), 10000);

        UiObject2 appsButton = mDevice.findObject(By.text("Telefone"));
        if (mDevice.findObject(By.text("Telefone")) == null){

            mDevice.pressHome();

        }
        appsButton.click();


        mDevice.wait(Until.hasObject(By.res("com.android.contacts:id/more_menu")), 3000);
        UiObject2 moreButton = mDevice.findObject(By.res("com.android.contacts:id/more_menu"));
        moreButton.click();

        mDevice.wait(Until.hasObject(By.text("Configurações")), 3000);
        mDevice.waitForIdle(10000);
        UiObject2 buttonSettings = mDevice.findObject(By.text("Configurações"));
        buttonSettings.click();

        //assertEquals com.android.systemui:id/mobile.enabled = true;

        mDevice.wait(Until.hasObject(By.text("Chamadas")), 3000);
        UiObject2 buttonCall = mDevice.findObject(By.text("Chamadas"));
        buttonCall.click();



        mDevice.wait(Until.hasObject(By.text("Mais configurações")), 5000);
        UiObject2 buttonMore = mDevice.findObject(By.text("Mais configurações"));
        buttonMore.click();

        while (mDevice.hasObject(By.textContains("Lendo")) == true){

            mDevice.waitForIdle(5000);
        }

        mDevice.wait(Until.hasObject(By.text("Números FDN")), 5000);
        UiObject2 buttonFDN = mDevice.findObject(By.text("Números FDN"));
        buttonFDN.click();

        mDevice.waitForIdle(6000);

        mDevice.wait(Until.hasObject(By.text("Ativar FDN")), 5000);
        UiObject2 buttonOn = mDevice.findObject(By.text("Ativar FDN"));
        buttonOn.click();

        mDevice.waitForIdle(5000);


        mDevice.wait(Until.hasObject(By.clazz("android.widget.EditText")), 5000);
        UiObject2 buttonInsert = mDevice.findObject(By.clazz("android.widget.EditText"));
        buttonInsert.setText("1234");


        mDevice.waitForIdle(5000);

        mDevice.wait(Until.hasObject(By.text("OK")), 5000);
        UiObject2 buttonOk = mDevice.findObject(By.text("OK"));
        buttonOk.click();

        mDevice.waitForIdle(5000);

        mDevice.wait(Until.hasObject(By.text("Lista FDN")), 5000);
        UiObject2 buttonList = mDevice.findObject(By.text("Lista FDN"));
        buttonList.click();

        mDevice.waitForIdle(5000);

        //Adicionando o Contato na FDN, 8 Digitos
        mDevice.wait(Until.hasObject(By.text("Adicionar")), 5000);
        UiObject2 buttonAdd = mDevice.findObject(By.text("Adicionar"));
        buttonAdd.click();

        mDevice.waitForIdle(5000);

        mDevice.wait(Until.hasObject(By.res("com.android.phone:id/fdn_number")), 7000);
        UiObject2 buttonNum = mDevice.findObject(By.res("com.android.phone:id/fdn_number"));
        buttonNum.setText("01912345678");

        mDevice.waitForIdle(5000);

        mDevice.wait(Until.hasObject(By.res("com.android.phone:id/fdn_pin2")), 7000);
        UiObject2 buttonPIN = mDevice.findObject(By.res("com.android.phone:id/fdn_pin2"));
        buttonPIN.setText("1234");

        mDevice.waitForIdle(5000);
        mDevice.wait(Until.hasObject(By.text("Salvar")), 7000);
        UiObject2 buttonSave = mDevice.findObject(By.text("Salvar"));
        buttonSave.click();

        mDevice.waitForIdle(5000);

        //Adicionando com 9 Digitos.
        mDevice.wait(Until.hasObject(By.text("Adicionar")), 5000);
        buttonAdd = mDevice.findObject(By.text("Adicionar"));
        buttonAdd.click();

        mDevice.waitForIdle(5000);

        mDevice.wait(Until.hasObject(By.res("com.android.phone:id/fdn_number")), 7000);
        buttonNum = mDevice.findObject(By.res("com.android.phone:id/fdn_number"));
        buttonNum.setText("019123456789");

        mDevice.waitForIdle(5000);

        mDevice.wait(Until.hasObject(By.res("com.android.phone:id/fdn_pin2")), 7000);
        buttonPIN = mDevice.findObject(By.res("com.android.phone:id/fdn_pin2"));
        buttonPIN.setText("1234");

        mDevice.waitForIdle(5000);
        mDevice.wait(Until.hasObject(By.text("Salvar")), 7000);
        buttonSave = mDevice.findObject(By.text("Salvar"));
        buttonSave.click();

        mDevice.waitForIdle(5000);

        //Adicionando com 8 Digitos e CSP diferente
        mDevice.wait(Until.hasObject(By.text("Adicionar")), 5000);
        buttonAdd = mDevice.findObject(By.text("Adicionar"));
        buttonAdd.click();

        mDevice.waitForIdle(5000);

        mDevice.wait(Until.hasObject(By.res("com.android.phone:id/fdn_number")), 7000);
        buttonNum = mDevice.findObject(By.res("com.android.phone:id/fdn_number"));
        buttonNum.setText("0181912345678");

        mDevice.waitForIdle(5000);

        mDevice.wait(Until.hasObject(By.res("com.android.phone:id/fdn_pin2")), 7000);
        buttonPIN = mDevice.findObject(By.res("com.android.phone:id/fdn_pin2"));
        buttonPIN.setText("1234");

        mDevice.waitForIdle(5000);
        mDevice.wait(Until.hasObject(By.text("Salvar")), 7000);
        buttonSave = mDevice.findObject(By.text("Salvar"));
        buttonSave.click();

        mDevice.waitForIdle(5000);

        //Adicionando com CSP diferente e 9 Digitos
        mDevice.wait(Until.hasObject(By.text("Adicionar")), 5000);
        buttonAdd = mDevice.findObject(By.text("Adicionar"));
        buttonAdd.click();

        mDevice.waitForIdle(5000);

        mDevice.wait(Until.hasObject(By.res("com.android.phone:id/fdn_number")), 7000);
        buttonNum = mDevice.findObject(By.res("com.android.phone:id/fdn_number"));
        buttonNum.setText("01819123456789");

        mDevice.waitForIdle(5000);

        mDevice.wait(Until.hasObject(By.res("com.android.phone:id/fdn_pin2")), 7000);
        buttonPIN = mDevice.findObject(By.res("com.android.phone:id/fdn_pin2"));
        buttonPIN.setText("1234");

        mDevice.waitForIdle(5000);
        mDevice.wait(Until.hasObject(By.text("Salvar")), 7000);
        buttonSave = mDevice.findObject(By.text("Salvar"));
        buttonSave.click();

        mDevice.waitForIdle(5000);
        mDevice.pressHome();


    }


    public void testCSP() throws Exception {
        //FirstTest 11 Numbers.


        mDevice.wait(Until.hasObject(By.res("com.android.contacts:id/digits")), 3000);
        UiObject2 buttonNumber = mDevice.findObject((By.res("com.android.contacts:id/digits")));
        buttonNumber.click();

        buttonNumber.setText(numeros.get(0).toString());

        mDevice.wait(Until.hasObject(By.desc("Chamar")), 10000);
        UiObject2 buttonDial = mDevice.findObject(By.desc("Chamar"));
        buttonDial.click();

        mDevice.wait(Until.hasObject(By.text("Encerrar")), 50000);
        UiObject2 buttonEnd = mDevice.findObject(By.text("Encerrar"));
        buttonEnd.click();

        mDevice.waitForIdle(10000);
        mDevice.pressBack();

        //Second Test 7 Numbers.
        mDevice.wait(Until.hasObject(By.res("com.android.contacts:id/digits")), 3000);
        buttonNumber = mDevice.findObject((By.res("com.android.contacts:id/digits")));
        buttonNumber.click();

        buttonNumber.setText(numeros.get(1).toString());

        mDevice.wait(Until.hasObject(By.desc("Chamar")), 10000);
        buttonDial = mDevice.findObject(By.desc("Chamar"));
        buttonDial.click();

        mDevice.wait(Until.hasObject(By.text("Encerrar")), 50000);
        buttonEnd = mDevice.findObject(By.text("Encerrar"));
        buttonEnd.click();

        mDevice.waitForIdle(10000);
        mDevice.pressBack();

        //Third Test 12 Numbers
        mDevice.wait(Until.hasObject(By.res("com.android.contacts:id/digits")), 3000);
        buttonNumber = mDevice.findObject((By.res("com.android.contacts:id/digits")));
        buttonNumber.click();

        buttonNumber.setText(numeros.get(2).toString());

        mDevice.wait(Until.hasObject(By.desc("Chamar")), 10000);
        buttonDial = mDevice.findObject(By.desc("Chamar"));
        buttonDial.click();

        mDevice.wait(Until.hasObject(By.text("Encerrar")), 50000);
        buttonEnd = mDevice.findObject(By.text("Encerrar"));
        buttonEnd.click();

        mDevice.waitForIdle(10000);
        mDevice.pressBack();

        //Fourth Test 10 Numbers
        mDevice.wait(Until.hasObject(By.res("com.android.contacts:id/digits")), 3000);
        buttonNumber = mDevice.findObject((By.res("com.android.contacts:id/digits")));
        buttonNumber.click();

        buttonNumber.setText(numeros.get(3).toString());

        mDevice.wait(Until.hasObject(By.desc("Chamar")), 10000);
        buttonDial = mDevice.findObject(By.desc("Chamar"));
        buttonDial.click();

        mDevice.wait(Until.hasObject(By.text("Encerrar")), 50000);
        buttonEnd = mDevice.findObject(By.text("Encerrar"));
        buttonEnd.click();

        mDevice.waitForIdle(10000);
        mDevice.pressBack();

        //Starting Videocall protocols.

        //FirstTest 11 Numbers.
        mDevice.wait(Until.hasObject(By.res("com.android.contacts:id/digits")), 3000);
        buttonNumber = mDevice.findObject((By.res("com.android.contacts:id/digits")));
        buttonNumber.click();

        buttonNumber.setText(numeros.get(0).toString());

        mDevice.wait(Until.hasObject(By.desc("Videochamada")), 10000);
        buttonDial = mDevice.findObject(By.desc("Videochamada"));
        buttonDial.click();

        mDevice.wait(Until.hasObject(By.text("Encerrar")), 50000);
        buttonEnd = mDevice.findObject(By.text("Encerrar"));
        mDevice.waitForIdle(10000);
        buttonEnd.click();

        mDevice.waitForIdle(10000);
        mDevice.pressBack();

        //Second Test 7 Numbers.
        mDevice.wait(Until.hasObject(By.res("com.android.contacts:id/digits")), 3000);
        buttonNumber = mDevice.findObject((By.res("com.android.contacts:id/digits")));
        buttonNumber.click();

        buttonNumber.setText(numeros.get(1).toString());

        mDevice.wait(Until.hasObject(By.desc("Videochamada")), 10000);
        buttonDial = mDevice.findObject(By.desc("Videochamada"));
        buttonDial.click();

        mDevice.wait(Until.hasObject(By.text("Encerrar")), 50000);
        buttonEnd = mDevice.findObject(By.text("Encerrar"));
        mDevice.waitForIdle(10000);
        buttonEnd.click();

        mDevice.waitForIdle(10000);
        mDevice.pressBack();

        //Third Test 12 Numbers
        mDevice.wait(Until.hasObject(By.res("com.android.contacts:id/digits")), 3000);
        buttonNumber = mDevice.findObject((By.res("com.android.contacts:id/digits")));
        buttonNumber.click();

        buttonNumber.setText(numeros.get(2).toString());

        mDevice.wait(Until.hasObject(By.desc("Videochamada")), 10000);
        buttonDial = mDevice.findObject(By.desc("Videochamada"));
        buttonDial.click();

        mDevice.wait(Until.hasObject(By.text("Encerrar")), 50000);
        buttonEnd = mDevice.findObject(By.text("Encerrar"));
        mDevice.waitForIdle(10000);
        buttonEnd.click();

        mDevice.waitForIdle(10000);
        mDevice.pressBack();

        //Fourth Test 10 Numbers
        mDevice.wait(Until.hasObject(By.res("com.android.contacts:id/digits")), 3000);
        buttonNumber = mDevice.findObject((By.res("com.android.contacts:id/digits")));
        buttonNumber.click();

        buttonNumber.setText(numeros.get(3).toString());

        mDevice.wait(Until.hasObject(By.desc("Videochamada")), 10000);
        buttonDial = mDevice.findObject(By.desc("Videochamada"));
        buttonDial.click();

        mDevice.wait(Until.hasObject(By.text("Encerrar")), 50000);
        buttonEnd = mDevice.findObject(By.text("Encerrar"));
        buttonEnd.click();

        mDevice.waitForIdle(10000);
        mDevice.pressBack();


    }
}

Не могли бы вы мне помочь? Все работало нормально, когда я кодировал один тупой класс, но когда я разделил их для повторного использования кода в будущем, я получил эту ошибку....


person Andreteste Test    schedule 04.02.2016    source источник
comment
Судя по трассировке стека, ошибка возникает в строке 147 файла AutoCSP.java. Что это за линия? Есть ли у вас какие-либо предположения относительно того, какая ссылка является null?   -  person Code-Apprentice    schedule 04.02.2016
comment
У вас слишком много кода в вашем вопросе, поэтому TLDR, но для тех, кто пришел сюда, потому что Uiaautomator закрывался до завершения теста, ознакомьтесь с ответом здесь: stackoverflow.com/questions/31377936/   -  person HRVHackers    schedule 24.05.2016


Ответы (3)


Один из вызовов mDevice.findObject(..) возвращает значение null, что означает, что объект не найден. Затем, когда вы пытаетесь вызвать click() для нулевого объекта, вы получаете NPE.

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

person Allen Hair    schedule 05.02.2016

Я получил эту ошибку при запуске из командной строки с такими командами:

./gradlewconnectedDebugAndroidTest

./gradlew подключенAndroidTest

Я думаю, что получил эти ошибки, потому что забыл указать AndroidJUnitRunner как средство запуска инструментов по умолчанию в моем проекте. В соответствующем файле AndroidManifest.xml определите инструментарий с android:name установите AndroidJUnitRunner и соответствующий набор android:targetPackage. Например, вот мой app/src/debug/AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mypackage.android.sdk" >
    
    <instrumentation
        android:name="androidx.test.runner.AndroidJUnitRunner"
        android:targetPackage="com.mypackage.android.sdk"/>

</manifest>
person Michael Osofsky    schedule 19.12.2018

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

/**
 * Taps Allow on permission granting modal
 *
 * @see <a href="https://medium.com/exploring-android/handling-android-runtime-permissions-in-ui-tests-981f9dc11a4e">medium.com article</a>
 *
 * @param uiDevice
 * @throws UiObjectNotFoundException
 */
private void allowPermissionsIfNeeded(UiDevice uiDevice) throws UiObjectNotFoundException {
    if (Build.VERSION.SDK_INT >= 23) {
        UiObject allowPermissions = uiDevice.findObject(new UiSelector().text("ALLOW"));
        if (allowPermissions.exists()) {
            allowPermissions.click();
        }
    }
}

Спасибо Джо Берчу за это решение который я адаптировал для работы с моими экранами, на которых в качестве текста отображается «РАЗРЕШИТЬ» вместо «Разрешить».

person Michael Osofsky    schedule 19.12.2018