硒的 PageFactory 类及其与 FindBy 注释一起使用时的工作

gau*_*aya 0 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 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();
   }
}
Run Code Online (Sandbox Code Playgroud)

如果我阅读了 PageFactory.initElements 方法的文档,它会说 - 实例化给定类的一个实例,并为每个已声明的 WebElement 和 List 字段设置一个惰性代理,假设字段名称也是 HTML 元素的“身份证”或“姓名”。

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

问候高里

小智 6

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

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

因此,在您的示例中,只要您不使用userNamepassWord字段,它们就不会实际定位。这意味着,例如NoSuchElementException,即使定位器错误,您也不会得到 a ,除非您实际使用这些元素。

所以回答你的问题:在PageObject初始化时驱动程序还没有导航到任何地方都没有关系,因为代理对象的创建实际上并没有找到它们。