簡體   English   中英

PageFactory給出了空指針異常

[英]PageFactory gives null pointer exception

我正在嘗試使用POM創建一個測試框架,但是每當我使用PageFactory它都會給出NullPointerException

我只是試圖打開應用程序,並檢查給定元素在頁面上是否存在。

這是我的驅動程序類:

public class Driver extends BaseSetup
{ 
    protected AndroidDriver<MobileElement> driver;
    public Driver() {
        this.driver = super.getDriver();
    }
}

這是我的BaseSetup類:

public class BaseSetup {

    private DesiredCapabilities capabilities;// = new DesiredCapabilities();
    protected AndroidDriver<MobileElement> androidDriver = null;

    private String appiumPort="4723";
    private String serverIp="0.0.0.0";

  //String workingDevice = "emulator-5554";
    String workingDevice = "d6f08719";

    @BeforeClass                                                                                                                            
    public void setup() {
        initDriver();
    }


    public AndroidDriver<MobileElement> getDriver() {
        return androidDriver;
    }

    private void initDriver() {
        System.out.println("Inside initDriver method");

      //  DesiredCapabilities cap = new DesiredCapabilities();
        capabilities = new DesiredCapabilities();
        capabilities.setCapability("deviceName", "OnePlus6T");
        capabilities.setCapability("udid", workingDevice);
        capabilities.setCapability("appPackage", "com.ServiceApp.Vivek");
        capabilities.setCapability("appActivity", ".MainActivity");
        capabilities.setCapability("noReset", "true");
        String serverUrl = "http://" + serverIp + ":" + appiumPort + "/wd/hub";


        try
        {
            System.out.println("Argument to driver object : " + serverUrl);
            androidDriver = new AndroidDriver<MobileElement>(new URL(serverUrl), capabilities);

        }
        catch (NullPointerException | MalformedURLException ex) {
            throw new RuntimeException("appium driver could not be initialised for device ");
        }
        System.out.println("Driver in initdriver is : "+androidDriver);

    }

    @AfterClass
    public void tearDown() {
        androidDriver.quit();
    }

    @BeforeMethod
    public void beforeMethod(Method method) {
        System.out.println("Starting Method :" + method.getName());
        System.out.println("-----------------------------------------");
    }

    @AfterMethod
    public void afterMethod(Method method) {
        System.out.println("Ending Method :" + method.getName());
        System.out.println("-----------------------------------------");
    }

}

這是我的OpenApplication類:

public class OpenApplication extends Driver{

    public OpenApplication(AppiumDriver<MobileElement> driver) {
        super();
        PageFactory.initElements(new AppiumFieldDecorator(driver), OpenApplication.class);
    }

    public void validatePageLoaded() throws InterruptedException {
        System.out.println("timer start");
        Thread.sleep(5000);
        System.out.println("timer end");
        String str=newUser.getText();
        System.out.println(str);

        System.out.println("Successfully");
        if (newUser.isDisplayed() && existingCustomer.isDisplayed()
                && welcomeText.isDisplayed()) {
            System.out.println("App open Successfully..!");

        } else {
            System.out.println("App is not loaded..!");
        }
    }


        @CacheLookup
        @AndroidFindBy(xpath = "//android.view.View[@index='2']")
        public WebElement newUser;

        @CacheLookup
        @AndroidFindBy(xpath = "//android.view.View[@index='4']")
        public WebElement existingCustomer;

        @CacheLookup
        @AndroidFindBy(xpath = "//android.view.View[@text='Welcome To Bajaj Finserv']")
        public WebElement welcomeText;



}

這是我的OpenApplicationTest類:

public class OpenApplicationTest extends Driver {

    @Test(priority = 0)
    public void openApplicationValidation() throws InterruptedException {
        OpenApplication openApplication= new OpenApplication(driver);           
        openApplication.validatePageLoaded();       
    }
}

我收到以下錯誤消息:

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)

我該怎么做才能糾正它?

以下是您的程序流程

  1. OpenApplication類對象調用參數化的構造函數,即OpenApplication(AppiumDriver<MobileElement> driver) { }

  2. 然后super(); 調用Driver類的構造函數

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

  3. 然后是super.getDriver(); 方法調用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;
}

@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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM