Selenium:@FindBy注解和initElemets()方法

Selenium: @FindBy annotation and initElemets () method

我是 Selenium 和 Whosebug 的新手。

如有错误敬请见谅

我的问题是:

@FindBy() 注释在内部如何工作以及为什么需要 initElemets() 方法?

方法 initElements() 使用 Java 反射 API 初始化所有 WebElementList<WebElement> 字段。它基本上将默认 null 值更改为使用 Proxy 的接口实现。它还提供了 WebElement 的惰性实例化,这意味着 - WebElements 仅在需要时被发现(寻找?) - 当您对它们调用操作时。

更深入: initElements 接受 ObjectClass<?> 作为参数并从中创建一个对象。这样,PageFactory 获取 class 中的所有字段,验证它们是否属于 WebElement 或 List 类型并初始化它们。

如果 WebElement 未使用 @FindBy 注释,则 PageFactory 尝试通过变量名创建选择器。像这样的东西 WebElement username 可能在没有注释的情况下实际工作。

如果 WebElement@FindBy 注释,则 By 对象被创建并连接到 WebElement 以备后用。这部分只是一个假设。

然后,WebElement的实例就创建好了。由于是接口,不能直接用Reflection实例化API。 Proxy 用于处理 WebElement 的创建。 PageFactory 使用反射使用新创建的 WebElements 实例初始化提供的页面对象中的元素。

WebDriverWebElement 都实现了接口 SearchContext,它还告诉 WebDriver 如何查找元素。是否在整个页面源或范围内缩小到特定 WebElement。这就是为什么我们可以像这样通过其他元素搜索元素:element.findElement(By.id("username")).

希望我稍微解释一下!