使用赛普拉斯的 e2e 测试中的身份验证错误:chrome-error://chromewebdata

Posted

技术标签:

【中文标题】使用赛普拉斯的 e2e 测试中的身份验证错误:chrome-error://chromewebdata【英文标题】:Error with authentication in e2e tests using cypress: chrome-error://chromewebdata 【发布时间】:2020-07-30 06:21:06 【问题描述】:

我正在使用 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:由于管理员进行了配置更改,或者因为您移动到了新位置,您必须注册多重身份验证才能访问 “错误代码”:[50079]

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

感谢@ebanster 的建议。现在切换到 Edge 后,我没有收到 chrome webdata 错误。但是当我访问主 URL 时,它会重定向到登录身份验证 URL,并给出超时错误。您知道为什么它没有获取 sessionStorage 凭据(在 cy.login() 步骤中设置)来验证请求吗?另外,当我检查cookie“cypress-session-cookie”时,它是空的。 在命令起作用之前看看是否包含这个:cy.clearCookies( domain: null ) 访问测试 URL 时出现错误:加载资源失败:服务器响应状态为 431(请求标头字段太大) 您可以尝试清除赛普拉斯应用数据吗? docs.cypress.io/guides/references/…

以上是关于使用赛普拉斯的 e2e 测试中的身份验证错误:chrome-error://chromewebdata的主要内容,如果未能解决你的问题,请参考以下文章

如何检查在赛普拉斯 e2e 测试中元素是不是永远不可见?

如何在赛普拉斯 e2e 测试之前设置 NGRX 状态?

如何使用赛普拉斯测试文件输入?

无法使用赛普拉斯发送 POST 登录请求

未捕获的错误:useNavigate() 只能在赛普拉斯单元测试用例中的 <Router> 组件的上下文中使用

如何验证赛普拉斯中的悬停文本(工具提示)?