Selenium 使用页面对象工厂的Appium始终返回空指针异常

Selenium 使用页面对象工厂的Appium始终返回空指针异常,selenium,appium,Selenium,Appium,我正在尝试使用PageFactory使用Appium和页面对象模型构建我的第一个框架测试。但是,我无法成功启动测试,它总是返回空指针异常。请看下面我的代码 主页: package iPhone; import io.appium.java_client.AppiumDriver; import io.appium.java_client.pagefactory.AppiumFieldDecorator; import org.openqa.selenium.support.PageFactor

我正在尝试使用PageFactory使用Appium和页面对象模型构建我的第一个框架测试。但是,我无法成功启动测试,它总是返回空指针异常。请看下面我的代码

主页:

package iPhone;

import io.appium.java_client.AppiumDriver;
import io.appium.java_client.pagefactory.AppiumFieldDecorator;
import org.openqa.selenium.support.PageFactory;
import io.appium.java_client.MobileElement;
import java.util.concurrent.TimeUnit;

public abstract class BasePage {

    public static AppiumDriver<MobileElement> driver;

    protected BasePage(AppiumDriver<MobileElement> driver) {
    this.driver = driver;

    PageFactory.initElements(new AppiumFieldDecorator(driver, 30,TimeUnit.SECONDS), this);
 }
}
主页测试类:

import AppiumSetup.AppiumBaseClass;
import org.junit.After;
import org.junit.Before;
import AppiumSetup.AppiumController;

public class BaseTest extends AppiumBaseClass{

@Before
public void setUp() throws Exception {
    AppiumController.instance.start();
}

@After
public void tearDown() {
    AppiumController.instance.stop();
}
}
import org.testng.annotations.Test;

public class HomePageTest extends BaseTest {
@Test
public void testMakeModelText(){
    HomePage oHome = new HomePage(driver());
    oHome.assertMakeModel("Make & Model");
}
}
设置设备类:

public class AppiumController {

//For Browserstack setup
private static String BS_USERNAME = "<your_browserstack_username>";
private static String BS_ACCESSKEY = "<your_browserstack_accesskey>";
private static String IOS_HASHED_APP_ID = "<your_ios_hashed_appid>";
private static String ANDROID_HASHED_APP_ID = "<your_android_hashed_appid>";

public static OS executionOS = OS.IOS;

public enum OS {
    ANDROID,
    IOS,
    ANDROID_BROWSERSTACK,
    IOS_BROWSERSTACK
}
public static AppiumController instance = new AppiumController();
public AppiumDriver driver;

public void start() throws MalformedURLException {
    if (driver != null) {
        return;
    }
    DesiredCapabilities capabilities = new DesiredCapabilities();
    switch(executionOS){
        case IOS:
            File classpathRoot = new File(System.getProperty("user.dir"));
            File appDir = new File(classpathRoot, "/src/AppDir/iOS/");
            File app = new File(appDir, "Testapp.app");
            capabilities.setCapability("platformName", "iOS");
            capabilities.setCapability("platformVersion", "11.3");
            capabilities.setCapability("forceDevice", "iPhone6");
            capabilities.setCapability("deviceName", "iPhone6");
            capabilities.setCapability("udid", "597cd7028828b3719dc9fe4fcbbasdadabfdfa3");    //Use this line for iOS real device
            capabilities.setCapability("bundleId", "io.apptest.diva");
            capabilities.setCapability("noReset", true);
            capabilities.setCapability("fullReset", false);
            capabilities.setCapability("language", "en");
            capabilities.setCapability("locale", "en_US");
            capabilities.setCapability("calendarFormat", "gregorian");
            capabilities.setCapability("app", app.getAbsolutePath());
            capabilities.setCapability("automationName", "XCUITest");
            driver = new IOSDriver(new URL("http://127.0.0.1:4723/wd/hub"),    capabilities);
            break;}
    driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
}
 public void stop() {
    if (driver != null) {
        driver.quit();
        driver = null;
    }
}
}
错误如下所示

