Проблема с запуском нескольких тестклассов

Есть несколько тест классов. Каждый унаследован от класса TestBase. В TestBase вынесены престепы @BeforeAll. Выглядит это следующим образом:

public class TestBase {
    private static Props props = Props.getInstance();
    @BeforeAll
    static void setup() {
        LoginPage loginPage = open(props.get("stand"), LoginPage.class);
        loginPage.login(props.get("user"), props.get("password"));
    }
}

Вся проблема в том, при запуске первого тесткласса все хорошо, а когда начинает запускать второй то первый же тест падает с ошибкой на этой строке loginPage.login(…), так как креды введенные на первом тестклассе “запомнились” и во второй раз open() открывает сайт как уже для залогиненного пользователя.

пробовал в @AfterAll вызывать clearBrowserLocalStorage() и clearBrowserCookies() – не помогло

Мне видится решение так:

  • запускать для каждого класса “чистый” браузер без данных с предыдущих запусках,
  • либо сделать так чтобы @BeforeAll работал не для методов класса, а для всех классов с тестами (глобальный такой бефор),
  • либо объеденить все классы в сьют и открывать браузер перед ним (бефорсьют, но я такого не нашел)
    помогите реализовать какой-нибудь из перечисленных вариантов, я потыкался но не нашел решения самостоятельно
    Selenide 7.0.4 + JUnit5 5.9.2

Ну либо поиграть с бефор и афтер анотациями либо можно попробовать в инкогнито моде ранать

Подскажите, пожалуйста, как через селенид в инкогнито запустить, а я как-то с ходу не обнаружил

ChromeOptions opt = new ChromeOptions();
opt.addArguments(“–incognito”);
Configuration.browserCapabilities = opt;

1 лайк

Вообще вроде норм тема, закрывать браузер после каждого тестового класса, ибо если этого не делать, на машине будет собираться мусор из-за создания драйверов браузера. Поэтому нормально сделать:

public class TestBase {
    private static Props props = Props.getInstance();
    @BeforeAll
    static void setup() {
        LoginPage loginPage = open(props.get("stand"), LoginPage.class);
        loginPage.login(props.get("user"), props.get("password"));
    }

    @AfterAll
    static void tearDownBrowser() {
     Selenide.closeWebDriver();
    }
}

Если вы не сетили свой драйвер в селениде, т.е. не делали

WebDriverRunner.setWebDriver(driver)

то селенид по идее должен сам все закрывать.

1 лайк

Был уверен, что инкогнито режим поможет, но, к сожалению, нет - проблема не решилась(

Тогда убери статик для Props

Из дома только примерно могу проверить, но кажется Selenide.closeWebDriver(), что @Nikita_Gritskevich рекомендовал помогает. Завтра на работе проверю наверняка.
И Props из меню на не статик тоже.

Как то не очень понятно почему в непараметризированном сетапе должны разные польщователи быть

откройте @BeforeEach
https://junit.org/junit5/docs/5.0.2/api/org/junit/jupiter/api/BeforeEach.html
org.junit.jupiter.api.BeforeEach
AfterEach
https://junit.org/junit5/docs/5.0.1/api/org/junit/jupiter/api/AfterEach.html

BeforeEach юзать как-то не релевантно, делать логин перед каждым тестовым методом, но это же жесть…

А покажи свою конфигурацию пожалуйста, как ты её задаешь, может понятнее станет

Конфигурацию драйвера?
Я ничего кроме

Configuration.browserSize = "1920x1080";

в методе setup() не задаю. Или про какой вы кофиг спрашиваете?

Спасибо, именно это я хотел увидеть, тут все норм. Кстати, попробуй ещё сделать после тестов, если очистка куков и localstorage не помогло:

Selenide.getSessionStorage().clear();

Раз инкогнито мод не помог и очистка куков и localstorage
P.S. самый лучший способ и работающий на 100% это конечно закрывать драйвер

ТС указал что тесты нельзя группировать потому что они для разных поль:

напрашивается BeforeEach

или не наследовать рызные классы от одного и того же где общий BeforeAll

Спасибо большое. Эта строчка решила задачу.

1 лайк

Не, тут вообще же не указано, что для разного пользователя) Просто страно, зачем делать логин в базовом классе, ибо рано или поздно придется проверять логин, и что тогда, логаут делать что-ли)

Рад помочь:) Помечай как решения вопроса. Суть проблемы было в том, что ты работал как я понимаю в рамках одной сесси, что при попытке навигейт на страницу логина происходил редирект, так как сессия активная уже существовала. Поэтому решения в принципе два: очистка сессия в браузере, закрытие драйвера(приоритетно)

Получается, что “сессия” != открытый браузер? В рамках сессии можно несколько раз открывать и закрывать браузер с сохраняющимся контекстом?

Равно, но ты же нигде не закрывал браузер) Поэтому сессия и не экспарилась

1 лайк