我有以下课程:
测试类,用于测试运行:
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,以便仅通过名称在方法中使用它们?
答案 0 :(得分:1)
您需要在MainPage类构造函数中的PageFactory对象上调用initElements方法。
public MainPage(WebDriver driver) {
this.driver = driver;
PageFactory.initElements(driver, this);
}
PageFactory.initElements
初始化您使用@FindBy
注释修饰的元素。如果您不使用PageFactory
并且未手动初始化该元素(例如通过指定值),则会抛出NullPointerException
。