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

标签 java inheritance webdriver selenium-webdriver pageobjects

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

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

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/

相关文章:

java - 为什么重载与 Java 中的继承一起工作?

selenium - 需要通过 css 在 selenium 中查找元素

java - jaxws-rt.jar 中的 "/com/sun/xml/ws/"包和 rt.jar 中的 "/com/sun/xml/internal/ws/"包有什么区别

java - 为什么我的 JSONObject 相关单元测试失败?

java - 崩溃后 TCP 端口不可用

java - 检查 Sibling 类的实例

java - Glassfish 4.1 java.lang.OutOfMemoryError 异常

c++ - 如何遍历基类对象的 vector ?

java - Selenium 2.25.0 是否支持 Firefox 14?

java - 是否可以设置 Selenium Webdriver 在遇到错误时进行屏幕捕获