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



有人能提出一种处理页面对象模式继承的方法吗?

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

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

这是可以的。但问题是你的UnitTest并没有扩展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();
}

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

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

你知道:

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

关键是,您的测试不应该关心页面的结构(字段的名称、它们在页面上的排列方式、),而应该关心应用程序的行为。

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

在创建需要使用不同数据填充的PageObjects的情况下。它必须来自外部(UnitTests)。因此,我想应该用unitTest中的数据填充或构建pageObjects,但前提是它是其他人需要的"类似服务的组件",并且必须处于不同的初始状态。如果你总是这样做,那么就不需要在TestCase和PageObjects之间共享这种数据。

PageObjects和UnitTest之间应该有一个"边界"。。。不同的数据必须来自unitTest到pageObjects测试方法,关于html的静态数据留在pageObjects中。。。IMHO

我不建议使用SuperPageObejct,因为正如你所拥有的。SomePageObject.get()方法返回SuperObject而不是SomePageObject。。。你在对象1中需要的东西,停留在对象一中。不应该有继承权。在Object1中,您不需要从object2获得任何东西。

最新更新