Java(Selenium)-初始化子类的超类构造函数

时间:2018-12-09 12:06:37

标签: java selenium selenium-webdriver

PageOnePageTwo都需要使用MasterPage方法(例如,单击“确定”)。我正在尝试初始化MasterPage的构造函数中的两个页面。 IntelliJ告诉我要么将super(driver)添加到Page1 / Page2构造函数,要么将一个no arg构造函数添加到master。在两种情况下,测试均无法运行。使用super(driver)构造函数,页面将无法初始化,而在no arg构造函数中,clickOk()方法从Page1 / Page2方法中调用时将失败。

母版页:

public class MasterPage {

    private WebDriver driver;
    public Page1 p1;
    public Page2 p2;

    public MasterPage(WebDriver driver) {
        this.driver = driver;
        p1 = new Page1(driver);
        p2 = new Page2(driver);
        PageFactory.initElements(driver, this);
    }

    @FindBy(id = "OkBtn")
    private WebElement okBtn;

    public void clickOk() {
        okBtn.click();
    }
}

第1页:

public class Page1 extends MasterPage {

    private WebDriver driver;

    public Page1(WebDriver driver) {
        this.driver = driver;
        PageFactory.initElements(driver, this);
    }

    @FindBy(id="field")
    private WebElement elementOne;

    public void completePage() {
        elementOne.click();
        clickOk();
    }
}

第2页:

public class Page2 extends MasterPage {

    private WebDriver driver;

    public Page2(WebDriver driver) {
        this.driver = driver;
        PageFactory.initElements(driver, this);
    }

    @FindBy (id="field")
    private WebElement elementTwo;

    public void completePageTwo() {
        elementTwo.click();
        clickOk();
    }
}

我的意图是像这样利用它们:

public class Page1Steps {

    MasterPage master;
    WebDriver driver;

    public void testMethod() {
        master = new MasterPage(driver);
        master.p1.completePage();
        master.p2.completePageTwo();
    }
}

您也许可以说,我不确定100%是否有解决此问题的最佳方法,因此任何指导都将不胜感激。

1 个答案:

答案 0 :(得分:0)

首先,MasterPage不应该了解page1page2,这是它们的基类。您也不需要每个派生的driver中的Page,您可以将其保存在父MasterPage中。

问题是MasterPage构造函数接收到WebDriver参数,但是您没有在派生类构造函数中调用super(driver)

我还建议将测试导航到另一页的每种方法都将返回此新页面

母版页:

public class MasterPage { // can be abstract

    protected WebDriver driver;

    public MasterPage(WebDriver driver) {
        this.driver = driver;
        PageFactory.initElements(driver, this);
    }

    @FindBy(id = "OkBtn")
    private WebElement okBtn;

    protected void clickOk() {
        okBtn.click();
    }
}

第1页:

public class Page1 extends MasterPage {

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

    @FindBy(id="field")
    private WebElement elementOne;

    public Page2 completePageAndGoToPageTwo() {
        elementOne.click();
        clickOk();
        return new Page2(driver);
    }
}

第2页:

public class Page2 extends MasterPage {

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

    @FindBy (id="field")
    private WebElement elementTwo;

    public void completePageTwo() {
        elementTwo.click();
        clickOk();
    }
}

Page1Steps

public class Page1Steps {

    public void testMethod() {
        Page1 pageOne = new Page1(driver);
        pageOne
            .completePageAndGoToPageTwo()
            .completePageTwo();
    }
}