0

比如说,我在一个班级里有两个小测试。

public class LoginAndLogout extends BaseTest {

    HomePage kashome = new HomePage();

    @Test(testName = "Login_as")
    public void login() {
        LoginPage loginkas = LoginPage.open(); //open login page
        kashome = loginkas.login(name, pwd);
    }

    @Test
    public void logOut() {
       kashome.logOut();
    }
}

主页类:

public class HomePage extends BasePage {

    public HomePage() {
        PageFactory.initElements(Driver.get(), this);
    }
}

BasePage 类:

public class BasePage {
    @FindBy(xpath="//img[@title='Выход']")
    WebElement exitButton;

    @FindBy (xpath="//a[text()='Выход']")
    WebElement exitLink;


    public BasePage() {
        PageFactory.initElements(Driver.get(), this);
    }

    public boolean isLoggedIn(String usr) {
        if (this.usernameText.getText().startsWith(usr)) return true;
        else return false;
    }

    public void logOut() {
        try {
            exitLink.click();
            Alert alert = Driver.get().switchTo().alert();
            Reporter.log(alert.getText(), true);
            Reporter.log("Отвечаем ОК", true);
            alert.accept();
        }
        catch (UnhandledAlertException e) {
            e.printStackTrace();
            Reporter.log(e.getMessage(), true);
        }
        catch (Exception e) {
            e.printStackTrace();
            Reporter.log(e.getMessage(), true);
        }
    }

}

第一次测试运行正常,但在第二次测试中,我在尝试执行 exitLink.click() 时得到 NPE,似乎 kashome 中的元素没有初始化,但它们是!没有可能影响测试行为的 @AfterTest 方法。我检查了按钮的xpath,没关系。但是,如果我将 kashome.logOut() 添加到第一个测试并删除第二个测试,一切正常。

为什么我会得到 NPE?

4

1 回答 1

0

如果PageFactory不处理 和 上的注释exitLinkexitButtons因为它们没有显式初始化,它们将默认为创建实例null时。HomePage

我想你假设

@FindBy(xpath="//img[@title='Выход']")
WebElement exitButton;

@FindBy (xpath="//a[text()='Выход']")
WebElement exitLink;

由于@FindBy注释,在您运行测试时将具有值。注释本身不会做任何事情。您需要一些处理器来读取它们,并通过反射设置它们正在注释的字段。如果PageFactory不这样做,这些字段将保持为空,直到您自己设置它们。

于 2013-07-11T15:43:05.473 回答