我应该在基本页面中实例化对象吗-Selenium Java

我应该在基本页面中实例化对象吗-Selenium Java,java,selenium,selenium-webdriver,pageobjects,page-factory,Java,Selenium,Selenium Webdriver,Pageobjects,Page Factory,我正在编写一个JavaSelenium测试自动化框架。 我使用的是页面对象模型。 我有一个包含元素和方法的基本页面,这些元素和方法可以被扩展基本页面的所有其他页面使用 到目前为止,我还没有实例化基本页面。 我实例化了所有其他页面,如下所示: public xxxxxxxxPage() { PageFactory.initElements(driver, this); } 我没有实例化BasePage,因为我认为所有的BasePage元素都会被扩展它的其他页面实例化 然而,今天我想使用一

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

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

public xxxxxxxxPage() {
    PageFactory.initElements(driver, this);
}
我没有实例化BasePage,因为我认为所有的BasePage元素都会被扩展它的其他页面实例化

然而,今天我想使用一个我放在BasePage上的常用方法。该方法希望使用也在BasePage上的元素。但是,它找不到元素,因为BasePage尚未实例化

那么,我是否可以将以下代码添加到BasePage中,还是这样做是错误的

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

使用
PageFactory.initElements(驱动程序,this)BasePage
中的code>也将启动派生类中的元素,您可以在基类构造函数中使用它,并将其从派生页面对象中删除。

使用
PageFactory.initElements(驱动程序,此)BasePage
中的code>也将启动派生类中的元素,您可以在基类构造函数中使用它,并将其从派生页对象中删除。

这是我做的。很抱歉没有马上这么做。在我看来,你写的不是真的。我正在查看
PageFactory.initElements
代码,我看到的是
for(Class proxyIn=page.getClass();proxyIn!=Object.Class;proxyIn=proxyIn.getSuperclass())
,我的理解是它会进入超类。不适用于衍生产品。因此,对
BasePage
调用
initElement
不会初始化子页面的元素。@AlexeyR。您看到的位置不对,方法
实例化页面
是启动webelements的方法,而不是
代理字段
(您需要查看第一个构造函数
公共静态T initElements(WebDriver驱动程序,类pageClassToProxy)
)。最重要的是,用类B从类A继承创建简单的程序,并在构造函数中打印
这个
。你会得到B。我不确定我是否正确。您提到的构造函数acvepts
Class
。在OP的例子中,使用了
这个
,它引用了定制页面类的OP对象(不是
)。我将用代码中的一个代表性示例进行检查。也许我误解了反射的工作原理。“如果我错了,我肯定会重新投反对票。”@AlexeyR。您提到的构造函数完全接受
,这就是它能够将PO返回给调用方的方式。其余的参数为
对象
,具体程度较低
将始终是派生类,即使在基类中也是如此。这就是继承的工作方式。我回来道歉:)我用
PageA
测试了它,它扩展了
PageB
其中
PageB
在其构造函数中输出
This.getClass().getName()
。最终打印出
PageA
。你能用几句话来解释这背后的机制吗?这样像我这样的人就可以对解决方案有更清楚的了解,这样我就可以恢复我的否决票了?这就是我。很抱歉没有马上这么做。在我看来,你写的不是真的。我正在查看
PageFactory.initElements
代码,我看到的是
for(Class proxyIn=page.getClass();proxyIn!=Object.Class;proxyIn=proxyIn.getSuperclass())
,我的理解是它会进入超类。不适用于衍生产品。因此,对
BasePage
调用
initElement
不会初始化子页面的元素。@AlexeyR。您看到的位置不对,方法
实例化页面
是启动webelements的方法,而不是
代理字段
(您需要查看第一个构造函数
公共静态T initElements(WebDriver驱动程序,类pageClassToProxy)
)。最重要的是,用类B从类A继承创建简单的程序,并在构造函数中打印
这个
。你会得到B。我不确定我是否正确。您提到的构造函数acvepts
Class
。在OP的例子中,使用了
这个
,它引用了定制页面类的OP对象(不是
)。我将用代码中的一个代表性示例进行检查。也许我误解了反射的工作原理。“如果我错了,我肯定会重新投反对票。”@AlexeyR。您提到的构造函数完全接受
,这就是它能够将PO返回给调用方的方式。其余的参数为
对象
,具体程度较低
将始终是派生类,即使在基类中也是如此。这就是继承的工作方式。我回来道歉:)我用
PageA
测试了它,它扩展了
PageB
其中
PageB
在其构造函数中输出
This.getClass().getName()
。最终打印出
PageA
。你能补充几句话来解释这背后的机制吗?这样像我这样的人就可以对解决方案有更清楚的了解,这样我就可以恢复我的否决票了?