Java (Selenium) - конструктор суперкласса для инициализации подклассов - PullRequest
0 голосов
/ 09 декабря 2018

PageOne и PageTwo оба должны использовать методы MasterPage (например, нажмите Ok).Я пытаюсь инициализировать обе страницы в конструкторе MasterPage.IntelliJ говорит мне либо добавить super (драйвер) к конструкторам Page1 / Page2, либо добавить конструктор no arg в master.В обоих случаях тесты не могут быть запущены.с помощью конструктора super (driver) страницы не инициализируются, а в конструкторе no arg происходит сбой метода clickOk() при вызове из метода Page1 / Page2.

MasterPage:

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 голосов
/ 09 декабря 2018

Прежде всего, MasterPage не должен знать о page1 и page2, это их базовый класс.Вам также не нужно driver в каждом из производных Page, вы можете хранить его в родительском MasterPage.

Проблема в том, что MasterPage конструктор получает параметр WebDriver, ноу вас нет вызова super(driver) в конструкторах производных классов.

Я также предлагаю, чтобы каждый метод, который перемещает тест на другую страницу, возвращал эту новую страницу

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

Страница 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();
    }
}

Шаги страницы:

public class Page1Steps {

    public void testMethod() {
        Page1 pageOne = new Page1(driver);
        pageOne
            .completePageAndGoToPageTwo()
            .completePageTwo();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...