什么是使用PageFactory初始化和使用WebDriver PageObject的最佳方法?

时间:2012-04-09 12:54:50

标签: java design-patterns webdriver instantiation pageobjects

使用WebDriver和PageFactory,使用Java我们正在实现一个新的自动化项目,我们一直在试验各种创建PageObjects的方法。我们对一些不同的想法感到厌烦,并希望确保我们不会陷入困境。

如WebDriver文档中所述,最好是为PageFactory提供初始化的WebDriver,以及用于创建新PageObject的类模板吗?

driver.get(URL);
PageObject page = PageFactory.initElements(driver, PageObject.class);

// elsewhere
class PageObject {
  private WebDriver driver;

  public PageObject(WebDriver driver) {
    this.driver = driver;
    this.validateUrl();
  }

  public void validateUrl() throws Exception {
    if (!driver.getUrl().equals(url)) {
      throw new Exception("URL not valid");
    }
  }
}

但是,由于PageObject对自身了解很多,例如它的URL,我们是否可以让Page Object完成工作呢?

PageObject page = new PageObject(driver);
page.goToUrl();

// elsewhere
class PageObject {
  private WebDriver driver;
  private String url;

  public PageObject(WebDriver driver) {
    PageFactory.initElements(driver, this);
  }

  public void goToUrl() {
    driver.get(url);
  }
}

我想我没有看到使用PageFactory进行实例化而不仅仅是初始化的优势,但是我不想偏离架构师的标准设置,如果有原因的话。

由于

2 个答案:

答案 0 :(得分:0)

最好的方法是让像Geb和Thucydides这样的框架抽象出PageObjects及其初始化。我一直在使用Geb + Spock BDD组合,目前的结果非常出色。

答案 1 :(得分:0)

Page Factory的优势之一:

情景:

在您的应用程序中,您在一个页面中有100个字段。同一页面被调用50次。

如果使用Page Object方式完成此类场景,它将一次又一次地找到每个元素。可能会降低性能。

如果使用Page Factory方法完成相同的方案,它将仅首次查找元素,然后从缓存中获取。这样就提高了性能。