对于下面的页面对象示例类,我有一个accountsLink 私有(private)成员,它在加载时映射到登录页面上的非动态元素。当从构造函数调用 initElements 方法时,它会使用 FindBy 注释进行初始化。
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注释的Login类的成员,或者我是否必须坚持使用当前使用驱动程序的解决方案。 clickAccountsLink 方法内的 findElement(By.id("signin")) ?
我希望我的问题有意义。
最佳答案
何时 PageFactory.initElements
被称为解析当前的 DOM。如果WebElement
那时不存在它不能作为变量的值,就像您无法找到不存在的 WebElement
一样使用driver.findElement
.
你的解决方案是可行的方法,尽管我会使用 explicit wait和 Expected Conditions加载 signInButton
时.
关于java - 使用@FindBy注释和PageFactory映射动态元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43037349/