我有一个问题,当我使用FindBy注释时,Selenium webdriver的PageFactory.initElements方法如何工作
我有一段像这样的代码
Class PageObject {
@FindBy(id = "username")
private WebElement userName;
@FindBy(id = "password")
private WebElement passWord;
private WebDriver driver;
private String url = "http://www.loginpage.com";
public PageObject() {
driver = new FirefoxDriver();
PageFactory.initElements(driver, this);
}
void load() {
this.driver.get(url);
}
}
class TestClass {
public void testMethod() {
PageObject po = new PageObject();
po.load();
}
}
如果我阅读了PageFactory.initElements方法的文档,它会说 - 实例化给定类的实例,并为已声明的每个WebElement和List字段设置一个惰性代理,假设字段名称也是HTML元素" id"或"名称"。
我的问题是,当我在测试类中创建页面的对象时,它会触发页面对象的构造函数并使用PageFactory初始化webelements。但它会初始化为什么?我在使用load方法构造页面对象后才导航到页面。当页面尚不可用时,PageFactory会将WebElements初始化为什么。它是如何工作的。有人可以帮我理解这个
此致 薇思瓦纳
答案 0 :(得分:1)
以下是发生的情况:当您致电initElements
时,PageObjectFactory
会针对PageObject
类型的字段扫描您的WebElement
。对于页面对象具有的每个WebElement
字段,它会创建一个代理对象。该代理对象存储WebElement
的定位符(@FindBy
注释的值)。然后将代理分配给该字段。
稍后,当您的代码实际访问该字段而不是WebElement
对象时,您将检索代理。请记住,代理对象"知道"它所代表的WebElement
的定位器。现在,代理实际上尝试在当前页面上找到该定位器,如果找到则返回实际的WebElement
。
因此,在您的示例中,只要您不使用userName
或passWord
字段,他们就不会真正找到 。这意味着,例如,即使定位器出错,您也不会获得NoSuchElementException
,除非您实际使用这些元素。
所以回答你的问题:在初始化PageObject
时,驱动程序还没有导航到任何地方并不重要,因为代理对象的创建并没有。 ;实际上找到它们。