Java 如何启动BasePage元素

Java 如何启动BasePage元素,java,selenium,oop,selenium-webdriver,Java,Selenium,Oop,Selenium Webdriver,当我使用-PageFactory.initElements(dr,this)只初始化子类元素时,如何在BasePage父类初始化元素的下面显示 下面是父类中的代码 @FindBy(how = How.PARTIAL_LINK_TEXT, using = "Welcome back,") public WebElement eleUserNameText; public BasePage(WebDriver dr) { this.dr = dr; Page

当我使用-PageFactory.initElements(dr,this)只初始化子类元素时,如何在BasePage父类初始化元素的下面显示

下面是父类中的代码

@FindBy(how = How.PARTIAL_LINK_TEXT, using = "Welcome back,")
public WebElement eleUserNameText;

    public BasePage(WebDriver dr) {
        this.dr = dr;
        PageFactory.initElements(dr, this);
    }
下面是儿童班的

@FindBy(how = How.XPATH, using = "//a[contains(text(),'Sign in with Zappos')]")
public WebElement eleSiginWithZappos;

public HomePage(WebDriver dr) {
    super(dr);
    this.dr = dr;   
}

当我使用
这个
即子类时,它同时启动了eleSiginWithZappos和eleUserNameText(来自父类)如何工作?

要回答您的问题,您需要进一步了解
页面工厂
的工作原理

当您像这样调用页面工厂时:
PageFactory.initElements(dr,this)将对象的当前实例作为参数传递

因此,您将传递扩展了
BasePage
HomePage
实例。这些不是单独的对象,这是一个对象

页面工厂收集子类和父类中声明的所有字段。页面工厂使用以下代码:

  public static void initElements(FieldDecorator decorator, Object page) {
    Class<?> proxyIn = page.getClass();
    while (proxyIn != Object.class) {
      proxyFields(decorator, page, proxyIn);
      proxyIn = proxyIn.getSuperclass();
    }
  }
它对继承中使用的所有类都这样做

因此,如果您有3个类,A、B、C,那么这些类中的所有字段都将被初始化,如果它们是继承的

(伪码)

希望有帮助

1. Get schema of HomePage.class
2. Gather declared fields
3. Initialize these fields
4. Get superclass of HomePage.class
5. Gather declared fields
6. Initialize these fields
class C

class B extends C

class A extends B {
    public A() {
        PageFactory.initElements(driver, this); //initializes elements in classes A, B and C
    }
}