Javascript Cypress函数随机超时“;从未解决的承诺。”;
我正在覆盖visit命令,以便在需要身份验证的QA环境上运行测试。大多数情况下,它工作正常,但有时会失败 cy.then()在等待4000毫秒后超时 您的回调函数返回了一个从未解决的承诺 我的职能是:Javascript Cypress函数随机超时“;从未解决的承诺。”;,javascript,authentication,cypress,Javascript,Authentication,Cypress,我正在覆盖visit命令,以便在需要身份验证的QA环境上运行测试。大多数情况下,它工作正常,但有时会失败 cy.then()在等待4000毫秒后超时 您的回调函数返回了一个从未解决的承诺 我的职能是: Cypress.Commands.overwrite("visit", (originalFn, url, options) => { // Read the auth details from accounts.json cy.fixture("acc
Cypress.Commands.overwrite("visit", (originalFn, url, options) => {
// Read the auth details from accounts.json
cy.fixture("accounts").then((account) => {
const username = account.auth_username;
const password = account.auth_password;
const authenticatedOptions = {
...options,
auth: { username, password },
failOnStatusCode: false,
};
return originalFn(url, authenticatedOptions);
});
});
我是不是做错了什么,把它弄得一团糟了?覆盖命令可能有点狡猾,调用
originalFn()
时的行为并不总是与作为命令调用时的行为相同,例如cy.visit()
失败可能是因为访问失败(即调用originalFn(url,authenticatedOptions)
由于某种原因失败)。但是originalFn()
返回一个承诺,失败时应该拒绝,但事实并非如此
当你调用一个错误的URL时,说cy.visit('http://example-not-valid.com“)
,没有覆盖Cypress会给您一个相当不错的消息。有了覆盖,这只是一个未解决的承诺
您可以使用composition并添加新命令
Cypress.Commands.add("visitWithAuthentication", (url, options) => {
cy.fixture("accounts").then((account) => {
const username = account.auth_username;
const password = account.auth_password;
const authenticatedOptions = {
...options,
auth: { username, password },
failOnStatusCode: false,
};
cy.visit(url, authenticatedOptions);
});
});
这将为您提供正确的信息,但在从开发环境切换到QA环境时可能不方便。此功能的目的是什么?它正在返回
originalFn
的结果,但随后cy.fixture
返回值未被使用?authenticatedOptions被传递到originalFn,它包含站点访问时要求的身份验证用户名和密码。它正在这样做,但不是每次调用visit时都传递它,而是覆盖函数以自动执行。cypress如何知道承诺何时完成?这可能就是它超时的原因我不确定,根据文档,它在调用时不应该超时。有一点看起来很可疑,那就是您从回调返回。然后()
回调,但您不会从覆盖回调返回该承诺,所以visit
不会知道它应该等待fixture。