Java 使用pagefactory时出现NullPointerException
代码: BASECLASS.JAVAJava 使用pagefactory时出现NullPointerException,java,selenium,selenium-webdriver,page-factory,Java,Selenium,Selenium Webdriver,Page Factory,代码: BASECLASS.JAVA public class baseclass { public static WebDriver driver; public baseclass(WebDriver driver) { // TODO Auto-generated constructor stub this.driver=driver; PageFactory.initElements(driver, this);
public class baseclass {
public static WebDriver driver;
public baseclass(WebDriver driver) {
// TODO Auto-generated constructor stub
this.driver=driver;
PageFactory.initElements(driver, this);
}
public homepage intializedriver() throws IOException {
Properties pr=new Properties();
FileInputStream fs=new FileInputStream("C:\\Users\\Admin\\eclipse -
workspace\\learning\\src\\main\\java\\baselearning\\config.properties");
pr.load(fs);
String browsername=pr.getProperty("browser");
if(browsername.equals("chrome")) {
System.setProperty("webdriver.chrome.driver","D:\\chromedriver.exe");
driver=new ChromeDriver();
}
else if(browsername.equals("firefox")) {
//firefox code
}
driver.get("https://www.flipkart.com/");
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
return PageFactory.initElements(driver, homepage.class);
}
}
public class firstTest {
public WebDriver driver;
baseclass bs=null;
homepage hp=null;
@Test
public void homepagenaviagation() throws IOException, InterruptedException{
bs=new baseclass(driver);
bs.intializedriver();
hp=new homepage(driver);
Thread.sleep(3000);
hp.buttonclose();
Thread.sleep(3000);
hp.clicklogin();
}
}
HOMEPAGE.JAVA
public class homepage extends baseclass {
public WebDriver driver;
public homepage(WebDriver driver) throws IOException {
super(driver);
}
@FindBy(xpath="//a[contains(text(),'Login & Signup')]")
public WebElement clickLogin;
@FindBy(xpath="//button[@class='_2AkmmA _29YdH8']")
public WebElement buttonclose;
public void clicklogin() {
clickLogin.click();
}
public void buttonclose() {
buttonclose.click();
}
TESTCLASS.JAVA
public class baseclass {
public static WebDriver driver;
public baseclass(WebDriver driver) {
// TODO Auto-generated constructor stub
this.driver=driver;
PageFactory.initElements(driver, this);
}
public homepage intializedriver() throws IOException {
Properties pr=new Properties();
FileInputStream fs=new FileInputStream("C:\\Users\\Admin\\eclipse -
workspace\\learning\\src\\main\\java\\baselearning\\config.properties");
pr.load(fs);
String browsername=pr.getProperty("browser");
if(browsername.equals("chrome")) {
System.setProperty("webdriver.chrome.driver","D:\\chromedriver.exe");
driver=new ChromeDriver();
}
else if(browsername.equals("firefox")) {
//firefox code
}
driver.get("https://www.flipkart.com/");
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
return PageFactory.initElements(driver, homepage.class);
}
}
public class firstTest {
public WebDriver driver;
baseclass bs=null;
homepage hp=null;
@Test
public void homepagenaviagation() throws IOException, InterruptedException{
bs=new baseclass(driver);
bs.intializedriver();
hp=new homepage(driver);
Thread.sleep(3000);
hp.buttonclose();
Thread.sleep(3000);
hp.clicklogin();
}
}
错误:
java.lang.NullPointerException
at org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElement(DefaultElementLocator.java:69)
at org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke(LocatingElementHandler.java:38)
at com.sun.proxy.$Proxy7.click(Unknown Source)
欢迎来到Stackoverflow 让我们从
基类开始。Java惯例是以大写字母开头类名,因此将名称更改为BaseClass
public class BaseClass {
public static WebDriver driver;
public BaseClass(WebDriver driver) {
this.driver=driver;
PageFactory.initElements(driver, this);
}
只有当这个类被其他类继承时,PageFactory.initElements
行才正常。您不想显式地创建此类的实例,所以让我们将其抽象化
此外,创建一个静态的WebDriver将在将来给您带来很多问题。看看我对问题的回答,我在哪里解释原因
public abstract class BaseClass {
protected WebDriver driver;
public BaseClass(WebDriver driver) {
this.driver=driver;
PageFactory.initElements(driver, this);
}
对于像这样的基类
,我们只需要在页面对象类上使用继承
,就可以对它们进行初始化
方法initializeDriver
应重命名为initializeDriver
,以符合Java命名约定。Camel大小写用于方法名类似的东西
public homepage intializeDriver() throws IOException {
Properties pr=new Properties();
FileInputStream fs=new FileInputStream("C:\\Users\\Admin\\eclipse -
workspace\\learning\\src\\main\\java\\baselearning\\config.properties");
pr.load(fs);
String browsername=pr.getProperty("browser");
if(browsername.equals("chrome")) {
System.setProperty("webdriver.chrome.driver","D:\\chromedriver.exe");
driver=new ChromeDriver();
} else if(browsername.equals("firefox")) {
//firefox code
}
driver.get("https://www.flipkart.com/");
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
return PageFactory.initElements(driver, HomePage.class);
}
上述方法返回homepage
类,该类也应重命名为homepage
public class homepage extends baseclass {
public WebDriver driver;
public homepage(WebDriver driver) throws IOException {
super(driver);
}
@FindBy(xpath="//a[contains(text(),'Login & Signup')]")
public WebElement clickLogin;
@FindBy(xpath="//button[@class='_2AkmmA _29YdH8']")
public WebElement buttonclose;
public void clicklogin() {
clickLogin.click();
}
public void buttonclose() {
buttonclose.click();
}
让我们修复主页
类。更改其名称。删除公共WebDriver
,因为您不再需要它了HomePage
class扩展了BaseClass
,该类已包含受保护的WebDriver驱动程序,您可以通过继承访问该驱动程序
public class HomePage extends BaseClass {
public homepage(WebDriver driver) throws IOException {
super(driver);
}
@FindBy(xpath="//a[contains(text(),'Login & Signup')]")
public WebElement clickLogin;
@FindBy(xpath="//button[@class='_2AkmmA _29YdH8']")
public WebElement buttonclose;
public void clicklogin() {
clickLogin.click();
}
public void buttonclose() {
buttonclose.click();
}
让我们回到BaseClass
的initializeDriver()
方法。这里的问题是,使用该方法的最后一行返回HomePage
类:
return PageFactory.initElements(driver, homepage.class);
这一行会导致多个问题,但您需要更深入的面向对象编程知识才能完全理解这个问题。要快速修复
它,只需将方法声明更改为静态
,如下所示:
public static HomePage intializedriver() throws IOException {
现在,测试类
public class firstTest {
public WebDriver driver;
baseclass bs=null;
homepage hp=null;
@Test
public void homepagenaviagation() throws IOException, InterruptedException{
bs=new baseclass(driver);
bs.intializedriver();
hp=new homepage(driver);
Thread.sleep(3000);
hp.buttonclose();
Thread.sleep(3000);
hp.clicklogin();
}
}
更改名称,正如我前面提到的。
下一件事是利用@Before
注释(JUnit)初始化WebDriver,因为它不是测试的一部分。这是一个先决条件
然后,我们可以使用initializeDriver()
方法返回的HomePage
类,或者在测试类中初始化它。像这样:
public class FirstTest {
HomePage hp =null;
@Before
public void setUp() {
hp = HomePage.initializeDriver(); //static method invocation
}
@Test
public void homepagenaviagation() throws IOException, InterruptedException{
Thread.sleep(3000);
hp.buttonclose();
Thread.sleep(3000);
hp.clicklogin();
}
}
就这样
我希望有帮助