可以在与Selenium的接口中使用@findby注释

时间:2018-04-05 20:04:10

标签: java selenium findby

让我们看下面的代码:

public interface HomePageObjects {

    @FindBy(xpath = "//*[@class='_2zrpKA']")
    WebElement UsernameField ;

    @FindBy(xpath = "//*[@class='_2zrpKA _3v41xv']")
    WebElement PswdField ;

}

public class HomePageTests implements HomePageObjects {

    WebDriver Driver;

    @BeforeClass
    public void initpage() {
        Driver = LaunchBrowser.Driver;
        PageFactory.initElements(Driver, this); 
        System.out.println(UsernameField + " " + Driver);
    }

}

此代码编译良好,但无法初始化webelements,是否有任何解释?

2 个答案:

答案 0 :(得分:2)

PageFactory class的源代码,请检查initElements方法。

public static void initElements(FieldDecorator decorator, Object page) {
    Class<?> proxyIn = page.getClass();
    while (proxyIn != Object.class) {
      proxyFields(decorator, page, proxyIn);
      proxyIn = proxyIn.getSuperclass();
    }
  }

proxyIn.getSuperclass()返回忽略接口的页面对象的超类。因此,在您的情况下,它会从HomePageTests.class转到Object.class。因此,界面中的webelements将保持未初始化。 你可以看一下使用抽象类,这是存储状态的更好主意。

答案 1 :(得分:0)

在Java中,声明为接口成员的字段隐式staticfinal。因此,这些成员不属于您的对象实例,因此PageFactory.initElements不会初始化它们。

在不使用接口的情况下也会发生同样的情况 - 静态成员上的所有@findBy注释都将被忽略。