如何处理页面对象的继承

问题描述

我有以下问题:

我有一个主页,在其中加载具有以下结构的URL:

public class HomePage extends BasePage {

public HomePage(WebDriver driver) {
    super(driver);
    getDriver().get("URL");
}

然后我有一个页面,该页面从主页扩展:

public class OptionsPage extends HomePage {

public OptionsPage(WebDriver driver) {
    super(driver);
}

现在,问题出在测试上,我想从某个动作中获取OptionsPage(假设单击HomePage上存在的按钮)。看来,一旦我调用它,页面就会再次加载:

    // Open page
    HomePage home = getHomePage(); //loads URL from BasePage

    // click on some option which takes me to the OptionsPage
    OptionsPage options = home.clickOnRandomOption(); //this method right here loads the URL again,from there the assertion fails since the page just loads again.
    Assert.assertTrue(options.isRandomOptionSelected(),"ObvIoUsly it wasn't selected.");

在主页上单击选项的方法如下:

public OptionsPage clickOnRandomOption() {
    getWait().until(ExpectedConditions.elementToBeClickable(RandomOption));
    RandomOption.click();
    return new FlightOptionsPage(getDriver());
}

有人可以帮我吗?

解决方法

您的挑战是,当实例化optionsPage时,您正在链上执行所有构造函数。

在您的代码结构中,您每次要创建OptionsPage时都在运行:HomePage-> BasePage-> optionsPage。这就是Gorilla-banana-jungle问题的测试POM。

我可以看到home.clickOnRandomOption()的返回类型是OptionsPage,所以我假设这是您实例化选项页面的地方。

两个建议-它们中的任何一个都可以解决您的问题,但是我建议您考虑同时实现这两个建议:

  • 不要那样链接您的页面。保持每个单独,并且只能扩展一次,即每个页面仅从BasePage开始扩展。如果有一种通用的方法需要多个页面,请将其放在您的BasePage中,而无需从其他页面扩展页面。

  • 不要在构造函数中执行影响测试上下文的代码-仅将构造函数用于初始化变量。通过这种方式,我的意思是在创建HomePage时不要在构造函数中导航(driver.get("URL"))。在运行测试时,这将给您将来带来麻烦。例如,如果您想从pageX开始并通过自动重定向导航到首页,然后对首页执行更多操作怎么办? -您的POM不支持它,因为您创建homePage时将导航到该URL。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...