Java PageFactory提供空指针异常

Java PageFactory提供空指针异常,java,appium,Java,Appium,我试图使用POM创建一个测试框架,但每当我使用PageFactory时,它都会给出一个NullPointerException 我只是试图打开应用程序,检查页面上是否存在给定元素 这是我的驾驶课: public class Driver extends BaseSetup { protected AndroidDriver<MobileElement> driver; public Driver() { this.driver = super.get

我试图使用POM创建一个测试框架,但每当我使用
PageFactory
时,它都会给出一个
NullPointerException

我只是试图打开应用程序,检查页面上是否存在给定元素

这是我的驾驶课:

public class Driver extends BaseSetup
{ 
    protected AndroidDriver<MobileElement> driver;
    public Driver() {
        this.driver = super.getDriver();
    }
}
我得到以下错误:

FAILED: openApplicationValidation
java.lang.NullPointerException
    at com.datamato.pages.OpenApplication.validatePageLoaded(OpenApplication.java:34)
    at com.datamato.tests.OpenApplicationTest.openApplicationValidation(OpenApplicationTest.java:15)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:86)
    at org.testng.internal.Invoker.invokeMethod(Invoker.java:645)
    at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:822)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1130)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:129)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:112)
    at org.testng.TestRunner.privateRun(TestRunner.java:782)
    at org.testng.TestRunner.run(TestRunner.java:632)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:366)
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:361)
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:319)
    at org.testng.SuiteRunner.run(SuiteRunner.java:268)
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1244)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
    at org.testng.TestNG.run(TestNG.java:1064)
    at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:113)
    at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:206)
    at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:177)

我应该怎么做才能更正它?

