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

标签 java selenium selenium-webdriver

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

母版页:

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% 确定解决此问题的最佳方法,因此我们将非常感谢您提供任何指导。

最佳答案

首先,MasterPage 不应该知道 page1page2,这是它们的基类。您也不需要在每个派生 Page 中都需要 driver,您可以将其保存在父 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();
    }
}

关于Java (Selenium) - 用于初始化子类的父类(super class)构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53692146/

相关文章:

java - 通过 Selenium 和 Java 使用 ChromeDriver 和 Chrome 在窗口之间切换时,从渲染器接收消息超时 : 300. 000 错误

java - 使用 Spring MongoTemplate 在 mongo 中插入数据时获取 java.lang.NoSuchMethodError : org. springframework.cglib.core.ReflectUtils.defineClass

javascript - Protractor 表单验证导致预期失败

python - 如何使用 Selenium 从网站下载 csv 数据

C# Selenium 如何在不使用 pageup/pgdn 的情况下滚动可滚动的 div,而不是整个网页

asynchronous - 使用 async/await 进行异步 mocha 测试时遇到问题

selenium - 如何使用 Webdriver.io 打开特定的 Chrome 配置文件?

java - 无法使用ajax调用spring Controller

java - Wicket DND - 带 table 的顶部/底部下拉式

java - 如何获取 paint/paintComponent 生成的图像?