Как проверить страницу .aspx на Sharepoint с помощью Cypress - PullRequest
1 голос
/ 24 июня 2019

Я тестирую страницу веб-приложения .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 выпуска

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...