我有一个问题,当我使用 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 初始化 web 元素。但它会初始化为什么呢?仅在使用 load 方法构造页面对象后才导航到该页面。当页面尚不可用时,PageFactory 会将我的 WebElement 初始化为什么。它是如何工作的。有人可以帮我理解这一点吗
问候
高里
发生的情况是这样的:当你打电话时initElements
, the PageObjectFactory
扫描你的PageObject
对于类型的字段WebElement
。对于每个WebElement
您的页面对象具有的字段,它会创建一个代理对象。该代理对象存储了WebElement
(的值@FindBy
注解)。然后将代理分配给该字段。
稍后,当您的代码实际访问该字段时,而不是WebElement
对象,您检索代理。请记住,代理对象“知道”WebElement
它代表。现在,代理实际上尝试在当前页面上定位该定位器,并返回实际的WebElement
如果被发现的话。
因此,在您的示例中,只要您不使用userName
or passWord
字段,它们实际上不会located。这意味着,例如您不会得到NoSuchElementException
,即使定位器是错误的,除非您实际使用这些元素。
所以回答你的问题:无论什么时候PageObject
已初始化,驱动程序尚未导航到任何地方,因为代理对象的创建实际上并未完成locate them.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)