有人可以建议一种处理有关页面对象模式的继承的方法吗?
例如,页面对象需要共享属性和方法。
public class LoginPage extends SuperPage
public class SuperPage extends LoadableComponent<SuperPage>
这样就可以了。但问题是你的 UnitTests 不扩展 SuperPage,它们扩展 TestCase,它保存测试的全局属性等。
我尽量避免重复,因为我需要在 TestCase 和 SuperPage 中共享相同的内容...页面和测试只能扩展其中之一。
例如,我需要在可用的页面对象和测试中使用相同的表单数据...
示例:
如果您有一个用于填写 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);
重点是,您的测试不应该关心页面的结构(字段的名称、它们在页面上的排列方式,等等),而应该关心应用程序的行为。
关于java - 如何处理WebDriver的PageObjects模式中的继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6212726/