以下是您的程序流程

  • OpenApplication类对象调用参数化构造函数,即。
    OpenApplication(AppiumDriver驱动程序){}

  • 然后
    super()调用驱动程序类构造函数

    public Driver(){this.Driver=super.getDriver();}

  • 然后
    super.getDriver()
    method调用BaseSetup类
    getDriver
    方法,该方法返回
    androidDriver

  • 我几乎可以肯定的是,
    @BeforeClass
    注释方法从未被调用,因此
    androidDriver
    没有初始化

    // System.out.println("Driver in initdriver is : "+androidDriver); This must have not printed.
    
    这可能不是一个好的解决方案,但您可以在
    getDriver
    中尝试以下方法,如put
    initDriver
    方法,以便在使用驱动程序之前对其进行初始化

    解决方案:

    public AndroidDriver<MobileElement> getDriver() {
    initDriver();
    return androidDriver;
    }
    
    公共AndroidDriver getDriver(){ initDriver(); 返回驱动程序; }
    @Amit Jain,感谢您的快速响应,因为您提到我的@BeforeClass方法没有调用androidDriver,但它的调用和打印也是语句。请查找以下控制台输出,以供参考

    [TestNG] Running:
      C:\Users\DL41\AppData\Local\Temp\testng-eclipse--572591171\testng-customsuite.xml
    
    Inside initDriver method
    Argument to driver object : http://0.0.0.0:4723/wd/hub
    May 23, 2019 10:03:30 AM io.appium.java_client.remote.AppiumCommandExecutor$1 lambda$0
    INFO: Detected dialect: W3C
    Driver in initdriver is : io.appium.java_client.android.AndroidDriver, Capabilities: {appActivity=.MainActivity, appPackage=com.BajajServiceApp.VikramUAT, databaseEnabled=false, desired={platformName=android, appActivity=.MainActivity, appPackage=com.BajajServiceApp.VikramUAT, deviceName=OnePlus6T, noReset=true, udid=d6f08719}, deviceManufacturer=OnePlus, deviceModel=ONEPLUS A6010, deviceName=d6f08719, deviceScreenSize=1080x2340, deviceUDID=d6f08719, javascriptEnabled=true, locationContextEnabled=false, networkConnectionEnabled=true, noReset=true, platform=LINUX, platformName=Android, platformVersion=9, takesScreenshot=true, udid=d6f08719, warnings={}, webStorageEnabled=false}
    Starting Method :openApplicationValidation
    -----------------------------------------
    timer start
    timer end
    Ending Method :openApplicationValidation
    -----------------------------------------
    FAILED: openApplicationValidation
    java.lang.NullPointerException
        at com.datamato.pages.OpenApplication.validatePageLoaded(OpenApplication.java:34)
        at com.datamato.tests.OpenApplicationTest.openApplicationValidation(OpenApplicationTest.java:14)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:86)
        at org.testng.internal.Invoker.invokeMethod(Invoker.java:645)
        at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:822)
        at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1130)
        at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:129)
        at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:112)
        at org.testng.TestRunner.privateRun(TestRunner.java:782)
        at org.testng.TestRunner.run(TestRunner.java:632)
        at org.testng.SuiteRunner.runTest(SuiteRunner.java:366)
        at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:361)
        at org.testng.SuiteRunner.privateRun(SuiteRunner.java:319)
        at org.testng.SuiteRunner.run(SuiteRunner.java:268)
        at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
        at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
        at org.testng.TestNG.runSuitesSequentially(TestNG.java:1244)
        at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
        at org.testng.TestNG.run(TestNG.java:1064)
        at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:113)
        at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:206)
        at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:177)
    

    你能突出显示函数中哪一行正在崩溃吗?不清楚第二行是什么34@ShreyTrivedi感谢您的快速响应,下面一行的函数崩溃了:String str=newUser.getText()@维韦克,我还是不明白哪条线路在崩溃?您能在这里显示吗?@ShreyTrivedi请查看第四行字符串str=newUser.getText()中的类OpenApplication->method validatePageLoaded();好的.“WebElement newUser”应该在哪个阶段初始化?嘿,Amit,谢谢你的快速响应,但是我的@BeforeClass注释方法正在调用androidDriver,请查看下面的控制台输出以供参考。
    // System.out.println("Driver in initdriver is : "+androidDriver); This must have not printed.
    
    public AndroidDriver<MobileElement> getDriver() {
    initDriver();
    return androidDriver;
    }
    
    [TestNG] Running:
      C:\Users\DL41\AppData\Local\Temp\testng-eclipse--572591171\testng-customsuite.xml
    
    Inside initDriver method
    Argument to driver object : http://0.0.0.0:4723/wd/hub
    May 23, 2019 10:03:30 AM io.appium.java_client.remote.AppiumCommandExecutor$1 lambda$0
    INFO: Detected dialect: W3C
    Driver in initdriver is : io.appium.java_client.android.AndroidDriver, Capabilities: {appActivity=.MainActivity, appPackage=com.BajajServiceApp.VikramUAT, databaseEnabled=false, desired={platformName=android, appActivity=.MainActivity, appPackage=com.BajajServiceApp.VikramUAT, deviceName=OnePlus6T, noReset=true, udid=d6f08719}, deviceManufacturer=OnePlus, deviceModel=ONEPLUS A6010, deviceName=d6f08719, deviceScreenSize=1080x2340, deviceUDID=d6f08719, javascriptEnabled=true, locationContextEnabled=false, networkConnectionEnabled=true, noReset=true, platform=LINUX, platformName=Android, platformVersion=9, takesScreenshot=true, udid=d6f08719, warnings={}, webStorageEnabled=false}
    Starting Method :openApplicationValidation
    -----------------------------------------
    timer start
    timer end
    Ending Method :openApplicationValidation
    -----------------------------------------
    FAILED: openApplicationValidation
    java.lang.NullPointerException
        at com.datamato.pages.OpenApplication.validatePageLoaded(OpenApplication.java:34)
        at com.datamato.tests.OpenApplicationTest.openApplicationValidation(OpenApplicationTest.java:14)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:86)
        at org.testng.internal.Invoker.invokeMethod(Invoker.java:645)
        at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:822)
        at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1130)
        at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:129)
        at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:112)
        at org.testng.TestRunner.privateRun(TestRunner.java:782)
        at org.testng.TestRunner.run(TestRunner.java:632)
        at org.testng.SuiteRunner.runTest(SuiteRunner.java:366)
        at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:361)
        at org.testng.SuiteRunner.privateRun(SuiteRunner.java:319)
        at org.testng.SuiteRunner.run(SuiteRunner.java:268)
        at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
        at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
        at org.testng.TestNG.runSuitesSequentially(TestNG.java:1244)
        at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
        at org.testng.TestNG.run(TestNG.java:1064)
        at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:113)
        at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:206)
        at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:177)