我是 Cypress 的新手,已经在自己的文件中设置了一堆辅助函数。我希望其中一个函数返回一个值,但是我一直不知道如何在 Cypress 的同步结构中执行此操作。
我不断收到错误消息
CypressError:
失败,因为您混淆了异步和同步代码。cy.then()
我尝试实现此处提到的类似修复Cypress 在异步命令中返回同步值?但无济于事。
我的代码是这样的:
辅助功能:
//helperFunction.js
module.exports.schemaChecker = () => {
cy.get('script:contains("@context")').its('length').then((len) => {
cy.task('log', 'Schemas: ' + len);
if (len > 1) {
return "fail";
}
})
}
测试文件:
import { schemaChecker, } from '../../support/helperFunctions.js';
// other stuff...
Given('I am on X page', () => {
cy.viewport(1480, 1000);
cy.visit(pageUrl);
schemaChecker().then((response) => {
if (response == "fail") {
// Do something
};
})
});
我已经尝试了一些变体(例如:
if (schemaChecker() == "fail") {}
),但我只是不确定如何使其协同工作,并且无法在Google上找到任何有用的东西。
有人能指出我正确的方向吗?
错误您混淆了异步和同步代码指的是
cy.task()
调用(异步)和return 'fail';
(同步)。
module.exports.schemaChecker = () => {
return cy.get('script:contains("@context")').its('length').then((len) => {
cy.task('log', 'Schemas: ' + len); // <-- async
if (len > 1) {
return 'fail' // <-- sync
}
})
}
解决方法之一是使这两个步骤异步
module.exports.schemaChecker = () => {
return cy.get('script:contains("@context")').its('length').then((len) => {
cy.task('log', 'Schemas: ' + len); // <-- async
if (len > 1) {
return cy.wrap('fail') // <-- also async
}
})
}
这是我的测试
it('check the schema', () => {
schemaChecker().then((response) => {
if (response === 'fail') {
Cypress.log({name: 'schema error', message: 'Woops it failed'})
};
})
})
以及我的应用程序页面存在故意错误情况
<body>
<script>
const var1 = '@context'
</script>
<script>
const var2 = '@context'
</script>
</body>