【问题标题】:NullpointerException while invoking SendKeys through Selenium using PageFactory with Page Object使用 PageFactory 和页面对象通过 Selenium 调用 SendKeys 时出现 NullpointerException
【发布时间】:2017-12-11 14:36:02
【问题描述】:

我有三门课。一种用于从网页中获取所有元素,一种用于对这些元素执行操作,另一种用于测试脚本。当我从测试脚本调用一个函数时,我得到一个空指针异常。我发现这是因为我使用了@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 注释初始化的元素时会出现问题。我该如何解决?谢谢

【问题讨论】:

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

标签: java selenium pageobjects findby page-factory


【解决方案1】:

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

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

其中 webDriver 是您用于运行 selenium 测试的 WebDriver 的一个实例。

【讨论】:

    【解决方案2】:

    你需要声明WebDriver实例并在LoginPageElementsLoginPageActions类中添加构造函数为:

    1. LoginPageElements类:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-18
      • 1970-01-01
      • 1970-01-01
      • 2019-08-02
      相关资源
      最近更新 更多