首页 > 解决方案 > Java (Selenium) - 用于初始化子类的超类构造函数

问题描述

PageOne并且PageTwo两者都需要使用MasterPage方法(例如单击确定)。我正在尝试在MasterPage. IntelliJ 告诉我要么将 super(driver) 添加到Page1/Page2构造函数,要么将无参数构造函数添加到 master。在这两种情况下,测试都无法运行。使用超级(驱动程序)构造函数,页面无法初始化,并且在无参数构造函数中,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% 确定解决此问题的最佳方法,因此我们将不胜感激任何指导。

标签: javaseleniumselenium-webdriver

解决方案


首先,MasterPage不应该知道page1and page2,它是他们的基类。你也不需要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();
    }
}

第1页步骤:

public class Page1Steps {

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

推荐阅读