UIAutomator - 错误 - 调用虚方法

时间:2016-02-04 18:03:36

标签: java android android-studio uiautomator

我在UIautomator上运行一个简单的测试。我有一个有2种方法的类(一种用于设置环境,另一种用于在设备上执行UI交互。

我还有另一个类,它将第一个类实例化并调用它们的方法。但是,当我运行代码时,我发现了这个错误:

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


    }
}
你可以帮帮我吗?当我在一个单独的哑类中编码时,一切运行正常,但是当我将它们分开以便将来重用代码时,我收到了这个错误....

3 个答案:

答案 0 :(得分:0)

对mDevice.findObject(..)的一个调用返回null,表示找不到该对象。然后,当您尝试在null对象上调用click()时,您将获得一个NPE。

你应该仔细检查第147行,看看哪个特定的通话失败了。您正在使用的选择器可能存在问题,或者在尝试查找UI元素时测试位于错误的屏幕上。

答案 1 :(得分:0)

使用以下命令从命令行运行时出现此错误:

  

./ gradlew connectedDebugAndroidTest

     

./ gradlew connectedAndroidTest

我认为我得到这些错误是因为我忘记了specify AndroidJUnitRunner as the default instrumentation runner in my projectIn an appropriate AndroidManifest.xml, define an instrumentation with android:name set to AndroidJUnitRunner and the appropriate android:targetPackage set.例如,这是我的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>

答案 2 :(得分:0)

在涉及需要许可的屏幕的测试中,我收到此错误。我编写并调用了以下方法来处理它请求许可的情况以及已经被授予许可的情况:

ViewMovies.cshtml

感谢Joe Birch提供的solution,我将其用于处理显示为“ ALLOW”而不是“ Allow”的文本的屏幕。