当前位置: 首页 > 知识库问答 >
问题:

用@findby注释和PageFactory映射动态元素

翁鸿远
2023-03-14

对于下面的Page对象示例类,我有一个accountsLink私有成员,它在加载时映射到登录页面上的非动态元素。当从构造函数调用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方法中的Driver.FindElement(by.id(“signin”))的当前解决方案?

我希望我的问题有道理。

共有1个答案

欧阳成弘
2023-03-14

调用PageFactory.initElements时,它解析当前DOM。如果webElement当时不存在,就不能将其作为一个值赋予变量,就像您不能使用driver.findElement定位不存在的webElement一样。

您的解决方案是可行的,尽管我会在加载SigninButton时使用显式等待和预期条件。

 类似资料:
  • 我在一个使用Selenium和C#的自动化项目中工作。我使用Page Object模式定义每个页面(带有它们的定位器),然后在一个测试类中分别定义测试。我有一个Page类,它是页面的基类,我在其中调用:PageFactory.initElements(webDriver,this); 并定义所有页面的通用方法。然后每个页面从page继承,并使用@findby注释定义相应的元素: 添加了一个新的登录

  • 我最近开始使用带有Page对象模式的Selenium2和Page Factory。我使用@FindBy注释声明了WebElements,这些注释在初始化类时由PageFactory初始化。但是,我希望将@findby注释与locators.properties文件一起使用。不幸的是,我似乎无法做到这一点,因为注释被限制为只允许常量表达式。一般来说,这似乎是Java注释的一个限制,但我只是想知道是否

  • 我正在尝试将我的selenium测试转换为使用页面对象模型(以及扩展为@FindBy)。我有几个这样的对象定义: 将父对象转换为使用FindBy很容易: 基本上,如果可能的话,我想这样做(我知道这不是真正的代码,这只是一个伪示例: 但是,有没有一种方法可以使用FindBy在父元素中定位子元素呢 。我需要这样做,因为我的目标是页面上的特定元素,这些元素可能与页面上的其他元素共享相同的名称或类名。谢谢

  • 我想让hibernate生成一些带有外键的表等等。我将给出我希望hibernate生成的查询的一个示例: 所以这个查询应该由hibernate通过注释生成。与此对应的类是: 有关中的应映射到的内容的示例(中的每个助记符在中只有一个值): 正如您所看到的,我在文档的帮助下做了一些尝试,但是我不能让Hibernate生成外键。如果有人能告诉我这个类需要的注释和值,那就太好了,这样我就可以自己为其他类做

  • 我正在创建一个类来审核对Spring Boot应用程序控制器类的调用: 我的一个Controller类看起来像这样——在类AND方法级别有注释(此时我不能更改): 我可以很好地提取url、methodtype和参数。然而,我现在很难做的是拉控制器类的注释('/applications'),这样我就可以为我的审计表构建完整的URL。 我知道还有其他审计选项(比如Spring Boot Actuato

  • 我试图映射一个bean,其中包含一些JAXB元素,如@XmlSee同样、@XmlElement、@XmlschemaType作为该类的属性。 现在,我面临着下面的问题时,使用mapSTRt映射。 > bean个人客户没有被映射。我没有在响应中看到它。但是当使用dozer时,它工作得很好。我所需要做的就是在dozer配置xml中的映射中定义它。我在mapSTRt中尝试了类似的事情。我在mapper接