【问题标题】:Java (Selenium) - super class constructor to initialise sub classesJava (Selenium) - 用于初始化子类的超类构造函数
【发布时间】:2018-12-09 12:06:36
【问题描述】:

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

【问题讨论】:

    标签: java selenium selenium-webdriver


    【解决方案1】:

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

    【讨论】:

    • 非常感谢这给了我很多思考 - 仍在学习最佳实践。我会整理我的代码并实施您的建议。再次欢呼。
    猜你喜欢
    • 1970-01-01
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    • 1970-01-01
    • 2022-06-10
    相关资源
    最近更新 更多