Selenium / Junit / pageObject:NPE,当调用方法时,点击通过@FindBy注释创建的元素

时间:2017-12-13 11:23:42

标签: java selenium selenium-webdriver junit

我有以下课程:

测试类,用于测试运行:

public class MainPageTest {
    private WebDriver driver;
    private MainPage mainPage;

    @Before
    public void setUp() {
        System.setProperty("webdriver.gecko.driver", "src\\main\\resources\\geckodriver.exe");
        driver = new FirefoxDriver();
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
        driver.manage().window().maximize();
        driver.get("http://github.com");
        mainPage = new MainPage(driver);
    }

    @Test
    public void signInTest() {
        mainPage.clickSignIn();
    }
}

MainPage,其中clickSignIn()和所需的元素描述如下: (返回LoginPage不会影响当前用例。)

public class MainPage {

    private WebDriver driver;

    public MainPage(WebDriver driver) {
        this.driver = driver;
    }

    @FindBy(xpath = "//a[text()='Sign in']")
    private WebElement signInButton;

    public LoginPage clickSignIn() {
        signInButton.click();
        //driver.findElement(By.xpath("//a[text()='Sign in']")).click();
        return new LoginPage(driver);
    }
}

当我试图运行@Test时 - 它因NPE而失败

  

显示java.lang.NullPointerException     在MainPage.clickSignIn(MainPage.java:33)     在MainPageTest.signInTest(MainPageTest.java:29)

但是如果我们将MainPage中的方法更改为

public LoginPage clickSignIn() {
    //signInButton.click();
    driver.findElement(By.xpath("//a[text()='Sign in']")).click();
    return new LoginPage(driver);
}

测试以绿色方式传递(按钮成功点击)。

那么,问题:我应该如何正确地使用@FindBy注释来创建/查找所需的webElements,以便仅通过名称在方法中使用它们?

1 个答案:

答案 0 :(得分:1)

您需要在MainPage类构造函数中的PageFactory对象上调用initElements方法。

public MainPage(WebDriver driver) {
    this.driver = driver;
    PageFactory.initElements(driver, this);
}

PageFactory.initElements初始化您使用@FindBy注释修饰的元素。如果您不使用PageFactory并且未手动初始化该元素(例如通过指定值),则会抛出NullPointerException