我正在测试在SharePoint服务器页面上运行AngularJS代码的.aspx Web应用程序页面。我们正在寻求对页面进行赛普拉斯测试,以减少测试时间,但是事实证明,访问页面本身非常困难,因为赛普拉斯需要通过Microsoft / Azure的SSO才能访问页面。我们已经注册了一个与Sharepoint目录绑定的Azure应用程序,我们正在使用该应用程序对Cypress客户端进行身份验证。 我们的当前代码在获取令牌,将其保存到当前上下文并重定向到页面应用程序之前,对azure应用程序上的令牌端点进行cy.request。初始请求令牌有效,我们拥有正确的客户端/租户ID和客户端密钥。问题在于,当我们尝试重定向到.aspx页面时,将被带到microsoft.login / {clientID} / authorize?页面和新选项卡将循环打开,直到测试超时。
关于通过Azure的SSO,我已经看到很多类似的问题,并且我很清楚赛普拉斯在设计时就没有考虑第三方站点。但是,考虑到我们应用程序的设置,我们确实无法避免它。我查看了为第三方SSO提供的食谱,发现它无济于事,因为它定向到的页面不同于我们的.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上看到了有关此问题的另一页,但问题仍然是CLOSE,但并非完全属于我,因此我不确定是否只是误解了所提供的解决方案,或者它们是否不适用于此处。无论如何,在这里找到了讨论:
(我也在那找到了其他讨论) -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/{clientID}/authorize?连续链接到新标签页。 A tiny GIF of the issue