简体   繁体   English

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

[英]Java (Selenium) - super class constructor to initialise sub classes

PageOne<\/code> and PageTwo<\/code> both need to make use of MasterPage<\/code> methods (eg click Ok). PageOne<\/code>和PageTwo<\/code>都需要使用MasterPage<\/code>方法(例如单击确定)。 I'm trying to initialize both pages within the constructor of MasterPage<\/code> .我正在尝试在MasterPage<\/code>的构造函数中初始化两个页面。 IntelliJ tells me to either add super(driver) to the Page1<\/code> \/ Page2<\/code> constructors, or to add a no arg constructor to master. IntelliJ 告诉我要么将 super(driver) 添加到Page1<\/code> \/ Page2<\/code>构造函数,要么将无参数构造函数添加到 master。 In both cases, the tests can't run.在这两种情况下,测试都无法运行。 with a super(driver) constructor, the pages fail to initialize, and in the no arg constructor, the clickOk()<\/code> method fails when called from the Page1\/Page2 method.使用超级(驱动程序)构造函数时,页面无法初始化,并且在无参数构造函数中,从 Page1\/Page2 方法调用时clickOk()<\/code>方法失败。

MasterPage:<\/strong>母版页:<\/strong>

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();
    }
}

First of all, MasterPage shouldn't know about page1 and page2 , it's their base class. 首先, MasterPage不应该了解page1page2 ,这是它们的基类。 You also don't need driver in each one of the derived Page , you can hold it in the parent MasterPage . 您也不需要每个派生Page driver ,您可以将其保存在父MasterPage

The problem is MasterPage constructor receives WebDriver parameter, but you don't have call to super(driver) in the derived classes constructors. 问题是MasterPage构造函数接收WebDriver参数,但是在派生类构造函数中没有对super(driver)调用。

I also suggest each method which navigates the test to the another page will return this new page 我还建议将测试导航到另一页的每种方法都将返回此新页

MasterPage: 母版页:

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();
    }
}

Page1: 第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);
    }
}

Page2: 第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: Page1步骤:

public class Page1Steps {

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

On page1, last line of code return new Page2(driver);在 page1 上,最后一行代码返回 new Page2(driver); it puts null instead of driver everytime i try to match arguments.每次我尝试匹配参数时,它都会放置 null 而不是驱动程序。 Any quick fix?有什么快速解决办法吗?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM