让我们看下面的代码:
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,是否有任何解释?
答案 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中,声明为接口成员的字段隐式static
和final
。因此,这些成员不属于您的对象实例,因此PageFactory.initElements
不会初始化它们。
在不使用接口的情况下也会发生同样的情况 - 静态成员上的所有@findBy
注释都将被忽略。