Java UIAutomator-错误-调用虚拟方法
我正在UIautomator上运行一个简单的测试。我有一个类,有两个方法(一个用于设置环境,另一个用于在设备上执行UI交互) 我还有另一个类实例化第一个类并调用它们的方法。但是,当我运行代码时,我看到了这个错误:Java UIAutomator-错误-调用虚拟方法,java,android,android-studio,android-uiautomator,Java,Android,Android Studio,Android Uiautomator,我正在UIautomator上运行一个简单的测试。我有一个类,有两个方法(一个用于设置环境,另一个用于在设备上执行UI交互) 我还有另一个类实例化第一个类并调用它们的方法。但是,当我运行代码时,我看到了这个错误: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.test.uiautomator.UiObject2.click()' on a null object ref
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)
我的代码:
主类(自动SP_新):
类,该类执行以下操作:
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元素时出现了错误的屏幕。对mDevice.findObject(..)的调用之一返回null,表示找不到该对象。然后,当您尝试调用null对象上的click()时,会得到一个NPE
您应该仔细检查第147行,看看哪个特定调用失败了。您正在使用的选择器可能有问题,或者当它试图查找UI元素时,测试出现在错误的屏幕上。我在使用以下命令从命令行运行时出现此错误: ./gradlew连接Debugandroid试验 ./gradlew连接的防松试验 我想我得到这些错误是因为我忘记了。例如,下面是我的
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>
使用以下命令从命令行运行时出现此错误: ./gradlew连接Debugandroid试验 ./gradlew连接的防松试验 我想我得到这些错误是因为我忘记了。例如,下面是我的
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();
}
}
}
/**
*点击允许权限授予模式
*
*@见
*
*@param ui设备
*@UiObjectNotFoundException
*/
私有void AllowPermissionSifRequired(UiDevice UiDevice)引发UiObjectNotFoundException{
如果(Build.VERSION.SDK_INT>=23){
UiObject allowPermissions=uiDevice.findObject(新的UiSelector().text(“允许”));
if(allowPermissions.exists()){
allowPermissions.click();
}
}
}
多亏了乔·伯奇(Joe Birch),我才适应了屏幕显示“允许”而不是“允许”的情况作为文本。我在涉及需要权限的屏幕的测试中遇到了这个错误。我编写并调用了以下方法来处理请求权限和已授予权限的情况:
/**
* 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();
}
}
}
/**
*点击允许权限授予模式
*
*@见
*
*@param ui设备
*@UiObjectNotFoundException
*/
私有void AllowPermissionSifRequired(UiDevice UiDevice)引发UiObjectNotFoundException{
如果(Build.VERSION.SDK_INT>=23){
UiObject allowPermissions=uiDevice.findObject(新的UiSelector().text(“允许”));
if(allowPermissions.exists()){
allowPermissions.click();
}
}
}
多亏了乔·伯奇(Joe Birch),我才适应了屏幕显示“允许”而不是“允许”的情况如文本所示。根据stacktrace,错误发生在AutoCSP.java中的第147行。这是哪一行?您是否猜到哪个引用是
null
?您的问题中的代码太多了,所以TLDR,但是对于那些因为Uiautomator在测试结束前退出而来到这里的人,请在此处查看答案:Accordin对于stacktrace,错误发生在AutoCSP.java中的第147行。这是哪一行?您是否猜测哪个引用是null
?您的问题中有太多的代码,因此TLDR,但是对于那些因为Uiautomator在测试结束前退出而来这里的人,请在此处查看答案: