【问题标题】:Java and Selenium: Static methods in Page ObjectsJava 和 Selenium:页面对象中的静态方法
【发布时间】:2019-05-08 13:35:42
【问题描述】:

当我尝试在页面对象中使用静态方法时,我遇到了 NullPointerExceptions 问题。如果我使用非静态方法,它工作正常。

非静态版本:

public class ComplaintPage {

    private ExtendedWebDriver driver;

    @FindBy(css = "[data-selector=date-received-complaint]")
    public WebElement dateComplaintReceoved;

    public ComplaintPage() {
        driver = Browser.extendedDriver();
        PageFactory.initElements(driver, this);
    }

    public void setComplaintDate() {
        dateComplaintReceoved.sendKeys(LocalDate.now().toString());
    }
}

Calling code:

ComplaintPage complaintPage = new ComplaintPage;
complaintPage.setComplaintDate();

这很好用。日期字段已设置。

静态版

public class ComplaintPage {

    private static ExtendedWebDriver driver;

    @FindBy(css = "[data-selector=date-received-complaint]")
    public static WebElement dateComplaintReceoved;

    public ComplaintPage() {
        driver = Browser.extendedDriver();
        PageFactory.initElements(driver, this);
    }

    public void static setComplaintDate() {
*       dateComplaintReceoved.sendKeys(LocalDate.now().toString());
    }
}

Calling code:

ComplaintPage.setComplaintDate();

这不起作用,并在标有“*”的行(访问 WebElement 的行)上导致 java.lang.NullPointerException。

我有点喜欢在测试中使用这样的静态方法,因为我并没有真正看到它有什么问题,而且它使代码更易于阅读。我以前在 C#/VS 中做过,但由于某种原因,我在这里遗漏了一些重要的东西。

【问题讨论】:

    标签: java selenium selenium-webdriver selenium-chromedriver static-methods


    【解决方案1】:

    NullPointerException 被抛出是因为PageFactory 的工作方式。你看,当你创建ComplaintPage 类的实例时,你正在调用它的构造函数:

    public ComplaintPage() {
            driver = Browser.extendedDriver();
            PageFactory.initElements(driver, this);
        }
    

    构造函数调用PageFactory类的initElements方法。此方法使用 Java 反射 API 初始化所有 WebElementList<WebElement> 字段。它基本上将默认的null 值更改为接口的实现。它还提供了一种 WebElement 的惰性实例化,这意味着 - WebElements 仅在需要时才被发现(正在寻找?) - 当您对它们调用操作时。

    当您创建静态方法和静态 WebElements 时 - 您没有调用类的构造函数,这导致未调用 initElements 方法。

    所有带有@FindBy 注释的元素都没有被初始化。这就是为什么将 PageFactory 与静态方法一起使用并不是一个好主意。

    您可以在静态方法中找到带有经典 driver.findElement 的元素,而不是使用 PageFactory。

        public void static setComplaintDate(WebDriver driver) {
            driver.findElement(By.cssSelector("[data-selector=date-received-complaint]")).sendKeys(LocalDate.now().toString());
        }
    

    【讨论】:

    • 当然!我怎么没看到。我更喜欢 PageFactory 指定和创建 WebElements 的方式,所以我必须坚持使用非静态方法。
    • @Fenio,我实际上没有得到。即使 WebElement 是静态类型,在这里我们也使用 PageFactory.initElements(driver, this);哪个会初始化静态变量?这里发生了一些不同的事情。
    • 他没有调用构造函数
    • @TheSociety,如果 OP 必须调用构造函数来初始化 WebElements,那么创建静态方法就达不到目的了。
    • 你的意思是说,通过调用构造函数,我们可以初始化静态变量,但是在页面工厂中我们将遵循非静态。
    猜你喜欢
    • 2012-10-07
    • 1970-01-01
    • 2020-05-17
    • 1970-01-01
    • 2022-09-27
    • 2012-12-03
    • 2013-03-05
    • 1970-01-01
    • 2015-05-26
    相关资源
    最近更新 更多