Selenium webdriver selenium的PageFactory类及其与FindBy注释一起使用时的工作方式

Selenium webdriver selenium的PageFactory类及其与FindBy注释一起使用时的工作方式,selenium-webdriver,Selenium Webdriver,我有一个问题,当我使用FindBy注释时,Selenium webdriver的PageFactory.initElements方法是如何工作的 我有一段这样的代码 Class PageObject { @FindBy(id = "username") private WebElement userName; @FindBy(id = "password") private WebElement passWord; private WebDriver driver; private String

我有一个问题,当我使用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”或“name”

我这里的问题是,当我在测试类中创建页面对象时,它会触发页面对象的构造函数,并使用PageFactory初始化webelements。但它将初始化为什么呢?只有在使用load方法构造页面对象之后,我才能导航到该页面。当页面还不可用时,PageFactory会将我的WebElements初始化为什么。它是如何工作的。有人能帮我理解吗

问候
Gauri

发生的情况如下:当您调用
initElements
时,
PageObjectFactory
会扫描
PageObject
以查找
WebElement
类型的字段。对于页面对象具有的每个
WebElement
字段,它将创建一个代理对象。该代理对象存储
WebElement
的定位器(
@FindBy
注释的值)。然后将代理分配给该字段

稍后,当代码实际访问该字段时,将检索代理,而不是
WebElement
对象。请记住,代理对象“知道”它所表示的
WebElement
的定位器。现在,代理实际上试图在当前页面上定位该定位器,并返回实际的
WebElement

因此,在您的示例中,只要您不使用
用户名
密码
字段,它们就不会被实际定位。这意味着,例如,即使定位器是错误的,您也不会得到一个
NoTouchElementException
,除非您实际使用这些元素


因此,为了回答您的问题:当
页面对象
初始化时,驱动程序还没有导航到任何地方,这并不重要,因为代理对象的创建实际上没有找到它们。

下面是发生的情况:当您调用
initElements
时,
PageObjectFactory
扫描
PageObject
以查找类型为
WebElement
的字段。对于页面对象具有的每个
WebElement
字段,它将创建一个代理对象。该代理对象存储
WebElement
的定位器(
@FindBy
注释的值)。然后将代理分配给该字段

稍后,当代码实际访问该字段时,将检索代理,而不是
WebElement
对象。请记住,代理对象“知道”它所表示的
WebElement
的定位器。现在,代理实际上试图在当前页面上定位该定位器,并返回实际的
WebElement

因此,在您的示例中,只要您不使用
用户名
密码
字段,它们就不会被实际定位。这意味着,例如,即使定位器是错误的,您也不会得到一个
NoTouchElementException
,除非您实际使用这些元素

因此,回答您的问题:当
PageObject
初始化时,驱动程序还没有导航到任何地方,这并不重要,因为代理对象的创建实际上没有找到它们