Java 使用@FindBy注释和PageFactory映射动态元素
对于下面的Page对象示例类,我有一个accountsLink私有成员,它在加载时映射到登录页面上的非动态元素。当从构造函数调用initElements方法时,使用FindBy注释初始化它Java 使用@FindBy注释和PageFactory映射动态元素,java,selenium,automated-tests,Java,Selenium,Automated Tests,对于下面的Page对象示例类,我有一个accountsLink私有成员,它在加载时映射到登录页面上的非动态元素。当从构造函数调用initElements方法时,使用FindBy注释初始化它 public class Login { private WebDriver driver; @FindBy(id = "account") private WebElement accountsLink; //constructor, elements are initi
public class Login {
private WebDriver driver;
@FindBy(id = "account")
private WebElement accountsLink;
//constructor, elements are initialized by the PageFactory
public MainPage(WebDriver driver) {
this.driver = driver;
PageFactory.initElements(driver, this);
}
//clicking accounts opens a dynamic ajax menu which has a Sign In Button
public SignInPage clickAccountsLink() {
accountsLink.click();
WebElement signInButton = driver.findElement(By.id("signin"));
signInButton.click();
return new SignInPage(driver);
}
}
现在来看问题。我有另一个元素(signInButton),它只有在单击accountsLink元素时才会动态加载。此操作不会将您带到另一个页面,只会显示一个ajax菜单,其中将显示登录按钮
我的问题是,由于signInButton元素只有在单击accountsLink元素时才会出现,所以它是否可以声明为带有FindBy注释的登录类的成员,或者我是否必须坚持使用clickAccountsLink方法中的driver.findElement(By.id(“signin”))的当前解决方案
我希望我的问题有意义。当调用
PageFactory.initElements
时,它解析当前DOM。如果WebElement
在该时间内不存在,则不能将其作为变量的值给定,正如您不能使用driver.findElement
查找不存在的WebElement
一样
您的解决方案是可行的,尽管我会使用,并且在加载
登录按钮时,您可以声明,我不认为它会给您带来任何错误。页面工厂在初始化类时创建一个伪元素。它仅在第一次与图元相交时创建实际图元
例如,在下面的类中,NoExistingElement元素不存在,如果我调用类的enterText方法,它不会给我任何错误。测试用例将毫无错误地通过
然而,如果我尝试调用NoExistingElement元素上的任何函数,那么只有它会失败,出现Webdriver异常,ElementNotFoundException
public class GoogleSearch {
@FindBy(name="q")
static WebElement searchBox;
@FindBy(name = "qqqqq")
WebElement NoExistingElement;
public GoogleSearch(WebDriver driver){
PageFactory.initElements(driver, this);
driver.get("https://www.google.com");
}
public void searchOnGoogle(String text){
searchBox.sendKeys(text);
}
}
我编写这个类是为了提供一个快速示例。但在编写实际代码时,我肯定会使用显式等待和预期条件。谢谢。这就是我完全避免使用PageFactory
的原因之一。最后,您将混合使用带注释的元素,并根据需要对页面进行刮削。为了保持一致性和性能,我更喜欢随时根据需要刮取页面。这在纯静态网页中是有意义的,但今天几乎没有任何网站被认为是静态的。你是对的,我明白了。但是如果NoExistingElement实际存在,我可以再次调用PageFactory.initElements进行初始化吗?缺点和(性能影响)是,它将重新初始化那些在第一次调用initElements时已经找到的元素。@正如我所说的,它不会用实际值初始化对象,就像惰性初始化一样,只有在第一次执行某些操作时,才填充实际值。i、 e.searchBox.sendKeys(文本)时为out代码>此时调用时,将填充搜索框
。希望现在一切都清楚了。如果真是这样,那么为什么要调用PageFactory.initElements()?它是一个创建类的对象并用代理(dummy)初始化web元素的方法