@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中,声明为接口成员的字段隐式为static
和final
。因此,这些成员不是您的对象实例的一部分,因此 PageFactory.initElements
不会初始化它们。
在不使用接口的情况下也会发生同样的情况 - 所有 @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,有人有解释吗?
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中,声明为接口成员的字段隐式为static
和final
。因此,这些成员不是您的对象实例的一部分,因此 PageFactory.initElements
不会初始化它们。
在不使用接口的情况下也会发生同样的情况 - 所有 @findBy
静态成员上的注释都将被忽略。