Selenium FindBy是否在PageObject类中实例化WebElement实例?

时间:2016-02-18 19:34:35

标签: selenium pageobjects

Selenium FindBy注释是否实际实例化WebElement实例,如果是,那么使用它们的框架的内涵是什么?

我在页面对象中所做的事情现在看起来像这样。我的所有测试框架方法都将By locators作为参数(而不是WebElement实例)。

//fields in the page
public static final By SEARCH_BOX = By.id("input-what");

我的问题是,在类实例化时使用FindBy实例化WebElement实例吗?如果是这样,那么我怀疑我的框架方法需要采用WebElement实例。这是正确的,并且在框架中首选:通过定位器参数或WebElement参数?

@FindBy(id = "input-what")
public WebElement SEARCH_BOX_ELEMENT;

我知道我期待一个有点自以为是的答案。如果你给我一个超链接引用你的信念,那么我认为这将是一个合理的答案。我认为具有深远意义:例如,Selenide框架中的方法,不要在其参数中使用WebElement实例,因此使用FindBy注释的PageObjects不会能够将这些元素传递给Selenide方法吗?

2 个答案:

答案 0 :(得分:2)

如果我理解你的要求,你的答案就在documentation的第一行:

  

为了使用PageFactory,首先在PageObject上声明WebElementsList<WebElement>的某些字段...

或者可能是同一文档的结尾:

  

WebElements被懒惰地评估。也就是说,如果您从未在PageObject中使用WebElement字段,则永远不会为其调用“findElement”。

修改: 要完成答案:PageObject是一种编码样式,用于收集有关您的webapp的信息。为了使这种编码风格更简洁,Selenium提供了PageFactory,它使用@FindBy注释来装饰PageObject类中的WebElements。

答案 1 :(得分:1)

我不知道硒中的这些新注释。

通过基于Stand Alone Weld的框架实现了一种页面对象模式。

无论如何,我认为它相对清楚: https://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/support/FindBy.html

  

与PageFactory结合使用,可以让用户快速轻松地创建PageObjects。

每当你要求工厂返回一个页面对象时,它会注入页面对象,并在那个时间点读取webelements。 如果你的页面有类似彗星功能的东西,并且随着时间的推移会变得陈旧,那么建议你不要指望注入的网页元素过时。

从目前为止我所看到的,您希望页面对象简化您与浏览器内容的交互。但是你希望他们成为无国籍人。

根据经验,我会默认启用启用了ajax的页面,而且我的页面对象上永远不会有状态。

如果想写一个文本框。 我会提供api:

public void writePassword(String password){
    ... callPrivateGetterToGetPasswordField().writeText(password);
}

等等。我会推广使用读取dom内容的短爆发并写入dom内容的方法,并尝试不让页面对象收集陈旧内容。