Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 页面对象是否应该返回页面对象?_Java_Webdriver_Pageobjects - Fatal编程技术网

Java 页面对象是否应该返回页面对象?

Java 页面对象是否应该返回页面对象?,java,webdriver,pageobjects,Java,Webdriver,Pageobjects,我们目前正在我们公司建立一个良好的测试框架。这是一个中型到大型的网络应用程序,可能有几十个页面。我们目前主要编写基于WebDriver Selenium UI的测试 我们正在尝试确定一些编码标准,我们正在讨论的一件事是,是否使用始终返回PO(即使页面相同)的页面对象(PO),仅在您离开当前页面进入新页面时返回PO,或者甚至不返回PO。我一直认为退回PO是PO设计模式的一个关键特性,但我可能不这么认为 基本上,我们试图在以下模式之间做出选择: class SomePage { // co

我们目前正在我们公司建立一个良好的测试框架。这是一个中型到大型的网络应用程序,可能有几十个页面。我们目前主要编写基于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;

     }

一个比另一个更可取吗?

简短的回答是,如果您在同一页面上,并且页面的状态没有改变,则不要返回相同的页面对象。如果从一个页面导航到另一个页面,则会返回新的页面对象。当我们假设您想要从页面中获取一些文本或选择一个选项时,返回相同的对象是没有意义的,因为本质上没有任何变化。如果页面的状态正在更改,则需要返回新的页面对象,否则可能会遇到
StaleElementException
。在中,如果注意到登录页面,
getErrorMessage()
不会返回相同的页面对象


与您最初的问题有一点不同,但如果您还没有并且正在正式制定标准,我建议您使用

这是风格的问题

使用:

class SomePage {
    ...
    // always return a page object
    public SomePage fillInTextField(String val){
         ...
         return this; // Note: NOT "new SomePage(driver)"
    }
}
class SomePage {
    ...
    // only return a PO if it's a different page
    public void fillInTextField(String val){
        ...
        return;
    }
}
允许您编写以下内容:

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

class SomePage {
    ...
    // always return a page object
    public SomePage fillInTextField(String val){
         ...
         return this; // Note: NOT "new SomePage(driver)"
    }
}
class SomePage {
    ...
    // only return a PO if it's a different page
    public void fillInTextField(String val){
        ...
        return;
    }
}
迫使您编写以下内容:

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

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

我发现这样做非常容易维护。尤其是Java8。使用Java8中的默认方法,组件和小部件现在成为mixin。通过总是返回一个页面,您最终得到的测试用例如下所示:

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

我在这里有一篇博客文章更详细地描述了这一点:

正如前面所说的“方法返回其他页面对象”

不返回新的SomePage,而是使用val做一些事情,然后
返回它。当然<代码>返回此在这里可能是一个快乐的媒介。感谢您指出显而易见的问题!