【问题标题】:Whats the best way to initialize and use a WebDriver PageObject using PageFactory?使用 PageFactory 初始化和使用 WebDriver PageObject 的最佳方法是什么?
【发布时间】:2012-04-09 12:54:50
【问题描述】:

通过 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 进行实例化与仅进行初始化相比没有太大的优势,但是如果有原因的话,我不想偏离架构师的标准设置。

谢谢

【问题讨论】:

    标签: java design-patterns webdriver instantiation pageobjects


    【解决方案1】:

    页面工厂的优势之一:

    场景:

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

    如果这种类型的场景是通过使用页面对象的方式来完成的,它会一次又一次地找到每个元素。性能可能会下降。

    如果同样的场景使用Page Factory的方式,它只会第一次找到元素,然后从缓存中取。这样可以提高性能。

    【讨论】:

      【解决方案2】:

      最好的方法是让 Geb 和 Thucydides 等框架抽象出 PageObjects 及其初始化。为此,我一直在使用Geb + Spock BDD 组合,到目前为止效果非常好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-30
        • 2012-02-08
        • 1970-01-01
        相关资源
        最近更新 更多