Home | RU | EN

Логин через JS

В UI-тестах часто возникает необходимость авторизации пользователя. Вместо медленного и нестабильного процесса ввода логина/пароля через веб-интерфейс, можно использовать API для получения токена и установки его в браузер через JavaScript. Это значительно ускоряет и стабилизирует тесты.

Зачем логиниться через API в UI-тестах

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

1. Метод авторизации в BaseUiTest

В BaseUiTest нужно создать статический метод, который открывает браузер, получает токен по API (что значительно быстрее, чем через UI) и добавляет его в localStorage браузера:

public static void authAsUser(String username, String password) {
    Selenide.open("/");
    String userAuthToken = RequestSpecs.getUserAuthHeader(username, password);
    executeJavaScript("localStorage.setItem('authToken', arguments[0]);", userAuthToken);
}

2. Метод получения токена в RequestSpecs

Метод getUserAuthHeader из класса RequestSpecs делает логин по API и возвращает токен (если токен уже в хранилище, то даже не делает запрос):

public static String getUserAuthHeader(String username, String password) {
    String userAuthToken;

    if (!authHeaders.containsKey(username)) {
        userAuthToken = new CrudRequester(RequestSpecs.unauthSpec(),
                ResponseSpecs.responseReturns200Spec(),
                Endpoint.AUTH_LOGIN)
                .post(LoginUserRequestModel.builder().username(username).password(password).build())
                .extract()
                .header("Authorization");

        authHeaders.put(username, userAuthToken);
    } else {
        userAuthToken = authHeaders.get(username);
    }

    return userAuthToken;
}

3. Использование в тестах

Соответственно в самом тесте мы сначала создаем юзера и логинимся с помощью него:

@Test
void userCanCreateAccount() {
    CreateUserRequestModel user = AdminSteps.createUser();  // создаем юзера
    authAsUser(user.getUsername(), user.getPassword());    // логинимся
    // далее уже идут шаги теста
}