Java 使用pagefactory时出现NullPointerException

Java 使用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);

代码:

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

}
就这样

我希望有帮助