java.lang.NullPointerException
at io.appium.java_client.pagefactory.AppiumFieldDecorator.getTypeForProxy(AppiumFieldDecorator.java:211)
at io.appium.java_client.pagefactory.AppiumFieldDecorator.proxyForAnElement(AppiumFieldDecorator.java:226)
at io.appium.java_client.pagefactory.AppiumFieldDecorator.access$0(AppiumFieldDecorator.java:224)
at io.appium.java_client.pagefactory.AppiumFieldDecorator$3.proxyForLocator(AppiumFieldDecorator.java:111)
at org.openqa.selenium.support.pagefactory.DefaultFieldDecorator.decorate(DefaultFieldDecorator.java:62)
at io.appium.java_client.pagefactory.AppiumFieldDecorator.decorate(AppiumFieldDecorator.java:155)
at org.openqa.selenium.support.PageFactory.proxyFields(PageFactory.java:113)
at org.openqa.selenium.support.PageFactory.initElements(PageFactory.java:105)
at iPhone.BasePage.<init>(BasePage.java:17)
at iPhone.HomePage.<init>(HomePage.java:15)
at iPhone.HomePageTest.testMakeModelText(HomePageTest.java:8)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:124)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:583)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:719)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:989)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109)
at org.testng.TestRunner.privateRun(TestRunner.java:648)
at org.testng.TestRunner.run(TestRunner.java:505)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:455)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:450)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:415)
at org.testng.SuiteRunner.run(SuiteRunner.java:364)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:84)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1208)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1137)
at org.testng.TestNG.runSuites(TestNG.java:1049)
at org.testng.TestNG.run(TestNG.java:1017)
at org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:72)
at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:123)
java.lang.NullPointerException
在io.appium.java_client.pagefactory.AppiumFieldDecorator.getTypeForProxy(AppiumFieldDecorator.java:211)
在io.appium.java_client.pagefactory.AppiumFieldDecorator.proxyForAnElement(AppiumFieldDecorator.java:226)
在io.appium.java_client.pagefactory.AppiumFieldDecorator.access$0(AppiumFieldDecorator.java:224)
在io.appium.java_client.pagefactory.AppiumFieldDecorator$3.proxyForLocator(AppiumFieldDecorator.java:111)
位于org.openqa.selenium.support.pagefactory.DefaultFieldDecorator.decoration(DefaultFieldDecorator.java:62)
在io.appium.java_client.pagefactory.AppiumFieldDecorator.decoration(AppiumFieldDecorator.java:155)
位于org.openqa.selenium.support.PageFactory.proxyFields(PageFactory.java:113)
位于org.openqa.selenium.support.PageFactory.initElements(PageFactory.java:105)
在iPhone.BasePage.(BasePage.java:17)
在iPhone.HomePage.(HomePage.java:15)
在iPhone.HomePageTest.testMakeModelText(HomePageTest.java:8)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)中
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:606)
位于org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:124)
位于org.testng.internal.Invoker.invokeMethod(Invoker.java:583)
位于org.testng.internal.Invoker.invokeTestMethod(Invoker.java:719)
位于org.testng.internal.Invoker.invokeTestMethods(Invoker.java:989)
位于org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125)
位于org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109)
位于org.testng.TestRunner.privateRun(TestRunner.java:648)
位于org.testng.TestRunner.run(TestRunner.java:505)
位于org.testng.SuiteRunner.runTest(SuiteRunner.java:455)
在org.testng.SuiteRunner.runsequential上(SuiteRunner.java:450)
位于org.testng.SuiteRunner.privateRun(SuiteRunner.java:415)
运行(SuiteRunner.java:364)
位于org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
位于org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:84)
在org.testng.testng.runSuitesSequentially上(testng.java:1208)
位于org.testng.testng.runSuitesLocally(testng.java:1137)
位于org.testng.testng.runSuites(testng.java:1049)
位于org.testng.testng.run(testng.java:1017)
运行(IDEARemoteTestNG.java:72)
位于org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:123)

驱动程序的实例化在哪里?我把它放在BasePage中,让主页扩展BasePage。这有什么问题吗?我说的是用java中的新关键字进行实例化?对不起,我不明白你的意思,我对自动化测试还很陌生。您能解释一下吗?您正在使用java作为绑定语言?所以,在java中,我们有了新的关键字来创建实例。所以我问你在哪里创建驱动程序的实例。
public abstract class AppiumBaseClass {
   protected AppiumDriver driver() {
    return AppiumController.instance.driver;
 }
}
java.lang.NullPointerException
at io.appium.java_client.pagefactory.AppiumFieldDecorator.getTypeForProxy(AppiumFieldDecorator.java:211)
at io.appium.java_client.pagefactory.AppiumFieldDecorator.proxyForAnElement(AppiumFieldDecorator.java:226)
at io.appium.java_client.pagefactory.AppiumFieldDecorator.access$0(AppiumFieldDecorator.java:224)
at io.appium.java_client.pagefactory.AppiumFieldDecorator$3.proxyForLocator(AppiumFieldDecorator.java:111)
at org.openqa.selenium.support.pagefactory.DefaultFieldDecorator.decorate(DefaultFieldDecorator.java:62)
at io.appium.java_client.pagefactory.AppiumFieldDecorator.decorate(AppiumFieldDecorator.java:155)
at org.openqa.selenium.support.PageFactory.proxyFields(PageFactory.java:113)
at org.openqa.selenium.support.PageFactory.initElements(PageFactory.java:105)
at iPhone.BasePage.<init>(BasePage.java:17)
at iPhone.HomePage.<init>(HomePage.java:15)
at iPhone.HomePageTest.testMakeModelText(HomePageTest.java:8)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:124)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:583)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:719)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:989)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109)
at org.testng.TestRunner.privateRun(TestRunner.java:648)
at org.testng.TestRunner.run(TestRunner.java:505)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:455)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:450)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:415)
at org.testng.SuiteRunner.run(SuiteRunner.java:364)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:84)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1208)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1137)
at org.testng.TestNG.runSuites(TestNG.java:1049)
at org.testng.TestNG.run(TestNG.java:1017)
at org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:72)
at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:123)