【发布时间】:2012-02-20 04:11:09
【问题描述】:
谁能解释一下WebDriver中的注释@FindBy?
在哪里以及为什么使用它?
【问题讨论】:
标签: selenium-webdriver annotations webdriver findby
谁能解释一下WebDriver中的注释@FindBy?
在哪里以及为什么使用它?
【问题讨论】:
标签: selenium-webdriver annotations webdriver findby
这是在使用页面工厂支持您的页面对象时辅助定位器的构建
但是我发现我发现将定位器存储为 By 对象而不是 WebElement 更有用,因为它们更灵活,并且您倾向于避免遇到 StaleElementException。
By myLocator = By.id("idOfYourElement")
而不是
@FindBy(id = "idOfYourElement")
WebElement myLocator;
这样,您还可以在断言不存在元素时使用定位器或在 ExpectedConditions 帮助器中使用它。
【讨论】:
我可以引用API-documentation吗?
用于标记页面对象上的字段以指示用于定位元素的替代机制或元素列表。与
PageFactory#proxyElement结合使用,可以让用户快速轻松地创建 PageObjects。
因此,如果您使用PageObject 模式,那么您将此注释添加到类成员中,并且WebDriver 在对象初始化期间(调用PageFactory.initElements() 时)会自动向其注入适当的WebElements。
我强烈建议您点击此链接并阅读有关 PageObject pattern and @FindBy annotations usage 的更多示例。
【讨论】:
changing their locators dynamically是什么意思?
@FindBy 用于访问具有已知 id/name/etc 的网页上的元素 如果元素的 ID 是自动创建的,那么 WebDriver 将如何知道它?
你也可以使用Pagefactory,并有类似的东西:
@FindBy(how = How.NAME, using = "logonName")
private WebElement logonNameField;
@FindBy(how = How.NAME, using = "password")
private WebElement passwordField;
现在,至于 How.,您可以:
或者您可以使用自己的 DOM Search 和 Xpath,这将在 WebDriver API 之外,但它应该可以工作。
【讨论】:
在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`
【讨论】: