在Cypress中如何在测试文件中正确使用辅助函数返回的值?
在Cypress中如何在测试文件中正确使用辅助函数返回的值?
我太懂你现在的困扰了——Cypress的异步命令链确实是新手容易踩的坑,尤其是想在辅助函数里返回值的时候,稍不注意就会触发异步同步代码混合的报错。
先给你拆解下原来代码的问题:你的schemaChecker函数里调用了cy.get()和cy.then()这些异步命令,但函数本身没有返回这个完整的异步命令链,导致测试里调用schemaChecker().then()时,拿到的根本不是可链式调用的Cypress命令对象,自然就报错了。
咱们来调整一下辅助函数,让它返回完整的Cypress命令链,这样就能在测试里正常接收返回值了:
修正后的辅助函数
// helperFunction.js module.exports.schemaChecker = () => { // 关键:返回整个Cypress命令链 return cy.get('script:contains("@context")').its('length').then((len) => { cy.task('log', 'Schemas: ' + len); if (len > 1) { return "fail"; // 这个return的值会被传递到后续的.then回调中 } // 补充默认返回值,避免无返回值的情况 return "pass"; }) }
测试文件的调用逻辑保持不变即可
import { schemaChecker } from '../../support/helperFunctions.js'; Given('I am on X page', () => { cy.viewport(1480, 1000); cy.visit(pageUrl); schemaChecker().then((response) => { if (response == "fail") { // 这里写你要执行的失败逻辑,比如断言、日志或其他操作 cy.log("检测到多个Schema,执行对应处理"); }; }) });
为啥这样改就管用呢?因为Cypress的所有命令都是异步的,每个命令都会返回一个可链式调用的命令链,只要我们让辅助函数把这个链完整返回,测试里就能通过.then()获取到链中最终返回的值。原来的代码没返回这个链,schemaChecker()本质上是undefined,自然没法调用.then()。
另外要提醒你,别想着用同步判断(比如if (schemaChecker() == "fail"))来处理——Cypress里所有和DOM交互、自带的核心命令都是异步的,必须通过.then()这类异步回调的方式来处理返回值。
备注:内容来源于stack exchange,提问作者MeltingDog
相关产品推荐
相关产品推荐

