Я тестирую страницу веб-приложения .aspx с кодом AngularJS на странице сервера Sharepoint.Мы стремимся внедрить Cypress-тестирование для нашей страницы, чтобы сократить время тестирования, но доступ к самой странице оказывается трудным, потому что Cypress должен пройти через единый вход Microsoft / Azure, чтобы попасть на страницу.У нас зарегистрировано приложение Azure, которое привязано к каталогу Sharepoint, который мы используем для аутентификации клиента Cypress.Наш текущий код отправляет cy.request к конечной точке токена в приложении Azure, прежде чем получить токен, сохранить его в текущем контексте и перенаправить в приложение страницы.Первоначальный запрос на токен работает, у нас есть правильный идентификатор клиента / арендатора и секрет клиента.Проблема в том, что когда мы пытаемся перенаправить на страницу .aspx, мы попадаем на microsoft.login / {clientID} / authorize?страница и новые вкладки открываются в цикле до истечения времени ожидания теста.
Я видел довольно много похожих проблем, связанных с прохождением единого входа Azure, и хорошо знаю, что Cypress не был разработан с учетом сторонних сайтов.Однако, учитывая настройки нашего приложения, мы не можем этого избежать.Я посмотрел на рецепты, предоставленные для стороннего единого входа, и нашел его бесполезным, потому что страница, на которую он указывает, не является страницей .aspx, как наша.Этот код был найден здесь: https://github.com/cypress-io/cypress-example-recipes/blob/master/examples/logging-in__single-sign-on/cypress/integration/logging-in-single-sign-on-spec.js
Я также видел другую страницу на Cypress GitHub об этой проблеме, но опять-таки проблема была ЗАКРЫТА, но не совсем моя, поэтому я не уверен, что просто неправильно понялпредоставленные решения, или если они не применяются здесь.Во всяком случае, это обсуждение было найдено здесь:
(Другие обсуждения, которые я нашел там тоже) - https://xebia.com/blog/how-to-use-azure-ad-single-sign-on-with-cypress/ - https://github.com/cypress-io/cypress/issues/1489 - https://github.com/cypress-io/cypress/issues/992
Я, честно говоря, чувствую, что очень близок к решению, но просто не совсем понимаю теорию, стоящую за ним, и не нашел никого с точнымта же проблема, поэтому, если кто-нибудь знает, что мне нужно сделать, чтобы перейти на страницу, чтобы проверить его, это НАДО в помощь.
import AuthenticationContext from 'adal-angular';
describe('Signing in', () => {
context('Doing stuff', function () {
it('Navigate to main site', () => {
const config = {
tenant: {tenantID},
clientSecret: {clientSecret},
clientId: {clientId},
redirectUri: 'https://{companyURL}.sharepoint.com/sites/{companyAPPDirectory}/index2.aspx',
};
const options = {
method: 'POST',
url: 'https://login.microsoftonline.com/{clientId}/oauth2/token',
qs: {
redirectTo: 'https://https://{companyURL}.sharepoint.com/sites/{companyAPPDirectory}/index2.aspx',
},
redirect_uri: 'https://{companyURL}.sharepoint.com/sites/{companyAPPDirectory}/index2.aspx',
headers: {
'cache-control': 'no-cache',
'content-type': 'multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW',
},
followRedirect: true,
form: true,
body: {
grant_type: 'password',
response_type: 'code',
client_secret: config.clientSecret,
client_id: config.clientId,
username: {username},
password: {password},
scope: 'openid',
resource: config.clientId,
},
};
const authContext = new AuthenticationContext(config);
runWithAdal(authContext, config, options);
});
});
});
var doLogin = function (authContext, config, options) {
if (
!authContext.getCachedToken(config.endpoints.api) ||
!authContext.getCachedToken(config.clientId)
) {
cy.request(options).then((response) => {
// Store the token and data in the location where adal expects it
console.log(response);
authContext._saveItem(authContext.CONSTANTS.STORAGE.IDTOKEN, response.body.access_token);
authContext._saveItem(
authContext.CONSTANTS.STORAGE.ACCESS_TOKEN_KEY + config.endpoints.api,
response.body.access_token,
);
authContext._saveItem(
authContext.CONSTANTS.STORAGE.ACCESS_TOKEN_KEY + config.clientId,
response.body.access_token,
);
authContext._saveItem(
authContext.CONSTANTS.STORAGE.EXPIRATION_KEY + config.endpoints.api,
response.body.expires_on,
);
authContext._saveItem(
authContext.CONSTANTS.STORAGE.EXPIRATION_KEY + config.clientId,
response.body.expires_on,
);
authContext._saveItem(
authContext.CONSTANTS.STORAGE.TOKEN_KEYS,
[config.clientId].join(authContext.CONSTANTS.RESOURCE_DELIMETER) +
authContext.CONSTANTS.RESOURCE_DELIMETER,
);
cy.visit('https://{companyURL}.sharepoint.com/sites/{companyAPPDirectory}/index2.aspx');
});
}
}
var runWithAdal = function (authContext, config, options) {
//it must run in iframe to for refreshToken (parsing hash and get token)
authContext.handleWindowCallback();
//prevent iframe double app !!!
if (window === window.parent || window.Cypress) {
if (!authContext.isCallback(window.location.hash)) {
if (
!authContext.getCachedToken(authContext.config.clientId) ||
(!window.Cypress && !authContext.getCachedUser())
) {
doLogin(authContext, config, options);
} else {
}
}
}
}
Мы ожидаем, что Cypress iFrame покажет страницу .aspx послеон считывает сохраненные аутентифицированные данные.
В результате вместо этого обновляется страница, а затем загружается login.microsoft/ndomclientID‹/authorize?ссылка в новых вкладках постоянно. крошечный GIF выпуска