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