1

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

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

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

这会好的。但问题是您的 UnitTests 不扩展 SuperPage,它们扩展了 TestCase,它包含用于测试的全局属性等。

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

例如,我需要在可用的 PageObjects 和测试中使用相同的表单数据......

例子:

如果您有用于填写 html 表单的 PageObject,则需要表单字段的名称,但即使在其他 pageObjects 中也需要它们。这样您就可以扩展 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();
}
4

2 回答 2

0

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

如果创建需要填充不同数据的 PageObjects。它必须来自外部(UnitTests)。所以我猜应该用unitTests中的数据填充或者构造pageObjects,但前提是它是其他人需要的“类似服务的组件”并且必须处于不同的初始状态。如果您总是这样做,则不需要在 TestCase 和 PageObjects 之间共享此类数据。

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

我不建议您拥有 SuperPageObejct,因为您拥有它。SomePageObject.get() 方法返回 SuperObject 而不是 SomePageObject... 您在 object1 中需要的东西,留在对象一中。不应该有继承。在 Object1 中,您不需要 object2 中的任何内容。

于 2011-06-02T10:18:20.170 回答
0

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

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

你做:

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

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

于 2011-06-06T12:33:18.460 回答