Getting nullpointerexception for PageObjectModel framework

Sharing my files…Please have a look and suggest what needs to be changed to make is workable.

  1. File to store Elements

import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.PageFactory;
import io.appium.java_client.AppiumDriver;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.pagefactory.AndroidFindBy;
import io.appium.java_client.pagefactory.AppiumFieldDecorator;

public class PageObjectModel {
public PageObjectModel(AppiumDriver<WebElement> driver) {
	PageFactory.initElements(new AppiumFieldDecorator(driver, null), this);
}

@AndroidFindBy(name = "App")
public WebElement appName;

}

  1. Script

import java.net.MalformedURLException;
import java.net.URL;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.remote.MobileCapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

public class getDetails {

DesiredCapabilities caps;
AndroidDriver driver;

@BeforeClass

public void setUp() throws MalformedURLException {
caps = new DesiredCapabilities();
	caps.setCapability(MobileCapabilityType.DEVICE_NAME, "android");
	caps.setCapability(MobileCapabilityType.APP_ACTIVITY,
			"io.appium.android.apis.ApiDemos");
	caps.setCapability(MobileCapabilityType.APP_PACKAGE,
			"io.appium.android.apis");
	caps.setCapability(MobileCapabilityType.PLATFORM_NAME, "Windows");
	driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"),
			caps);

}
@Test
public void testApp() {
	PageObjectModel pom = new PageObjectModel(driver);
	pom.appName.click();
}

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

}

  1. Exception that I’m getting on executing script

FAILED: testApp
java.lang.NullPointerException
at io.appium.java_client.pagefactory.AppiumElementLocator.waitFor(AppiumElementLocator.java:133)
at io.appium.java_client.pagefactory.AppiumElementLocator.findElement(AppiumElementLocator.java:145)
at io.appium.java_client.pagefactory.interceptors.InterceptorOfASingleElement.intercept(InterceptorOfASingleElement.java:51)
at io.appium.java_client.android.AndroidElement$$EnhancerByCGLIB$$f7620db.click()
at test.appium.diff.getDetails.testApp(getDetails.java:41)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:85)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:639)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:821)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1131)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:124)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:108)
at org.testng.TestRunner.privateRun(TestRunner.java:773)
at org.testng.TestRunner.run(TestRunner.java:623)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:357)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:352)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:310)
at org.testng.SuiteRunner.run(SuiteRunner.java:259)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1185)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1110)
at org.testng.TestNG.run(TestNG.java:1018)
at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:111)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:204)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:175)

Hey, you are not initializing capability objects. Try to debug logs before putting these kind of error in this forum. It has nothing to do with appium. It’s just basic Java programming.

Thanks,
Priyank Shah

Hi Priyank…

Thanks for quick reply…

Can you go through the pasted scripts and let me know what changes I need to do so that my script would run successfully.

Hi Priyank,

I got, what you were trying to suggest.

Now I intilizaed the capabilitie object, but still getting the nullpointerexception when I’m calling pageObjectModel. If I’m calling locator using driver.findlement… It’s working fine.

Pasting new logs for your reference -
FAILED: testApp
java.lang.NullPointerException
at io.appium.java_client.pagefactory.AppiumElementLocator.waitFor(AppiumElementLocator.java:133)
at io.appium.java_client.pagefactory.AppiumElementLocator.findElement(AppiumElementLocator.java:145)
at io.appium.java_client.pagefactory.interceptors.InterceptorOfASingleElement.intercept(InterceptorOfASingleElement.java:51)
at io.appium.java_client.android.AndroidElement$$EnhancerByCGLIB$$f7620db.click()
at test.appium.diff.getDetails.testApp(getDetails.java:41)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:85)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:639)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:821)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1131)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:124)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:108)
at org.testng.TestRunner.privateRun(TestRunner.java:773)
at org.testng.TestRunner.run(TestRunner.java:623)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:357)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:352)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:310)
at org.testng.SuiteRunner.run(SuiteRunner.java:259)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1185)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1110)
at org.testng.TestNG.run(TestNG.java:1018)
at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:111)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:204)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:175)

Is ur element always present on page??

Hi Priyank…

I’m performing operation on only single object in this script. Appium opens the App, but when it comes to perform click operation on text “App”. It throws this exception [NullPointerException].

Hi Priyank,

Please suggest me on this, what should be done to make the script working.

UPDATED

change 1:

public class PageObjectModel {

protected AndroidDriver driver;

@AndroidFindBy(name = "App")
public AndroidElement appName;

public PageObjectModel(AndroidDriver driver) {
	this.driver = driver;
   }

public void tapName() {
        return appName.click();
    }

}

change 2:

PageObjectModel pom = PageFactory.initElements(driver, PageObjectModel.class);
pom.tapName();

Hi Aleksei,

Thanks for your reply.

I tried this suggestion but still get the RunTimeException. Attaching the log here -

FAILED: testApp
java.lang.RuntimeException: java.lang.InstantiationException: test.appium.diff.PageObjectModel
at org.openqa.selenium.support.PageFactory.instantiatePage(PageFactory.java:134)
at org.openqa.selenium.support.PageFactory.initElements(PageFactory.java:64)
at test.appium.diff.getDetails.testApp(getDetails.java:39)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:85)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:639)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:821)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1131)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:124)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:108)
at org.testng.TestRunner.privateRun(TestRunner.java:773)
at org.testng.TestRunner.run(TestRunner.java:623)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:357)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:352)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:310)
at org.testng.SuiteRunner.run(SuiteRunner.java:259)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1185)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1110)
at org.testng.TestNG.run(TestNG.java:1018)
at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:111)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:204)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:175)
Caused by: java.lang.InstantiationException: test.appium.diff.PageObjectModel
at java.lang.Class.newInstance(Unknown Source)
at org.openqa.selenium.support.PageFactory.instantiatePage(PageFactory.java:131)
… 26 more
Caused by: java.lang.NoSuchMethodException: test.appium.diff.PageObjectModel.()
at java.lang.Class.getConstructor0(Unknown Source)
… 28 more

PageFactory.initElements(new AppiumFieldDecorator(driver), this); – can u try this and let me know.

@Test
public void testApp() {

	PageObjectModel pom = PageFactory.initElements(new AppiumFieldDecorator(driver), this);

pom.tapName();

}

Compile Error - Type mismatch: cannot convert from void to PageObjectModel

              public PageObjectModel(AppiumDriver<? extends MobileElement> driver) {
                // TODO Auto-generated constructor stub
                this.driver = driver;
                PageFactory.initElements(new AppiumFieldDecorator(driver, implicitWaitTime,
                        TimeUnit.SECONDS), this);
            }

Try this

Worked…Thanks Priyank…