【问题标题】:What is the use of Annotation "@FindBy"?注释“@FindBy”有什么用?
【发布时间】:2012-02-20 04:11:09
【问题描述】:

谁能解释一下WebDriver中的注释@FindBy

在哪里以及为什么使用它?

【问题讨论】:

    标签: selenium-webdriver annotations webdriver findby


    【解决方案1】:

    这是在使用页面工厂支持您的页面对象时辅助定位器的构建

    PageFactory Wiki Page

    但是我发现我发现将定位器存储为 By 对象而不是 WebElement 更有用,因为它们更灵活,并且您倾向于避免遇到 StaleElementException。

    By myLocator = By.id("idOfYourElement")
    

    而不是

    @FindBy(id = "idOfYourElement")
    WebElement myLocator;
    

    这样,您还可以在断言不存在元素时使用定位器或在 ExpectedConditions 帮助器中使用它。

    【讨论】:

    • 我很难理解为什么有人会使用 @FindBy 而不是 By 对象。
    • @elroso 删除注释时可以使用 PageFactory.initElements(driver, page) 方法吗?谢谢
    • 很好地解释了使用 By 而不是 @FindBy。谢谢:)
    【解决方案2】:

    我可以引用API-documentation吗?

    用于标记页面对象上的字段以指示用于定位元素的替代机制或元素列表。与PageFactory#proxyElement 结合使用,可以让用户快速轻松地创建 PageObjects。

    因此,如果您使用PageObject 模式,那么您将此注释添加到类成员中,并且WebDriver 在对象初始化期间(调用PageFactory.initElements() 时)会自动向其注入适当的WebElements。

    我强烈建议您点击此链接并阅读有关 PageObject pattern and @FindBy annotations usage 的更多示例。

    【讨论】:

    • 感谢您的回复。那么,我还有一个问题……它会被用于动态改变定位器的元素吗?
    • @user1163375 你说changing their locators dynamically是什么意思?
    • 我的理解是当元素 ID 在 Web 应用程序中动态变化时使用“@FindBy”注解......如果有误,请纠正我。
    • @FindBy 用于访问具有已知 id/name/etc 的网页上的元素 如果元素的 ID 是自动创建的,那么 WebDriver 将如何知道它?
    • @SlavaSemushin :您能否更新链接,它们似乎已损坏。会有很大帮助。谢谢
    【解决方案3】:

    你也可以使用Pagefactory,并有类似的东西:

    @FindBy(how = How.NAME, using = "logonName")
    private WebElement logonNameField;
    
    @FindBy(how = How.NAME, using = "password")
    private WebElement passwordField;
    

    现在,至于 How.,您可以:

    1. CLASS_NAME
    2. CSS
    3. 身份证
    4. ID_OR_NAME
    5. LINK_TEXT
    6. 姓名
    7. PARTIAL_LINK_TEXT
    8. TAG_NAME
    9. XPATH

    或者您可以使用自己的 DOM Search 和 Xpath,这将在 WebDriver API 之外,但它应该可以工作。

    【讨论】:

      【解决方案4】:

      在PageFactory类的帮助下,我们使用注解@FindBy来查找WebElements。我们使用 initElements 方法来初始化 Web 元素。 @FindBy 可以接受 tagName、partialLinkText、name、linkText、id、css、className、xpath 作为属性。

      @FindBy 注释使用单一标准定位一个或多个 WebElement。例如,要识别具有相同类属性的所有元素,我们可以使用以下标识:

      @FindBy(how = How.CLASS_NAME, using = "classname")
      private List<WebElement> singlecriterion;`enter code here`
      

      【讨论】:

      • 格式代码名称,如 @FindBy 使用 `` 或 ctrl+k 正确回答
      猜你喜欢
      • 1970-01-01
      • 2013-05-06
      • 2018-10-12
      • 2015-07-21
      • 2013-08-23
      • 2011-01-07
      • 1970-01-01
      • 1970-01-01
      • 2017-08-19
      相关资源
      最近更新 更多