首页 > 解决方案 > 在赛普拉斯中,何时使用自定义命令与任务?

问题描述

自定义命令和任务有什么区别?我试图了解它们应该如何使用。

自定义命令文档:https ://docs.cypress.io/api/cypress-api/custom-commands.html

任务文档:https ://docs.cypress.io/api/commands/task.html

标签: cypress

解决方案


命令(全局对象上的大多数方法)cy是一个函数,它将一个动作排入(推​​送)到当前正在执行的命令队列中。队列以串行异步方式执行(这就是为什么命令的返回值是一个具有.then方法的对象 --- 但尽管如此,而且它的行为类似于承诺,但它不是承诺)。在上一个命令完成之前,下一个命令不会执行。

命令直接在浏览器中定义和执行。

定义命令是常规命令,但由您定义,而不是赛普拉斯提供的开箱即用的默认命令。自定义命令对于自动化您在测试中一遍又一遍地重复的工作流程很有用(例如,通过将几个默认cy命令组合在一起)。

命令用于与您的被测 Web 应用程序 (AUT) 进行交互——尤其是与 DOM(例如通过cy.get(selector)查询 DOM)进行交互,并进行断言。

同样重要的是要意识到,虽然命令是串行执行的,但它们会立即入队(在同一个事件循环滴答中),并且您传递给它们的任何表达式都会在当时和那里进行评估。这不是赛普拉斯特有的行为,只是普通的 JavaScript。这就是为什么你不能做这样的事情:

// INCORRECT USAGE
let value;
cy.get('.myInput').invoke('val').then(val => value = val);
cy.get('.mySecondInput').type(value); // ✗ value is undefined here

你也不能使用async/await

// INCORRECT USAGE
let value;
// ✗ doesn't work on Cypress commands
const value = await cy.get('.myInput').invoke('val');
cy.get('.mySecondInput').type(value); 

任务是在赛普拉斯后端进程 (Node.js) 上定义和执行的函数,而不是在浏览器中。

要执行任务(您之前在cypress/plugins/index.js文件中定义),您需要首先将其作为常规命令通过cy.task(taskName, data). 然后赛普拉斯(当命令轮到执行时)向执行任务的后端进程发送一条消息。

您的任务返回的数据被序列化(通过JSON.stringify或类似的方式)并发送回浏览器,在浏览器中它被传递给您可能使用链接到您的cy.task()命令的回调.then(callback)

任务主要用于与您自己的服务器后端通信,例如为数据库播种;或用于 I/O,例如读取/写入文件(尽管 cypress 为这些提供命令,例如cy.exec()or cy.writeFile())。

没有默认任务 --- 您执行的每个任务首先需要定义自己。

另一个重要的一点是,进程(Cypress 浏览器进程和 Cypress 节点进程)之间发送的消息是通过IPC 通道发送的,并且必须是可序列化的。这意味着您传递给的数据cy.task(taskName, data)以及从任务本身返回的响应都是字符串化的。因此,发送例如包含方法的对象将不起作用(也就是说,根本不会传输该方法)。


推荐阅读