页面对象应该返回页面对象吗?

时间:2013-07-31 17:00:35

标签: java webdriver pageobjects

我们目前正在努力在我们公司建立一个良好的测试框架。它适用于中型到大型的Web应用程序,可能有几十页。我们目前主要编写基于WebDriver Selenium UI的测试。

我们正在尝试决定一些编码标准,我们讨论的一件事是是否使用始终返回PO的页面对象(PO​​)(即使页面是相同的),只有当您离开时返回PO新页面的当前页面,甚至不返回PO。我一直认为返回PO是PO设计模式的一个关键特性,但我可能对此不正确。

基本上,我们试图在以下模式之间做出决定:

class SomePage {
     // constructor
     public SomePage(Driver) { //... } 

     // always return a page object
     public SomePage fillInTextField(String val){
          // details
          return new SomePage(driver);

     // only return a PO if it's a different page
     public void fillInTextField(String val){
          // details
          return;

     }

是否优先于另一个?

4 个答案:

答案 0 :(得分:3)

这是一种风格问题。

使用:

class SomePage {
    ...
    // always return a page object
    public SomePage fillInTextField(String val){
         ...
         return this; // Note: NOT "new SomePage(driver)"
    }
}

允许您编写如下内容:

SomePage somePage = HoweverYouGetASomePage();
NextPage nextPage = somePage.fillInTextField1("value1").fillInTextField2("value2").submit();

使用:

class SomePage {
    ...
    // only return a PO if it's a different page
    public void fillInTextField(String val){
        ...
        return;
    }
}

迫使你写下这样的话:

SomePage somePage = HoweverYouGetASomePage();
somePage.fillInTextField1("value1");
somePage.fillInTextField2("value2");
NextPage nextPage = somePage.submit();

你喜欢哪一个取决于...你喜欢哪一个。但如果你想能够来编写前者,你需要始终返回页面对象。

答案 1 :(得分:1)

简短回答是,如果您位于同一页面并且页面状态未发生变化,则不要返回相同的页面对象。如果要从一个页面导航到另一个页面,则会返回新的页面对象。当我们想要获取一些文本或从页面获取选定的选项时返回相同的对象是没有意义的,因为基本上没有任何改变。如果页面状态发生变化,那么您需要返回新的页面对象,否则您可能会遇到StaleElementException。在google docs中,如果您注意到LoginPage,getErrorMessage()不会返回相同的页面对象

稍微偏离原始问题,但我建议使用PageFactory,如果您已经不是,并且正在制定标准化程序。

答案 2 :(得分:1)

PageObject Selenium help page说“方法返回其他PageObjects”

答案 3 :(得分:0)

我发现这样做极其可维护。特别是使用Java 8.使用Java 8中的默认方法,组件和小部件现在变成了Mixins。通过始终返回页面,您最终会得到如下所示的测试用例:

public class HomePageITest {
  @Test
  public we_should_be_able_to_search_from_the_homepage() {
    pageFactory.getHomePage()
      .get()
      .doSomethingOnTheHomePage()
      .clickSearchWidgetSubmitButton()
      .doSomethingElseOnTheHomePage()      
    ;
  }
}

我有一篇博文,详细介绍了这一点:http://blog.jsdevel.me/2015/04/pageobjects-done-right-in-java-8.html