使用带有Cucumber的Page对象模型的空指针异常

时间:2017-09-12 11:32:16

标签: selenium

我使用了Page Object Model设计模式和Cucumber。所以为此,我创建了两个名为abstractPageloginPage的页面,但是在运行脚本时我得到空指针异常,即使我已经使用pagefactory初始化了webelements,请看下面的代码:

自AbstractBase:

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);
    }
}

loginPage:

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();
    }
}

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

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课,我已经粘贴了我的stepDefination:

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

public class TestRunner {

}

但是在运行上面的脚本时,我总是在第一行ofloginIntoApp()方法中得到NullPointerException。我已经使用了Pagefactory来初始化webelements但我猜“驱动”变量没有在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 个答案:

答案 0 :(得分:0)

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

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();
    }
}

答案 1 :(得分:-1)

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

 protected static WebDriver driver;

当您使用页面工厂时,您还需要对页面对象进行初始化,否则WebElement将为null

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

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

public void loginIntoApp(){

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

}