В UI-тестах часто возникает необходимость авторизации пользователя. Вместо медленного и нестабильного процесса ввода логина/пароля через веб-интерфейс, можно использовать API для получения токена и установки его в браузер через JavaScript. Это значительно ускоряет и стабилизирует тесты.
В 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);
}
Метод 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;
}
Соответственно в самом тесте мы сначала создаем юзера и логинимся с помощью него:
@Test
void userCanCreateAccount() {
CreateUserRequestModel user = AdminSteps.createUser(); // создаем юзера
authAsUser(user.getUsername(), user.getPassword()); // логинимся
// далее уже идут шаги теста
}