本节用来记录Cypress.Commands命令自定义方法时同步异步的解决方法
在Cypress中,自定义命令(Cypress.Commands.add
)的实现应当始终返回一个可被链式调用的对象或Promise。
本人刚开始使用的代码如下:
执行后出现如下报错:
cy.then() failed because you are mixing up async and sync code.
In your callback function you invoked 1 or more cy commands but then returned a synchronous value.
Cypress commands are asynchronous and it doesn't make sense to queue cy commands and yet return a synchronous value.
You likely forgot to properly chain the cy commands using another cy.then().
报错的原因就是因为在Cypress中,所有的命令都是异步的,并且它们会按照队列的方式执行。当你在一个.then()
回调函数内部调用一个或多个Cypress命令(如cy.get()
, cy.wait()
, 等等),但同时又返回一个同步值时 就会在.then((response)=>)这句出现上面的错误
解决方法:
在.then((response)=>)后获取的数据依然要进行异步包装才能保证符合cypress的同步异步策略
修改代码如下:
在response中需要返回的数据通过Promise来封装一个异步返回。
或者通过cy.wrap(cy.wrap()
方法可以用来将任何值转化为一个可被Cypress队列处理的对象)方法来进行一个异步返回
在测试用例中调用时,无论是手动写Promise还是用cy.wrap调用方法都不变