Selenide. Помогите разобраться с PageObject

Здравствуйте. Осваиваю PageObject
Проблема такого рода. У меня есть
package. например packagepage1
в ней есть java class, например PageOne
в которой описываю то что есть на странице

public class PageOne {

    By basicauthemail = By.id("email");
    By basicauthpass = By.id("password");
    By basicauthbutton = By.cssSelector("[data-testid='login-page-signin-button']");

так же есть второй package. например packagepage2
в нем есть java class, например PageTwo
В этом PageTwo мне надо использовать basicauthbutton из PageOne
Естественно

$(basicauthbutton).shouldBe(exist);

не работает. Подскажите как быть ?

Что-то путано.
PageOne и PageTwo описывают две разные страницы?
Ну тогда они и не должны переиспользовать друг друга.
В PageTwo должно быть своё поле basicauthbutton.

(но вообще зависит от ситуации)

При определенных действиях на странице PageTwo переходит редирект на PageOne
Поэтому в описании теста PageTwo хочу воспользоваться basicauthbutton который уже описан в PageOne

Значит создавайте опять страницу при редиректе, локаторы можно статическими слелать, чтоб не пересоздавались каждый раз

А какой подход использовать, если на нескольких страницах есть одинаковые элементы, при изменений XPATH которого, хотелось бы в коде исправить XPATH только в одном месте, если использование STATiC переменных возбраняется?

Не, использование static не возбраняется для констант.

1 лайк

Если страницы имеют, например, общее меню воспользуйтесь наследованием, если это просто блок, то вынесите локаторы в отдельный класс и добавляйте его в нужный page, типа компонента. Например у веб разработчиков сейчас весь ui в виде компонентов. В Java или c# это можно сделать в виде композиции, а если у вас просто статические локаторы в классе, то даже композиция не нужна, просто берете из этого компонента и используете где нужно.

Ну, во-первых, использование 1 пекеджа на 1 страницу - это по меньшей мере странно.
Во-вторых, если в тесте используется несколько страниц - инстанцируйте несколько и используйте правильную страницу, на которой находитесь в тесте на момент работы с конкретным контролом.
Типа так:

public void test() {
private PageOne pageOne;
private PageTwo pageTwo;

pageOne = new PageOne();
pageTwo = new PageTwo();
pageTwo.doSmthWithRedirect();
pageOne.doSmth();
}

Используйте наследование.
Например, так:

interface Menu {
// some locators here
}

interface SmthAnother{
// some locators here
}

public class MyPage implements Menu, SmthAnother {

}