【问题标题】:Should I instantiate objects in the Base Page - Selenium Java我应该在基本页面中实例化对象 - Selenium Java
【发布时间】:2020-03-08 09:49:18
【问题描述】:

我正在编写一个 Java Selenium 测试自动化框架。 我正在使用页面对象模型。 我有一个基本页面,其中包含可由扩展基本页面的所有其他页面使用的元素和方法。

到目前为止,我还没有实例化基本页面。 我实例化了所有其他页面,如下所示:

public xxxxxxxxPage() {
    PageFactory.initElements(driver, this);
}

我没有实例化 BasePage,因为我认为所有 BasePage 元素都会被扩展它的其他页面实例化。

但是,今天我想使用我放在 BasePage 上的常用方法。该方法想要使用也在 BasePage 上的元素。但是,由于 BasePage 尚未实例化,它无法找到该元素。

那么我可以将以下代码添加到 BasePage 还是错误的做法?

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

【问题讨论】:

    标签: java selenium selenium-webdriver pageobjects page-factory


    【解决方案1】:

    BasePage 中使用PageFactory.initElements(driver, this); 也会初始化派生类中的元素,您可以在基类构造函数中使用它并从派生页面对象中删除它。

    【讨论】:

    • 这是我。很抱歉没有立即这样做。在我看来,你写的不是真的。我正在查看PageFactory.initElements 代码,我看到的是for(Class proxyIn = page.getClass(); proxyIn != Object.class; proxyIn = proxyIn.getSuperclass()),我理解它上升到超类。不去派生。因此,针对BasePage 调用initElement 不会初始化子页面的元素。
    • @AlexeyR。你看错地方了,instantiatePage 方法是启动 web 元素的方法,而不是 proxyFields(你需要查看第一个构造函数 public static <T> T initElements(WebDriver driver, Class<T> pageClassToProxy))。最重要的是,创建一个简单的程序,类 B 继承自类 A,并在 A 构造函数中打印 this。你会得到 B。
    • 不确定我是否正确。您提到的构造函数接受Class<T>。在 OP 的情况下,使用 this 指的是 OP 的自定义页面类对象 (不是 Class<T>) 。我将检查我的代码中的一个代表性示例。可能我误解了反射的工作原理。如果我错了,肯定会收回反对票。
    • @AlexeyR。 您提到的构造函数完全接受Class<T>,这就是它能够将PO返回给调用者的方式。其余的有Object 作为参数,它不太具体。 this 将始终是派生类,即使在基类中也是如此。这就是继承的工作原理。
    • 我回来道歉 :) 我使用扩展 PageBPageA 进行了测试,其中 PageB 在其构造函数中输出 this.getClass().getName()。最终打印出PageA。您能否添加几句话来解释其背后的机制,以便像我这样的人更清楚地了解解决方案,以便我可以恢复我的反对意见?
    猜你喜欢
    • 1970-01-01
    • 2015-01-08
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    • 2012-07-16
    • 2013-03-29
    • 1970-01-01
    相关资源
    最近更新 更多