[英]Webelement defined by @FindBy annotation returns null pointer
出於某種原因,當我調用方法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);
}
您需要調用此函數(最好在構造函數中):
PageFactory.initElements(getDriver(), this);
正如所有其他答案提到的那樣,我們必須使用PageFactory.initElements()
來初始化webElements,
有兩種方法可以完成,或者可以在兩個地方完成:
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的其他類中 :
在上述例子中elementsCan在edit_exception()方法被寫入的類中initialzed,總之之前的任何地方,我們要使用的元件/類S頁面的動作,現在代碼將看起來像下面:
@Test
public void edit_exception() {
spage = PageFactory.initElements(driver, SPage.class); //we are not passing driver instance to SPage class
epage = spage.cEdit(IDbefore);
}
在測試類中,我添加了以下代碼行
WebMainMenu mainmenu = PageFactory.initElements(driver,WebMainMenu.class);
mainmenu.doStuff(driver,5);
等等
如上所述,我同意您需要實例化頁面對象。
WebElement first;
為null,因為在實例化頁面類時未初始化element。 因此,初始化頁面類中的所有元素
PageFactory.initElements(driver, this);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.