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

Java 如何处理WebDriver的PageObjects模式中的继承?,java,inheritance,webdriver,selenium-webdriver,pageobjects,Java,Inheritance,Webdriver,Selenium Webdriver,Pageobjects,请任何人提出一种处理页面对象模式继承的方法好吗 例如,页面对象需要共享属性和方法 public class LoginPage extends SuperPage public class SuperPage extends LoadableComponent<SuperPage> 但另一方面,您需要在UnitTest方法中使用这些方法,因为您为PageObject提供了不同的值 否则,它总是这样,使用TestCase中的变量预填充PageObjects: @Test public

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

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

public class LoginPage extends SuperPage
public class SuperPage extends LoadableComponent<SuperPage>
但另一方面,您需要在UnitTest方法中使用这些方法,因为您为PageObject提供了不同的值

否则,它总是这样,使用TestCase中的变量预填充PageObjects:

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

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

在创建需要填充不同数据的页面对象时。它必须从外部进行(单元测试)。因此,我想应该在unitTests中使用数据填充或构建pageObjects,但前提是它是其他人需要的“类似服务的组件”,并且必须处于不同的初始状态。如果您总是这样做,那么就不需要在TestCase和PageObjects之间共享此类数据

PageObjects和UnitTests之间应该有一个“边界”…不同的数据必须从UnitTests进入PageObjects测试方法,关于html的静态数据留在PageObjects中。。。伊姆霍


我不建议使用SuperPageObejct,因为正如您所拥有的那样。方法返回SuperObject而不是SomePageObject。。。您在object1中需要的内容将保留在object1中。不应该有继承权。在Object1中,您不需要从object2获得任何东西

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

myPage.sigLvl=“10”;
myPage.langTo=“en”;
myPage.langFrom=“de”

你可以:

myPage.addTranslation(“en”,“de”,10)


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

在我的例子中,html表单有12个字段,所以我要创建一个映射……因为拥有12个字段的方法是维护的噩梦。。。如果我在FormPageObjects上有5个方法来测试验证等,那么通过方法参数传递12个值是个坏主意,你知道……这就是为什么我需要字段名来通过反射获得它们,那么在FormObjectI中,我真的无法适应这种模式
@Test
public void doStuff() throws IOException {
    driver.navigate().refresh();
    FillOutFormPage fofp = new FillOutFormPage(driver);
    fofp.fill(some values from TestCase);
    fofp.get();
}