Java 使用Selenium@FindBy使用继承类中的值

Java 使用Selenium@FindBy使用继承类中的值,java,selenium,inheritance,xpath,constructor,Java,Selenium,Inheritance,Xpath,Constructor,我有几个继承的类,它们都有相似的web元素。只是在每个子类中,元素的实际xpath是不同的。除了xpath之外,我想在所有子类中进行的所有交互都是相同的 我想做一些像 @FindBy(xpath=*以某种方式从子类*传入构造函数) 私有网页元素搜索框应该指出,由于您的WebElement实例是私有的,所以我认为子类页面对象将无法访问这些WebElement实例。如果您的WebElement是“受保护的”,那么您可以从子类访问它,如果您在同名的子类中声明了一个新变量,那么新变量将覆盖父类AFAI

我有几个继承的类,它们都有相似的web元素。只是在每个子类中,元素的实际xpath是不同的。除了xpath之外,我想在所有子类中进行的所有交互都是相同的

我想做一些像

@FindBy(xpath=*以某种方式从子类*传入构造函数)

私有网页元素搜索框应该指出,由于您的WebElement实例是私有的,所以我认为子类页面对象将无法访问这些WebElement实例。如果您的WebElement是“受保护的”,那么您可以从子类访问它,如果您在同名的子类中声明了一个新变量,那么新变量将覆盖父类AFAIK中的变量

此外,您不能像您所暗示的那样在构造函数中传递元素:而是使用PageFactory.initObjects(parentClass)或类似的方法将它们加载到子类中。注释不能将变量作为参数,好吗

class HomePage extends ParentPage {
  public HomePage() {
    ParentPage pp = PageFactory.initElements(driver, ParentPage.class);
    HomePage hp = PageFactory.initElements(driver, this);
    ....

以前从未尝试过,但我认为它可能会起作用。

应该指出,由于您的WebElement实例是私有的,那么我认为子类页面对象将无法访问这些WebElement实例。如果您的WebElement是“受保护的”,那么您可以从子类访问它,如果您在同名的子类中声明了一个新变量,那么新变量将覆盖父类AFAIK中的变量

此外,您不能像您所暗示的那样在构造函数中传递元素:而是使用PageFactory.initObjects(parentClass)或类似的方法将它们加载到子类中。注释不能将变量作为参数,好吗

class HomePage extends ParentPage {
  public HomePage() {
    ParentPage pp = PageFactory.initElements(driver, ParentPage.class);
    HomePage hp = PageFactory.initElements(driver, this);
    ....
以前从未尝试过,但我认为它可能会起作用。

您可以尝试将超类作为抽象类,该类定义抽象方法以返回Web元素的选择器。子类将包括WebElements的特定于类的@FindBy()定义。(我不知道这是否行得通……只是一个想法。)

您可以尝试将超类作为抽象类,该类定义抽象方法以返回WebElements的选择器。子类将包括WebElements的特定于类的@FindBy()定义。(我不知道这是否行得通……只是一个想法。)


我正在努力理解它,然后当我了解了它们的功能后,我会尝试。我想我还是个新手;-)我正在努力理解它,然后当我了解了它们的功能后,我会尝试。我想我还是个新手;-)