【问题标题】:How to resolve NullPointerException如何解决 NullPointerException
【发布时间】:2020-08-30 01:00:42
【问题描述】:

我是自动化测试的新手。我正在使用 Cucumber、页面对象模型、Appium 工具 我无法弄清楚我哪里出错了,我已经有一天没被这个打动了

这是我的基类

package Base;

public class Base {
        public static AndroidDriver<AndroidElement> driver;
        public static Properties prop;
        //static Reader reader;


        public static void base() throws InterruptedException, IOException{

        DesiredCapabilities cap = new DesiredCapabilities();
        try {
        prop = new Properties();
        FileInputStream ip;

        ip = new FileInputStream("/Users/user/Documents/Eclipse/Workspace/Project/src/test/java/Base/Base.properties");
        prop.load(ip);
        cap.setCapability("deviceName", prop.getProperty("deviceName"));
        //cap.setCapability("UDID", prop.getProperty("UDID"));
        cap.setCapability("platformName", prop.getProperty("platformName"));
        cap.setCapability("platformVersion", prop.getProperty("platformVersion"));
        cap.setCapability("automationName", prop.getProperty("automationName"));
        cap.setCapability("app", prop.getProperty("appPath"));
        } catch (FileNotFoundException e1) {
            e1.printStackTrace();
        }

        try {
            driver = new AndroidDriver<AndroidElement> (new URL("http://0.0.0.0:4723/wd/hub/"),cap);
            Thread.sleep(2000);
            //driver.quit();
            }catch(IOException e) {
                e.printStackTrace();
            }

}

这是我的登录页面

package PageObject;

public class loginPO extends Base{
    AndroidDriver<AndroidElement> driver;

    @AndroidFindBy(id ="com.project.coreapp:id/userField")
    WebElement userNameField;

    @AndroidFindBy(id="com.project.coreapp:id/test")
    WebElement passwordField;

    @AndroidFindBy(id="com.project.coreapp:id/loginButton")
    WebElement loginButton;

    //Initializing the page objects:
     public loginPO(AndroidDriver<AndroidElement> driver) {
     this.driver=driver;
     PageFactory.initElements(new AppiumFieldDecorator(driver), this);
     }


    public void typeUsername(String username) {
        userNameField.sendKeys(username);
    }

    public void typePassword(String password) {
        passwordField.sendKeys(password);
    }

    public void clickLogin() {
        loginButton.click();
    }

    public void login(String username, String password) {
    typeUsername(username);
    typePassword(password);
    clickLogin();

    //return new accountListPO(null);
    }

这是我的步骤防御

public class AccountOverviewQuickActions extends Base{

    loginPO log = new loginPO(driver);

    //accountListPO accountlist;

    @Given("^I am a Project customer$")
    public void i_am_a_project_customer() throws InterruptedException, IOException {
    Base.base();
    }

    @And("^I login and navigate to the Account List page$")
    public void i_login_and_navigate_to_the_Account_List_page() throws InterruptedException, IOException {
    //log.login("Hanna", "111111");

    log.login(prop.getProperty("userName"),prop.getProperty("passWord"));

    }

    @When("^I navigate to the Account Overview page$")
    public void i_navigateto_the_Account_Overview_page() throws InterruptedException {


    }

