使用赛普拉斯的 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的主要内容,如果未能解决你的问题,请参考以下文章