首页 文章

Selenium的PageFactory类及其与FindBy Annotation一起使用时的工作方式

提问于
浏览
0

我有一个问题,当我使用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初始化为什么 . 它是如何工作的 . 有人可以帮我理解这个

问候高里

1 回答

  • 1

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

    稍后,当您的代码实际访问该字段时,您将检索代理而不是 WebElement 对象 . 请记住代理对象"knows"它所代表的 WebElement 的定位器 . 现在代理实际上试图在当前页面上找到该定位器,并返回实际的 WebElement (如果找到它) .

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

    所以回答你的问题:在初始化 PageObject 时,驱动程序没有实际找到它们并不重要 .

相关问题