Selenium:@FindBy注解和initElemets()方法
Selenium: @FindBy annotation and initElemets () method
我是 Selenium 和 Whosebug 的新手。
如有错误敬请见谅
我的问题是:
@FindBy()
注释在内部如何工作以及为什么需要 initElemets()
方法?
方法 initElements()
使用 Java 反射 API 初始化所有 WebElement
和 List<WebElement>
字段。它基本上将默认 null
值更改为使用 Proxy
的接口实现。它还提供了 WebElement
的惰性实例化,这意味着 - WebElements 仅在需要时被发现(寻找?) - 当您对它们调用操作时。
更深入:
initElements
接受 Object
或 Class<?>
作为参数并从中创建一个对象。这样,PageFactory
获取 class 中的所有字段,验证它们是否属于 WebElement
或 List 类型并初始化它们。
如果 WebElement
未使用 @FindBy
注释,则 PageFactory
尝试通过变量名创建选择器。像这样的东西 WebElement username
可能在没有注释的情况下实际工作。
如果 WebElement
用 @FindBy
注释,则 By
对象被创建并连接到 WebElement
以备后用。这部分只是一个假设。
然后,WebElement
的实例就创建好了。由于是接口,不能直接用Reflection实例化API。 Proxy 用于处理 WebElement
的创建。 PageFactory
使用反射使用新创建的 WebElements 实例初始化提供的页面对象中的元素。
WebDriver
和 WebElement
都实现了接口 SearchContext
,它还告诉 WebDriver
如何查找元素。是否在整个页面源或范围内缩小到特定 WebElement
。这就是为什么我们可以像这样通过其他元素搜索元素:element.findElement(By.id("username"))
.
希望我稍微解释一下!
我是 Selenium 和 Whosebug 的新手。
如有错误敬请见谅
我的问题是:
@FindBy()
注释在内部如何工作以及为什么需要 initElemets()
方法?
方法 initElements()
使用 Java 反射 API 初始化所有 WebElement
和 List<WebElement>
字段。它基本上将默认 null
值更改为使用 Proxy
的接口实现。它还提供了 WebElement
的惰性实例化,这意味着 - WebElements 仅在需要时被发现(寻找?) - 当您对它们调用操作时。
更深入:
initElements
接受 Object
或 Class<?>
作为参数并从中创建一个对象。这样,PageFactory
获取 class 中的所有字段,验证它们是否属于 WebElement
或 List 类型并初始化它们。
如果 WebElement
未使用 @FindBy
注释,则 PageFactory
尝试通过变量名创建选择器。像这样的东西 WebElement username
可能在没有注释的情况下实际工作。
如果 WebElement
用 @FindBy
注释,则 By
对象被创建并连接到 WebElement
以备后用。这部分只是一个假设。
然后,WebElement
的实例就创建好了。由于是接口,不能直接用Reflection实例化API。 Proxy 用于处理 WebElement
的创建。 PageFactory
使用反射使用新创建的 WebElements 实例初始化提供的页面对象中的元素。
WebDriver
和 WebElement
都实现了接口 SearchContext
,它还告诉 WebDriver
如何查找元素。是否在整个页面源或范围内缩小到特定 WebElement
。这就是为什么我们可以像这样通过其他元素搜索元素:element.findElement(By.id("username"))
.
希望我稍微解释一下!