




Вот пример добавления команды cy.login(), которую вы можете использовать в любом тесте Cypress или вставить в ловушку beforeEach.
Cypress.Commands.add('login', () => {
cy.request({
method: 'POST',
url: 'http://localhost:3000/api/users/login',
body: {
user: {
email: '[email protected]',
password: 'jakejake',
}
}
})
.then((resp) => {
window.localStorage.setItem('jwt', resp.body.user.token)
})
})
Тогда в вашем тесте:
beforeEach(() => {
cy.login()
})
Вам необходимо перейти на свою страницу, прежде чем устанавливать localStorage.
Я потратил на это так много часов и, наконец, могу с уверенностью заключить, что это никогда не будет работать для запросов OAuth.
Это может работать для локального сервера, но не когда вы получаете токен для аутентификации.
Lol xD - нет ничего невозможного
Вы можете сделать запрос на получение требуемых данных у поставщика OAuth.
В качестве дополнения вы также можете использовать пакет cypress-localstorage-команды для сохранения localStorage между тестами, поэтому запрос на вход будет выполнен только один раз:
В support / commands.js:
import "cypress-localstorage-commands";
Cypress.Commands.add('login', () => {
cy.request({
method: 'POST',
url: 'http://localhost:3000/api/users/login',
body: {
user: {
email: '[email protected]',
password: 'jakejake',
}
}
})
.its('body')
.then(body => {
cy.setLocalStorage("jwt", body.user.token);
})
});
Затем в ваших тестах:
before(() => {
cy.login();
cy.saveLocalStorage();
});
beforeEach(() => {
cy.restoreLocalStorage();
});
Работал только у меня с указанным вами пакетом. Спасибо
Согласно документации по npm, вы должны очистить хранилище на before(), затем в beforeEach выполнить восстановление и посетить, затем afterEach сохранить локальное хранилище. Note the usage of beforeEach and afterEach for preserving localStorage between all tests. Also clearLocalStorageSnapshot is used in the before statement to avoid possible conflicts with other test files preserving localStorage.
Я уже некоторое время использовал что-то вроде ответа bkuceras. Недавно я столкнулся с проблемой при тестировании нескольких ролей / логинов во время тестов. В основном происходит то, что я вхожу в систему как администратор и провожу один тест, затем я вхожу в систему как не администратор и провожу второй тест. Первый тест проходит нормально и завершается (cypress очищает локальное хранилище), однако при запуске второго теста все еще выполняются некоторые xhr-запросы. Эти запросы xhr больше не видят токен, который запускает мое приложение, чтобы увидеть несанкционированную ошибку 401 и очистить локальное хранилище (включая мой токен, не являющийся администратором, который я установил). Теперь второй тест не проходит, потому что этот токен без администратора недоступен в локальном хранилище.
В конечном итоге мое решение заключалось в том, чтобы предварительно получить токен перед тестом, а затем установить токен в функции onBeforeLoad посещения. Это гарантирует, что токен не будет очищен каким-либо условием гонки до вашей команды посещения.
cy.visit('/app', {
onBeforeLoad: function (window) {
window.localStorage.setItem('token', myToken);
}
})
На самом деле это довольно уникальный крайний случай, но он надеется, что он может кому-то помочь, поскольку я потратил много часов на поиск этого решения.
Я думаю, что название этой темы следует обновить. Токен JWT является основным предметом обсуждения!
Главный вопрос касался токена JWT, но в целом все современные приложения используют OIDC Статья Microsoft - v2-протоколы-oidc / АДАЛ, и здесь очень сложная ситуация, чтобы получить доступ, просто генерируя токены с помощью вызова API.
Я нашел здесь, который
и проверим это с помощью моего приложения. Но будьте уверены, что вы хорошо разбираетесь в JS и получаете хорошую помощь от вашей DevTeam;)
Это работает, но значение перезаписывается, когда я посещаю URL-адрес приложения. Мое приложение не может прочитать созданное локальное хранилище.