Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

Переинициализировать элементы после закрытия сессии

page-factory
selenium
webdriver
Теги: #<Tag:0x00007fedb981a6b0> #<Tag:0x00007fedb981a430> #<Tag:0x00007fedb981a2c8>

(Mr Ds Low) #1

Есть тест:

    @Test(priority = 2, enabled = true)
    public void testName() throws IOException, InterruptedException {
        class SroPagesInitialization {
            private DashboardPage dashboard = new DashboardPage(getDriver());
        }

        SroPagesInitialization sro = new SroPagesInitialization();
        new BaseTest().teardown(); //Сессия завершается (1) (та, что была открыта при BeforeTest)
        super.openSystem(); //Открывается новая
        new SroBaseTest().authorizationSro(); //Авторизация нового тела (2), новой сессии
        new ChsroBaseTest().init(); //init() ниже
//        PageFactory.initElements(getDriver(), contracts); //Инициализация элементов одной страницы
        sro.dashboard.contractsClick(); //Взаимодействие с элементами тела2
        contracts.RandomContractInTableClick(); //Взаимодействие с элементами тела1 (прошлая завершенная сессия). Работать не будет, потому что прошлая сессия закрыта.
        contractCard.ClickCalendarPlanTab(); // Аналогично
        ....
    }

Создание объектов на страницы:

public void init() {
        contracts = new ContractsPage(getDriver());
        contractCard = new ContractCardPage(getDriver());
        .....
    }

Вопрос:
Как переинициализировать элементы страниц с прошлой сессии? На примере все работает если вставить PageFactory.initElements(getDriver(), contracts). Но очевидно это совсем не вариант.
(Условие, что не нужно тыкаться в SRO и кидать туда элементы/страницы. А в пределах запуска нового драйвера или текущей сессии).

Скорее всего будут какие-то вопросы.


(Mr Ds Low) #2

Для ясности почему падает.:
org.openqa.selenium.NoSuchSessionException: Session ID is null. Using WebDriver after calling quit()?

Драйвер статичный, но описан через ThreadLocal. Наследование между тестами есть, BaseTest и все такое.
Суть в том, что мы драйвер делим на зоны ответственности. И мне, в текущей ситуации необходимо зайти не в свою. Поэтому было принято решение: 1) мой BeforeTest инициализируется, процесс закрывается. 2) управление передается на BeforeTest тела2, т.е. не мой драйвер. 3) Делаются определенные действия с локаторами драйвера, которые он инициализировал со свой стороны. Т.е. например зайти на свой стенд/платформу, и т.п. 4) После чего тесты доходят до части, которая является “общей” и где с моей стороны локаторы и методы описаны, поэтому я хочу воспользоваться ими. 5) Проблема инициализации собственных локаторов.

Проблема не острая, т.е. она решаема, как например добавление и инициализация в тестах ContractsPage contracts = PageFactory.initElements(getDriver(), ContractsPage.class); или инициализация элементов “не в моем драйвере”. Но это очень плохой подход и хотелось бы сделать грамотно.

Я понимаю, что вероятно не понятно о чем идет речь, но и я не понимаю какую информацию дать, чтобы ситуация стала яснее.


(asolntsev) #3

Начните с того, что упростите ваш код. Он слишком запутанный, и абсолютно без надобности. Все беды от этого.

Например,

  1. Класс SroPagesInitialization нафиг не нужен. Почему бы не создать сразу локальную переменную dashboard вместо sro.dashbord?
  2. Зачем из одного теста вызывать другие тесты (BaseTest, SroBaseTest, ChsroBaseTest)? Это прям вообще плохая практика!
  3. Зачем сначала создавать объект dashboard, затем всё закрывать и открывать заново? Почему бы просто не создать объект dashboard ПОСЛЕ всех init?