java - Appium、Java 和 Testng - 查找 NullPointerException 的原因

标签 java nullpointerexception appium driver

我在 Appium 和模拟器启动之前收到 NullPointerException 。因此,尝试通过在代码中包含 sysout 行进行调试根本没有帮助。 如果有人有任何建议,请发送给我,因为我快疯了!

我的依赖项:

<dependencies>

        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.9</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-io</artifactId>
            <version>1.3.2</version>
        </dependency>

        <dependency>
            <groupId>io.appium</groupId>
            <artifactId>java-client</artifactId>
            <version>7.0.0</version>
        </dependency>

        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>7.0.0-beta3</version>
        </dependency>

        <dependency>
            <groupId>com.googlecode.json-simple</groupId>
            <artifactId>json-simple</artifactId>
            <version>1.1.1</version>
        </dependency>
        <dependency>
            <groupId>io.rest-assured</groupId>
            <artifactId>rest-assured</artifactId>
            <version>4.0.0</version>
        </dependency>

        <dependency>
            <groupId>io.cucumber</groupId>
            <artifactId>cucumber-testng</artifactId>
            <version>4.0.0</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>io.cucumber</groupId>
            <artifactId>cucumber-java</artifactId>
            <version>4.0.0</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>io.cucumber</groupId>
            <artifactId>cucumber-core</artifactId>
            <version>4.0.0</version>
            <scope>test</scope>
        </dependency>

    </dependencies> 

我的 Hooks 类:

package MA.test;

import io.appium.java_client.AppiumDriver;
import io.appium.java_client.MobileElement;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.remote.AndroidMobileCapabilityType;
import io.appium.java_client.remote.MobileCapabilityType;
import io.appium.java_client.service.local.AppiumDriverLocalService;
import io.appium.java_client.service.local.AppiumServiceBuilder;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Parameters;

import java.net.MalformedURLException;
import java.net.URL;

public class Hooks {

    public AppiumDriver driver;
    public AppiumDriverLocalService service;

    @Parameters({"platformVersion", "emulatorNumber", "deviceName", "port"})
    @BeforeTest(alwaysRun = true)
    public void startAppiumServer(String platformVersion, String emulatorNumber, String deviceName, String port) throws InterruptedException, MalformedURLException {
        System.out.println("\n ABC");
        service = new AppiumServiceBuilder()
                .usingPort(Integer.valueOf(port))
                .build();
        service.start();
        DesiredCapabilities caps = new DesiredCapabilities();
        caps.setCapability(MobileCapabilityType.PLATFORM_VERSION, platformVersion);
        caps.setCapability(MobileCapabilityType.DEVICE_NAME, emulatorNumber);
        caps.setCapability(AndroidMobileCapabilityType.AVD, deviceName);
        caps.setCapability(MobileCapabilityType.PLATFORM_NAME, "Android");
        caps.setCapability(MobileCapabilityType.APPLICATION_NAME, "Name");
        caps.setCapability(MobileCapabilityType.APPIUM_VERSION, "1.14.0");
        caps.setCapability(AndroidMobileCapabilityType.APP_ACTIVITY, "activity");
        caps.setCapability(AndroidMobileCapabilityType.APP_PACKAGE, "package");
        caps.setCapability(MobileCapabilityType.AUTOMATION_NAME, "UiAutomator2");

        driver = new AndroidDriver<MobileElement>(new URL("http://0.0.0.0:" + port + "/wd/hub"), caps);

        System.out.println("\n Appium server: " + service.getUrl());
        Thread.sleep(2000);
    }

    @AfterTest
    public void teardown() {
        service.stop();
        driver.quit();
        driver.closeApp();
        System.out.println("\n Test quit");
    }
}

我的 TestRunner 类:

package MA.steps;

import cucumber.api.CucumberOptions;
import cucumber.api.testng.AbstractTestNGCucumberTests;

@CucumberOptions(
        plugin = {"pretty", "html:target/cucumber-reports"}
        , monochrome = true
        , features = "src/test/java/feature"
        , tags = "@Login"
)

public class TestRunner extends AbstractTestNGCucumberTests {

}

我的 testng.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Android Parallel Execution" parallel="tests" thread-count="2" verbose="7">
    <test name="Device1">
        <parameter name="platformVersion" value="9.0"/>
        <parameter name="emulatorNumber" value="emulator-5554"/>
        <parameter name="deviceName" value="Android9_Nexus"/>
        <parameter name="port" value="4723"/>
        <classes>
            <class name="MA.steps.TestRunner"/>
        </classes>
    </test>
</suite>

我收到以下错误:

java.lang.NullPointerException at screens.myAccountOverviewScreen.logoutAccount(myAccountOverviewScreen.java:104)

指向以下代码行:

driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);

这是我的测试中第一次调用driver,但令我困惑的是它甚至没有启动appium或启动模拟器就抛出了nullpointerexception .

最佳答案

问题出在您的测试代码中。

您创建了一个套件 xml 文件,仅包含您的 TestRunner 类。但整个 appium 实例化逻辑都停留在 Hooks 类中,该类通过 TestNG 配置注释 @BeforeTest@AfterTest 来完成。但这个类既不包含在您的套件中,您的测试类 (TestRunner) 也不扩展它。因此,您的配置不会被调用,从而导致您的 AppiumDriver 对象出现空值。

要解决此问题,您可以执行以下操作之一:

  1. 编辑您的套件 xml 文件并在其中包含 Hooks 类。 (或)
  2. 构建一个实现 IInvokedMethodListener 的 TestNG 监听器,并将驱动程序实例化移动到其 beforeInvocation

关于java - Appium、Java 和 Testng - 查找 NullPointerException 的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57728050/

相关文章:

javascript - Appium错误:uncaughtException:无法读取null的属性“executeAtom”

java - 在自动化 Android 应用程序时,如何通过单击 appium 中的主页按钮导航到主屏幕?

java - AndroidElement和WebDriver等待方法问题

java - 线程中的异常 "AWT-EventQueue-0"java.lang.StringIndexOutOfBoundsException : String index out of range: 97

java - Collectors.toList() 返回什么样的 List<E>?

java - Netbeans 中可以播放声音,但 jar 中不能播放声音

java - 对象数组NullPointerException,处理3.3.6

java - 在 Java 中处理四倍精度 float (128 位)

java - 在项目之间共享单例逻辑,并针对每个项目进行修改

java - Hashmap 中的 NullPointerException 错误