由@FindBy注释定义的Webelement返回空指针

时间:2013-07-23 18:40:56

标签: java selenium nullpointerexception webdriver selenium-webdriver

出于某种原因,当我调用方法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);
}

4 个答案:

答案 0 :(得分:8)

你需要调用它(最好在你的构造函数中):

PageFactory.initElements(getDriver(), this);

更多信息:https://code.google.com/p/selenium/wiki/PageFactory

答案 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);