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方法吗?
答案 0 :(得分:2)
如果我理解你的要求,你的答案就在documentation的第一行:
为了使用PageFactory,首先在PageObject上声明
WebElements
或List<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内容的方法,并尝试不让页面对象收集陈旧内容。