首页 > 解决方案 > Selenium:@FindBy 注解和 initElemets() 方法

问题描述

我是 Selenium 和 StackOverflow 的新手。

如果有任何错误,我提前道歉。

我的问题是:

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

标签: selenium-webdriverpage-factory

解决方案


该方法使用 Java 反射 APIinitElements()初始化所有WebElement和字段。List<WebElement>它基本上将默认null值更改为使用Proxy. 它还提供了一种懒惰的实例化WebElement方式——只有在需要时才找到(寻找?)WebElements——当你对它们调用操作时。

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

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

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

然后,WebElement创建实例。因为它是一个接口,所以不能直接用 Reflection API 实例化。代理用于处理WebElement. PageFactory使用反射使用新创建的 WebElements 实例初始化提供的页面对象中的元素。

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

希望我解释一下!


推荐阅读