如何处理WebDriver的PageObjects模式中的继承?

时间:2011-06-02 09:33:52

标签: java inheritance webdriver selenium-webdriver pageobjects

可以请任何人建议一种处理页面对象模式的继承的方法吗?

例如,页面对象需要共享属性和方法。

public class LoginPage extends SuperPage
public class SuperPage extends LoadableComponent<SuperPage>

这没关系。但问题是你的UnitTests没有扩展SuperPage,它们扩展了TestCase,它为测试保存了全局属性等。

我尽量避免重复,因为我需要在TestCase和SuperPage中共享相同的内容...页面和测试只能扩展其中一个。

例如,我需要在PageObjects和Tests中使用相同的Form Data ...

示例:

如果您有一个用于填写html表单的PageObject,则需要表单字段的名称,但即使在其他pageObject中也需要它们。这样您就可以扩展字段名称所在的SuperPage。它们不能从UnitTests提供,例如:

@CacheLookup
@FindBy(how = How.ID, using = namespace + signifLvl)
private WebElement sigLvl;
@CacheLookup
@FindBy(how = How.ID, using = namespace + languageTo)
private WebElement langTo;  
@CacheLookup
@FindBy(how = How.ID, using = namespace + languageFrom)
private WebElement langFrom;
@CacheLookup
@FindBy(how = How.ID, using = namespace + description)
private WebElement desc;

但另一方面,你需要在UnitTest方法中使用它们,因为你从它们向PageObjects提供不同的值。

否则它将始终像这样,使用TestCase中的变量预填充PageObjects:

@Test
public void doStuff() throws IOException {
    driver.navigate().refresh();
    FillOutFormPage fofp = new FillOutFormPage(driver);
    fofp.fill(some values from TestCase);
    fofp.get();
}

2 个答案:

答案 0 :(得分:0)

我没有对WebDriver做过多少工作,但我记得,我创建和测试的大部分PageObjects都不需要填充。它们只包含一个场景 - 要测试的条件序列,以从UnitTest调用的测试方法的形式。在PageObjects之间共享的唯一属性只是几个字段或字段名称(非常特殊 - 就像一个提交按钮,当单击时,验证被触发 - 它需要从构成整个页面的所有组件可以访问并验证某些内容)和例如,名称空间。

如果要创建需要填充不同数据的PageObjects。它必须从外部(UnitTests)。所以我想我应该在unitTests中填充或者构造带有数据的pageObjects,但前提是它是其他人需要的“像组件一样的服务”,并且必须与初始状态不同。如果你总是这样做,那么就不需要在TestCase和PageObjects之间共享这种数据。

PageObjects和UnitTests之间应该有一个“边界”......不同的数据必须来自unitTests到pageObjects测试方法,关于html的静态数据保留在PageObjects中......恕我直言

我不推荐使用SuperPageObejct,因为你拥有它。 SomePageObject.get()方法返回SuperObject而不是SomePageObject ...您需要在object1中保留对象1。应该没有继承权。在Object1中,从object2中不需要任何东西。

答案 1 :(得分:0)

页面对象模式的一个关键方面是测试用例和页面结构的隔离。如果您的测试是在字段中输入,那么您可能正在做错了。您的页面应该提供允许测试执行重要操作的方法,而不是让测试填充页面的变量。因此,而不是:

myPage.sigLvl = "10"; myPage.langTo = "en"; myPage.langFrom = "de";

你这样做:

myPage.addTranslation("en", "de", 10);

关键是你的测试不应该关心页面的结构(字段被调用的内容,它们在页面上的排列方式,等。),而是关于应用程序的行为。