Java 使用带有页面对象的PageFactory通过Selenium调用SendKeys时出现NullpointerException

Java 使用带有页面对象的PageFactory通过Selenium调用SendKeys时出现NullpointerException,java,selenium,pageobjects,findby,page-factory,Java,Selenium,Pageobjects,Findby,Page Factory,我有三节课。一个用于从网页获取所有元素,一个用于使用这些元素执行操作,另一个用于测试脚本。当我从测试脚本调用函数时,我得到一个空指针异常。我发现这是因为我使用了@FindBy注释,但我不知道如何解决这个问题 元素类别: public class LoginPageElements { @FindBy(id="loginId") private static WebElement userNameTextBox; @FindBy(id="password") p

我有三节课。一个用于从网页获取所有元素,一个用于使用这些元素执行操作,另一个用于测试脚本。当我从测试脚本调用函数时,我得到一个空指针异常。我发现这是因为我使用了@FindBy注释,但我不知道如何解决这个问题

元素类别:

public class LoginPageElements {

    @FindBy(id="loginId")
    private static WebElement userNameTextBox;

    @FindBy(id="password")
    private static WebElement userPasswordTextBox;

    @FindBy(id="QTP_LoginButton")
    private static WebElement loginButton;

    public static WebElement getUserNameTextBox(WebDriver driver){
        WebElement a=driver.findElement(By.id("loginId"));
        return a;
    }

    public static WebElement getUserPasswordTextBox(){
        return userPasswordTextBox;
    }

    public static WebElement getLoginButton(){
        return loginButton;
    }
}
行动类:

public class LoginPageActions {

        public static void login(WebDriver driver,String username,String password){
            WebElement a=LoginPageElements.getUserNameTextBox(driver);
            a.sendKeys(username);
            LoginPageElements.getUserPasswordTextBox().sendKeys(password);
            LoginPageElements.getLoginButton().click();
        }

    }
测试脚本:

public class Sample {
     public static String driverPath = "D:/Selenium/Chrome Driver latest/chromedriver.exe";
     public static WebDriver driver;
public static void main(String[] args) {
System.setProperty("webdriver.chrome.driver", driverPath);

    ChromeOptions options = new ChromeOptions();
    options.addArguments("test-type");
    options.addArguments("start-maximized");
    options.addArguments("--js-flags=--expose-gc");
    options.addArguments("--enable-precise-memory-info");
    options.addArguments("--disable-popup-blocking");
    options.addArguments("--disable-default-apps");
    options.addArguments("--enable-automation");
    options.addArguments("test-type=browser");
    options.addArguments("disable-infobars");
    options.addArguments("--disable-extensions");
    options.setExperimentalOption("useAutomationExtension", false);

    driver = new ChromeDriver(options);

    driver.get("http://10.235.80.106:8080");

    LoginPageActions.login(driver,"acb", "adasd");
}

当我将WebDriver对象从测试脚本传递到元素类时,没有异常。由于没有WebDriver实例化,所以在使用FindBy注释初始化的元素时会出现问题。我该如何解决这个问题?谢谢

您需要声明
WebDriver
实例,并在
LoginPageElements
LoginPageActions
类中添加构造函数,如下所示:

  • LoginPageElements
    class:

    WebDriver driver;
    
    //constructor
    public LoginPageElements(WebDriver loginDriver)
    {
        this.driver=loginDriver;
    }
    
    WebDriver driver;
    
    //constructor
    public LoginPageActions(WebDriver loginDriver)
    {
        this.driver=loginDriver;
    }
    
  • LoginPageActions
    class:

    WebDriver driver;
    
    //constructor
    public LoginPageElements(WebDriver loginDriver)
    {
        this.driver=loginDriver;
    }
    
    WebDriver driver;
    
    //constructor
    public LoginPageActions(WebDriver loginDriver)
    {
        this.driver=loginDriver;
    }
    

  • 如果这回答了您的问题,请告诉我。

    您需要声明
    WebDriver
    实例,并在
    LoginPageElements
    LoginPageActions
    类中添加构造函数,如下所示:

  • LoginPageElements
    class:

    WebDriver driver;
    
    //constructor
    public LoginPageElements(WebDriver loginDriver)
    {
        this.driver=loginDriver;
    }
    
    WebDriver driver;
    
    //constructor
    public LoginPageActions(WebDriver loginDriver)
    {
        this.driver=loginDriver;
    }
    
  • LoginPageActions
    class:

    WebDriver driver;
    
    //constructor
    public LoginPageElements(WebDriver loginDriver)
    {
        this.driver=loginDriver;
    }
    
    WebDriver driver;
    
    //constructor
    public LoginPageActions(WebDriver loginDriver)
    {
        this.driver=loginDriver;
    }
    

  • 如果这回答了您的问题,请告诉我。

    您可以继续使用@FindBy注释,只需确保初始化WebElements即可。为此,您应使用PageFactory初始化LoginPageElements:

    LoginPageElements loginPageElements = PageFactory.initElements(webDriver, LoginPageElements.class);
    

    其中webDriver是用于运行selenium测试的webDriver的实例。

    您可以继续使用@FindBy注释,只需确保初始化WebElements即可。为此,您应使用PageFactory初始化LoginPageElements:

    LoginPageElements loginPageElements = PageFactory.initElements(webDriver, LoginPageElements.class);
    

    其中webDriver是用于运行selenium测试的webDriver的实例。

    为什么要使用@FindBy和WebElement a=driver.findElement(By.id(“loginId”);?复制堆栈跟踪中的空点异常以解决您的问题。。我无意冒犯您@kaushik3993,但您缺少面向对象编程的知识。试着理解什么是
    构造函数
    ,以及
    静态
    关键字对代码的影响。@Plog我只是在测试
    @FindBy
    是否是问题所在。我还没有完全学会PODM。@RafałLaskowski谢谢你的建议。但是你能告诉我为什么我不应该在那里使用静态方法吗?我本可以通过构造函数传递驱动程序来实现这一点,但由于这些都是静态方法,我一直在寻找更好的解决方案。为什么要使用@FindBy和WebElement a=driver.findElement(By.id(“loginId”);?复制堆栈跟踪中的空点异常以解决您的问题。。我无意冒犯您@kaushik3993,但您缺少面向对象编程的知识。试着理解什么是
    构造函数
    ,以及
    静态
    关键字对代码的影响。@Plog我只是在测试
    @FindBy
    是否是问题所在。我还没有完全学会PODM。@RafałLaskowski谢谢你的建议。但是你能告诉我为什么我不应该在那里使用静态方法吗?我本可以通过构造函数传递驱动程序来实现这一点,但由于这些都是静态方法,所以我正在寻找更好的解决方案。