1

我正在使用 cypress 为我的 UI 编写 E2E 测试(请注意,它是 PowerBI 报告,因此是一种特殊情况)。当我使用公开报告进行测试时,它工作正常。但是当它是私人 PBI 报告时,我在登录部分遇到问题。经过一番研究,我发现这种方法对基于 Azure AD 的身份验证很有前景,并在我的 commands.js 文件中添加了这个登录功能:

Cypress.Commands.add('login', () => { 
    cy.request({
        method: 'POST',
        url: 'https://login.microsoftonline.com/{TENANT}/oauth2/token',
        form: true,
        body: {
            grant_type: 'client_credentials',
            client_id: CLIENT_ID,
            client_secret: CLIENT_SECRET,
            // resource: RESOURCE
        },
        header: {
            'Content-Type': 'multipart/form-data'
        }
    }).then((responseData) => {
        if (responseData.status === 200) {
            window.sessionStorage.setItem("adal.idtoken", responseData.body.access_token);
            window.sessionStorage.setItem("adal.token.keys", CLIENT_ID + "|")
            window.sessionStorage.setItem(`adal.expiration.key${CLIENT_ID}`, responseData.body.expires_on)
            window.sessionStorage.setItem(`adal.access.token.key${CLIENT_ID}`, responseData.body.access_token)
        } else {
            console.log("error retrieving token")
        }
    })
})

请注意,客户端 ID 和密码是正确的,并且有权访问 powerbi 报告。我还测试了生成的令牌和 sessionStorage 变量,似乎都正确分配了。现在,在我的测试中:

describe("E2E Tests", () => {
    beforeEach(() => {
        cy.login();
    })
    it("Sample Test 1", () => {
        cy.visit("https://powerbi-report-url.com");
        //...
    });
})

而且我在 cypress 测试运行程序中看到,即使在 beforeEach 中调用了 login,但在访问 powerbi 报告时,它仍然重定向到https://login.microsoftonline.com url,并使用不同的客户端 ID 作为查询参数,并且由于 powerbi 报告的超级域和重定向的 url 不同,它会给出chrome-error://chromewebdata错误(我猜这就是原因)。因此想知道,如何在 azure ad auth 支持的 cypress 测试中登录网站。

此外,可能不相关,但在控制台中看到另一个错误:

Refused to display 'https://powerbi-report-url.com' in a frame because it set 'X-Frame-Options' to 'deny'.

编辑 1:切换到 Edge 不会出现 chrome webdata 错误,但对 URL 的 cy.visit 仍然会超时并给出 HTTP 431 错误(请求标头太长)并且无法进行身份验证。

编辑2(有关身份验证错误的更多详细信息):在使用客户端凭据生成令牌时,我正在获取令牌,并看到它存储在会话存储中,但是赛普拉斯测试没有选择相同的令牌来授权访问 PowerBI 报告. 因此,基本上即使存在 cookie 来验证请求,对 Power BI 访问的请求仍会重定向到 login.microsoftonline.com/common/oauth2/authorize?client_id={与我在上述 POST 中使用的不同的客户端 ID称呼}

鉴于,在使用用户名/密码时;收到此错误:“错误”:“interaction_required”,“error_description”:“AADSTS50079:由于管理员进行了配置更改,或者因为您移动到新位置,您必须注册多重身份验证才能访问“error_codes “:[50079]

4

1 回答 1

2

目前(20 年 4 月 17 日),这可能与赛普拉斯团队的未解决问题有关:https ://github.com/cypress-io/cypress/issues/4220

特别是对我来说,我曾经有一个超级域在以前的版本 4.3.0 中出现此错误,但现在使用 4.4.0,我得到更多域具有相同的问题。

当前解决方法:回滚到以前的版本并通过 Edge(无论如何基于 Chromium)运行。

于 2020-04-17T00:29:19.817 回答