我使用了Page Object Model设计模式和Cucumber。所以为此,我创建了两个名为abstractPage
和loginPage
的页面,但是在运行脚本时我得到空指针异常,即使我已经使用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)
由于
答案 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");
}