    @Then("^I should see two quick action buttons Details & Statement above the Transaction list$")
    public void i_should_see_two_quick_action_buttons_above_the_Transaction_list() {

    }

我在 Step defenition @ here 中得到 NullPointerException -

log.login(prop.getProperty("userName"),prop.getProperty("passWord"));

这是控制台输出

org.openqa.selenium.WebDriverException: java.lang.NullPointerException
Build info: version: '3.141.59', revision: 'e567656', time: '2018-11-14T08:17:03'
System info: host: 'users-local', ip: xxxx', os.name: 'Mac OS X', os.arch: 'xxxx', os.version: '10.15.4', java.version: '1.8.0_241'
Driver info: driver.version: unknown
    at io.appium.java_client.pagefactory.AppiumElementLocator$WaitingFunction.apply(AppiumElementLocator.java:192)
    at io.appium.java_client.pagefactory.AppiumElementLocator$WaitingFunction.apply(AppiumElementLocator.java:1)
    at org.openqa.selenium.support.ui.FluentWait.until(FluentWait.java:249)
    at io.appium.java_client.pagefactory.AppiumElementLocator.waitFor(AppiumElementLocator.java:99)
    at io.appium.java_client.pagefactory.AppiumElementLocator.findElement(AppiumElementLocator.java:119)
    at io.appium.java_client.pagefactory.interceptors.InterceptorOfASingleElement.intercept(InterceptorOfASingleElement.java:59)
    at org.openqa.selenium.remote.RemoteWebElement$$EnhancerByCGLIB$$d27c0df4.sendKeys(<generated>)
    at PageObject.loginPO.typeUsername(loginPO.java:38)
    at PageObject.loginPO.login(loginPO.java:50)
    at StepDefenition.AccountOverviewQuickActions.i_am_a_project_customer(AccountOverviewQuickActions.java:29)
    at ✽.I am a Santander bank SME customer(file:///Users/user/Documents/Eclipse/Workspace/project/src/test/resources/Feature/AccountOverviewQuickActions.feature:24)
Caused by: java.lang.NullPointerException
    at io.appium.java_client.pagefactory.AppiumElementLocator.lambda$0(AppiumElementLocator.java:120)
    at io.appium.java_client.pagefactory.AppiumElementLocator$WaitingFunction.apply(AppiumElementLocator.java:172)
    at io.appium.java_client.pagefactory.AppiumElementLocator$WaitingFunction.apply(AppiumElementLocator.java:1)
    at org.openqa.selenium.support.ui.FluentWait.until(FluentWait.java:249)
    at io.appium.java_client.pagefactory.AppiumElementLocator.waitFor(AppiumElementLocator.java:99)
    at io.appium.java_client.pagefactory.AppiumElementLocator.findElement(AppiumElementLocator.java:119)
    at io.appium.java_client.pagefactory.interceptors.InterceptorOfASingleElement.intercept(InterceptorOfASingleElement.java:59)
    at org.openqa.selenium.remote.RemoteWebElement$$EnhancerByCGLIB$$d27c0df4.sendKeys(<generated>)
    at PageObject.loginPO.typeUsername(loginPO.java:38)
    at PageObject.loginPO.login(loginPO.java:50)
    at StepDefenition.AccountOverviewQuickActions.i_am_a_project_customer(AccountOverviewQuickActions.java:29)
    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 io.cucumber.java.Invoker.invoke(Invoker.java:27)
    at io.cucumber.java.JavaStepDefinition.execute(JavaStepDefinition.java:27)
    at io.cucumber.core.runner.PickleStepDefinitionMatch.runStep(PickleStepDefinitionMatch.java:63)
    at io.cucumber.core.runner.TestStep.executeStep(TestStep.java:64)
    at io.cucumber.core.runner.TestStep.run(TestStep.java:49)
    at io.cucumber.core.runner.PickleStepTestStep.run(PickleStepTestStep.java:46)
    at io.cucumber.core.runner.TestCase.run(TestCase.java:51)
    at io.cucumber.core.runner.Runner.runPickle(Runner.java:67)
    at io.cucumber.junit.PickleRunners$NoStepDescriptions.run(PickleRunners.java:149)
    at io.cucumber.junit.FeatureRunner.runChild(FeatureRunner.java:83)
    at io.cucumber.junit.FeatureRunner.runChild(FeatureRunner.java:24)
    at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
    at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
    at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
    at io.cucumber.junit.Cucumber.runChild(Cucumber.java:185)
    at io.cucumber.junit.Cucumber.runChild(Cucumber.java:83)
    at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
    at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
    at io.cucumber.junit.Cucumber$RunCucumber.evaluate(Cucumber.java:219)
    at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:89)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:542)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:770)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:464)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:210) 

【问题讨论】:

  • 查看整个控制台输出。如果在尝试读取属性文件时抛出 FileNotFoundException,我敢打赌。

标签: java eclipse cucumber appium pageobjects


【解决方案1】:

请不要使用 Base 扩展 loginPo 和 stepdef 文件。而不是使用任何依赖注入,如黄瓜 picocontainer 与其他 java 文件共享基类的状态。

在此处了解更多信息: http://www.thinkcode.se/blog/2017/04/01/sharing-state-between-steps-in-cucumberjvm-using-picocontainer

【讨论】:

  • 我还打赌base() 正在抛出一个 FileNotFoundException,它正在被catch 吞噬。这可能是问题的根本原因,但完全同意 DI 在这种情况下是正确的解决方案。
  • 谢谢大家,问题现已解决。我在解决我的问题的基类中添加了 PageFactory.initElements(new AppiumFieldDecorator(driver), new loginPO());。
猜你喜欢
  • 2014-01-28
  • 2018-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-14
相关资源
最近更新 更多