[英]UIAutomator - Error - Invoking virtual method
我正在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();
}
}
你能幫我嗎? 當我在單個啞類中編寫代碼時,一切運行良好,但是當我將它們分離以在將來重用代碼時,出現了此錯誤。
對mDevice.findObject(..)的調用之一返回null,這意味着未找到該對象。 然后,當您嘗試在null對象上調用click()時,會得到一個NPE。
您應該仔細檢查第147行,以查看哪個特定呼叫失敗。 您使用的選擇器可能存在問題,或者在嘗試查找UI元素時測試顯示在錯誤的屏幕上。
使用以下命令從命令行運行時出現此錯誤:
./gradlew connectedDebugAndroidTest
./gradlew connectedAndroidTest
我認為我遇到了這些錯誤,因為我忘記了將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>
在涉及需要權限的屏幕的測試中,我收到此錯誤。 我編寫並調用了以下方法來處理它請求許可的情況和已經授予許可的情況:
/**
* 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();
}
}
}
感謝Joe Birch提供的此解決方案 ,我適應了我的屏幕顯示“ ALLOW”而不是“ Allow”的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.