我使用了页面对象模型设计模式和Cucumber。为此,我创建了两个名为abstractPage
和loginPage
的页面,但在运行脚本时,即使我已经使用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)
谢啦
解决这个问题最简单的方法是让你的驱动程序对象保持静态。
protected static WebDriver driver;
在使用page factory时,还需要初始化page对象,否则所有WebElement
将null
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");
}
请添加以下构造函数。它可能会解决这个问题。
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();
}
}
我试图用Powermock和Mockito编写一个JUnit测试用例。我正在从测试用例下面调用一个方法。此方法从method1调用,而该方法调用Method2。我已经添加了@runwith和@preparefortest注释。 //这是我的测试类: 错误跟踪:
> 单击 受保护得空onPrepareDialog(int id,Dialog Dialog) 受保护的对话框onCreateDialog(int id) 如果我对timepickerdialog代码做了什么错误,请告诉我。
问题内容: MyClass.java: 编译MyClass.java文件的SimpleCompileTest.java的清单。 SimpleCompileTest.java: 我正在执行SimpleCompileTest类并获取NullPointerException。ToolProvider.getSystemJavaCompiler()返回null。有人可以告诉我代码有什么问题吗 问题答案:
以下是在sun.reflect.nativeMethodAccessorImpl.Invoke0(本机方法)在sun.reflect.nativeMethodAccessorImpl.Invoke(未知源)在sun.reflect.NativeMethodAccessorImpl.Invoke(未知源)在java.lang.Reflect.Method.Invoke(未知源)在com.codena
我使用JAXB解组XML文件Java对象。 这个XML包含一个列表。例如 Java类为items提供@xmlementwrapper 当我试图解组时,会出现空指针异常。