java - 使用@FindBy注释和PageFactory映射动态元素

标签 java selenium automated-tests

对于下面的页面对象示例类,我有一个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 waitExpected Conditions加载 signInButton 时.

关于java - 使用@FindBy注释和PageFactory映射动态元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43037349/

相关文章:

python - Pytest- 使用生成器进行 mark.parametrize

java - 等到 firebase 数据检索数据

selenium - 如何使用XPath在特定表单元格内获取值

jenkins - 如何为 Jenkins 中的每个项目设置凭据?

html - 为什么我的 XPath 不能处理混合内容?

php - Selenium 与 SimpleTest 与 WatiN

node.js - 在运行测试的命令中传递 .env 变量时浏览器的不同行为

java - 为什么 HashSet 不能直接在内部使用位数组而不是 HashMap 来节省一些空间?

java - 错误: local variable referenced from inner class must be final or effective final

java - 根据某些条件从 map 返回数组的最佳和最快的方法