出于某种原因,当我调用方法Spage.editExButton(int ID)时,我收到一条错误,指出WebElement首先为null。为什么它为空?我使用@FindBy注释定义了它。我必须使用findElement(By.id(“xxx”))显式定义元素,以便能够单击它。但为什么我无法使用@FindBy表示法来调用它?
public class SPage extends GPage<SPage> {
public SPage() {
super();
}
public SPage(String pageType) {
super(pageType);
}
@FindBy(id = "xxx")
WebElement first;
public WebElement eButton(int ID) {
first.click();
String tmp = ID + "-Edit";
WebElement edit = getDriver().findElement(By.id(tmp));
return edit;
}
public EPage cEdit(int ID) {
eButton(ID).click();
return new EPage(getBasePageType()).openPage(EPage.class);
}
}
我正在调用这样的方法:
static EPage epage;
static SPage spage;
@Test
public void edit_exception() {
epage = spage.cEdit(IDbefore);
}
答案 0 :(得分:8)
你需要调用它(最好在你的构造函数中):
PageFactory.initElements(getDriver(), this);
答案 1 :(得分:1)
所有其他答案都提到,我们必须使用PageFactory.initElements()
来初始化webElement,
有两种方法可以完成,或者可以在两个地方完成:
1)在类SPage中:
由于 SPage 类中有两个构造函数,因此我们必须添加以下代码来使该类中声明的所有元素都完成,因此在这两个类中都应完成此操作,因为我们不知道哪个构造函数将用于初始化 SPage :
我们将把驱动程序实例传递给 SPage 类构造函数,如下所示:
public SPage(WebDriver driver) {
super();
PageFactory.initElements(driver, this);
}
public SPage(String pageType, WebDriver driver) {
super(pageType);
PageFactory.initElements(driver, this);
}
2)在要使用SPage WebElement的其他类中:
上面示例中的元素可以在编写 edit_exception()方法的类中初始化,不久之后,在任何我们要使用 SPage 类的元素/动作的地方,现在代码将如下所示:
@Test
public void edit_exception() {
spage = PageFactory.initElements(driver, SPage.class); //we are not passing driver instance to SPage class
epage = spage.cEdit(IDbefore);
}
答案 2 :(得分:0)
在我的测试课程中,我添加了以下代码行
WebMainMenu mainmenu = PageFactory.initElements(driver,WebMainMenu.class);
mainmenu.doStuff(driver,5);
等
我同意你需要实例化页面对象。
答案 3 :(得分:0)
WebElement first;
为null,因为在实例化页面类时未初始化element。因此,初始化页面类中的所有元素
PageFactory.initElements(driver, this);