当前位置: 首页 > 知识库问答 >
问题:

使用带有Cucumber的页面对象模型时出现空指针异常

唐焕
2023-03-14

我使用了页面对象模型设计模式和Cucumber。为此,我创建了两个名为abstractPageloginPage的页面,但在运行脚本时,即使我已经使用pagefactory初始化webelements,也会出现空指针异常,请查看以下代码:

文摘:

public class abstractPage {

    protected WebDriver driver;
    public static loginPage lpOBJ;

    public void openBrowsernURLhit() {
        driver=new FirefoxDriver();
        driver.get("http://www.facebook.com");
        PageFactory.initElements(driver, loginPage.class);
    }
}

登录页面:

public class loginPage extends abstractPage {

    @FindBy(name = "email")
    public WebElement username;

    @FindBy(name = "pass")
    public WebElement password;

    @FindBy(id = "u_0_2")
    public WebElement loginButon;

    public void loginIntoApp() {

        String url=driver.getCurrentUrl();
        System.out.println("the url is::::::::::::::::"+url);
        username.sendKeys("testuser");
        password.sendKeys("123");
    }

    public void clicklogn() {
        loginButon.click();
    }
}

然后我有一个类stepDefinition,在这里我调用上面的登录类方法。浏览器打开良好,url被命中,但当它进入lOginToApp()方法时,它会在第一行本身抛出异常。

public class SmokeTest {

    @Given("^Open Firefox and start application$")
    public void Open_Firefox_and_start_application() throws Throwable {

        abstractPage obj = new abstractPage();
        obj.openBrowsernURLhit();
    }

    @When("^I enter valid \"([^\"]*)\" and \"([^\"]*)\"$")
    public void I_enter_valid_username_and_password(String arg1, String arg2) throws Throwable {

        loginPage lpobj = new loginPage();
        lpobj.loginIntoApp();
    }

    @Then("^user should be able to login successfully$")
    public void user_should_be_able_to_login_successfully() throws Throwable {

        loginPage lpobj = new loginPage();
        lpobj.clicklogn();
    }
}

我还有一个TestRunner类,其中我粘贴了我的步骤定义:

@RunWith(Cucumber.class)
@CucumberOptions(
        features= "features", 
        glue= {"stepDefination"},
        plugin= {"html:target/cucumber-html-report"}
        )

public class TestRunner {

}

但是在运行上面的脚本时,我总是在ginToApp()方法的第一行中得到NullPointerException。我已经使用Pagefactory初始化webelements,但我猜“driver”变量在Login类中没有得到初始化,尽管我继承了asbtract类,在该类中我实例化了驱动程序,由于它抛出了空指针。请看看我做错了什么。错误如下:

1个场景([31m1失败[0m)3个步骤([31m1失败[0m,[36m1跳过[0m,[32m1通过[0m)0m18.149s

java.lang.NullPointerException
    at pages.loginPage.loginIntoApp(loginPage.java:22)
    at stepDefination.SmokeTest.I_enter_valid_username_and_password(SmokeTest.java:33)
    at ?.When I enter valid "t1@gmail.com" and "pass"(MyApp.feature:5)

谢啦

共有2个答案

杭柏
2023-03-14

解决这个问题最简单的方法是让你的驱动程序对象保持静态。

 protected static WebDriver driver;

在使用page factory时,还需要初始化page对象,否则所有WebElementnull

  public loginPage(){
        PageFactory.initElements(driver, this);
    }

或者这样,我认为这不是一个好的做法,人们应该避免这样。

public void loginToApp(){

String url=driver.getCurrentUrl();
System.out.println("the url is::::::::::::::::"+url);
PageFactory.initElements(driver, this);
username.sendKeys("testuser");
password.sendKeys("123");

}

易弘亮
2023-03-14

请添加以下构造函数。它可能会解决这个问题。

public loginPage(){
  PageFactory.initElements(driver, loginPage.class);
}

你也可以把它放在外面,

 public void loginIntoApp() { 
      String url=abstractPage.driver.getCurrentUrl(); 
      System.out.println("the url is::::::::::::::::"+url); 
      loginPage lp=PageFactory.initElements(abstractPage.driver, loginPage.class); 
      lp.username.sendKeys("testuser");
      lp.password.sendKeys("123");
   }

另一种方式是,

public class SmokeTest extends abstractPage {

    @Given("^Open Firefox and start application$")
    public void Open_Firefox_and_start_application() throws Throwable {
            openBrowsernURLhit();
    }

    @When("^I enter valid \"([^\"]*)\" and \"([^\"]*)\"$")
    public void I_enter_valid_username_and_password(String arg1, String arg2) throws Throwable {

        loginPage lpobj = PageFactory.initElements(driver, loginPage.class);
        lpobj.loginIntoApp();
    }

    @Then("^user should be able to login successfully$")
    public void user_should_be_able_to_login_successfully() throws Throwable {

        loginPage lpobj = PageFactory.initElements(driver, loginPage.class);
        lpobj.clicklogn();
    }
}
 类似资料: