Page Object Factory with Appium

I am trying to use Page Object Factory for Appium Test and seem to be having issues linking two pages together.

First Page Below

import java.io.File;
import java.net.URL;
import java.util.concurrent.TimeUnit;

import org.junit.After;
import org.junit.Before;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.annotations.Test;

import Test2.AbstractPageObject;
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;
import io.appium.java_client.remote.MobileCapabilityType;

public class Test1 {

public static class PageObject {

    private final WebDriver driver;


    @AndroidFindBy(uiAutomator = "new UiSelector().text(\"Sign in\")")
    private WebElement element;

    public PageObject(WebDriver driver)

    {
        this.driver = driver;
        PageFactory.initElements(new AppiumFieldDecorator(driver, 10, TimeUnit.SECONDS), this);
    }

    public void click(){
        element.click();
    }
}

private PageObject po;

@Before
public void setup() throws Exception {
    File appDir = new File("src");
    File app = new File(appDir, "app.apk");
    DesiredCapabilities capabilities = new DesiredCapabilities();
    capabilities.setCapability(MobileCapabilityType.BROWSER_NAME, "");
    capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "Android Emulator");
    capabilities.setCapability(MobileCapabilityType.PLATFORM_NAME, "Android");
    capabilities.setCapability(MobileCapabilityType.APP, app.getAbsolutePath());

    po = new PageObject(new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities));

}

@org.junit.Test
public void test () {
    AbstractPageObject po = new AbstractPageObject (null);   
    po.test();
}

Second Page

import java.io.File;
import java.net.URL;
import java.util.concurrent.TimeUnit;

import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.support.FindBy;
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;
import io.appium.java_client.remote.MobileCapabilityType;

public class Test2 {

 public static abstract class AbstractPageObject extends Test1 {

        protected final WebDriver driver;       
        public AbstractPageObject(WebDriver driver)
        {
            this.driver = driver;
            PageFactory.initElements(new AppiumFieldDecorator(driver, 10, TimeUnit.SECONDS), this);
        }
    }   


    public static class PageObject extends AbstractPageObject {

        public PageObject(WebDriver driver) {
            super(driver);
        }
        @FindBy(className="android.widget.ImageButton")
        private WebElement c;
        public void click1()
        {
            c.click();
        }

        @FindBy(id = "com.payment.pay:id/btn_sign_in")
        private WebElement d;
        public void click11()
        {
            d.click();
        }
        @FindBy(id="com.payment.pay:id/btn_forgotten_password")
        private WebElement e;
        public void click111()
        {
            e.click();
        }
        @FindBy(className= "android.widget.ImageButton")
        private WebElement f;
        public void click1111()
        {
            f.click();
        }

        @FindBy(id="com.payment.pay:id/btn_show_pass")
        private WebElement g;
        public void click11111()
        {
            g.click();
        }
    }

}

Why are you making class as static? this is not good implementation.

Could explain better how i can resolve this. I’d appreciate if you could make edits. Thank you

Guys, whats wrong with my page object factory page, i cant get i to work any way? Help me with th error please.
Thanks.

public class POF_setUp {
WebDriver driver;

public POF_setUp(AppiumDriver<MobileElement> driver) {
	this.driver = driver;
	 // PageFactory.initElements(driver,  this);
	 // PageFactory.initElements(new AppiumFieldDecorator(driver), this);
	 PageFactory.initElements(new AppiumFieldDecorator(driver, 30, TimeUnit.SECONDS), this);
	}

@AndroidFindBy(id = "com.whatsapp:id/conversations_row_contact_name")
WebElement firstfrnd;

public void clickOnOneFriend() {
	// FluentWait wait = new FluentWait(driver).withTimeout(30, TimeUnit.SECONDS) .pollingEvery(5, TimeUnit.SECONDS) .ignoring(NoSuchElementException.class);
	// ((WebElement) wait.until(ExpectedConditions.elementToBeClickable(firstfrnd))).click();
	firstfrnd.click();
}

}

And the Error is the following:

java.lang.NoSuchMethodError: org.openqa.selenium.support.ui.FluentWait.until(Lcom/google/common/base/Function;)Ljava/lang/Object;
at io.appium.java_client.pagefactory.AppiumElementLocator.waitFor(AppiumElementLocator.java:88)
at io.appium.java_client.pagefactory.AppiumElementLocator.findElement(AppiumElementLocator.java:103)
at io.appium.java_client.pagefactory.interceptors.InterceptorOfASingleElement.intercept(InterceptorOfASingleElement.java:57)
at io.appium.java_client.android.AndroidElement$$EnhancerByCGLIB$$c0b591f0.click()
at repositories.POF_setUp.clickOnOneFriend(POF_setUp.java:37)
at TestCases.landingScreen.actionsOnUI(landingScreen.java:160)
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:108)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:661)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:869)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1193)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:126)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109)
at org.testng.TestRunner.privateRun(TestRunner.java:744)
at org.testng.TestRunner.run(TestRunner.java:602)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:380)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:375)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:340)
at org.testng.SuiteRunner.run(SuiteRunner.java:289)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1301)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1226)
at org.testng.TestNG.runSuites(TestNG.java:1144)
at org.testng.TestNG.run(TestNG.java:1115)
at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:132)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:230)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:76)

@itszakaria add guava 21 or above e.g. with pom.xml:

<dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>21.0</version>
      </dependency>
   </dependencies>
</dependencyManagement>

I updated it with version 22 but it still does not work. But when i changed the java client version to latest BETA version, it finally worked!! Thanks.

Wow… Thank you so much for this information!
Updating to the latest java client " 5.0.0-BETA9" Worked for me aswell.