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

Can @findby annotation be used in an interface with Selenium

让我们看下面的代码:

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,有人有解释吗?

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()returns超class忽略接口。因此,在您的情况下,它从 HomePageTests.class 变为 Object.class。因此,界面中的网络元素将保持未初始化状态。 您可以考虑使用抽象 class 而不是存储状态的更好主意。

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

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