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

Does the Selenium FindBy instantiate WebElement instances in a PageObject class?

Selenium FindBy 注释是否实际实例化了 WebElement 实例,如果是,对使用它们的框架有何含义?

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

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

我的问题是,在 class 实例化时使用 FindBy 实例化 WebElement 实例吗?如果是这样,那么我怀疑我的框架方法需要采用 WebElement 实例。这是正确的吗,哪个在框架中更受欢迎:通过定位器参数还是 WebElement 参数?

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

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

如果我明白你在问什么,你的答案就在 documentation:

的第一行

In order to use the PageFactory, first declare some fields on a PageObject that are WebElements or List<WebElement>...

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

WebElements are evaluated lazily. That is, if you never use a WebElement field in a PageObject, there will never be a call to "findElement" for it.

编辑: 要完成答案:PageObject is a coding style of collecting information about your webapp. In order to make this coding style less verbose, Selenium offers a PageFactory,它使用 @FindBy 注释来装饰您的 PageObject 类.

中的 WebElements

我不知道 selenium 中有这些新注释。

有点见过通过基于 Stand Alone Weld 的框架实现的页面对象模式。

不管怎样,我觉得还是比较清楚的: https://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/support/FindBy.html

Used in conjunction with PageFactory this allows users to quickly and easily create PageObjects.

无论何时您要求工厂 return 您的页面对象,它都会将页面对象与当时读取的 Web 元素一起注入。 如果您的页面具有彗星功能之类的功能,并且会随着时间的流逝而变得陈旧,那么建议您不要期望注入的 Web 元素会变得陈旧。

据我目前所见,您希望页面对象能够简化您与浏览器内容的交互。但是你希望他们是无国籍的。

根据经验,我肯定会 ajax 启用页面,我的页面对象上永远不会有状态。

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

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

等等。我会提倡使用短时间读取 dom 内容和写入 dom 内容的方法,并尽量不让页面对象收集陈旧的内容。