command(全局cy 对象上的大多数方法)是一个函数,它将一个动作排入(推送)到当前正在执行的命令队列中。队列执行串行和异步(这就是为什么命令的返回值是一个具有.then方法的对象——但尽管如此,而且它的行为就像promise ,它是not a promise)。在上一个命令完成之前,下一个命令不会执行。
命令直接在浏览器中定义和执行。
custom command 是常规命令,但由您定义,而不是赛普拉斯 supplies out of the box 的默认命令。自定义命令对于自动化您在测试中一遍又一遍地重复的工作流程很有用(例如,通过将几个默认的 cy 命令组合在一起)。
命令用于与您的被测网络应用 (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);
任务是在 Cypress 后端进程 (Node.js) 上定义和执行的函数,而不是在浏览器中。
要执行一个任务(您之前在cypress/plugins/index.js 文件中定义),您需要首先通过cy.task(taskName, data) 将其作为常规命令加入到您的测试中。然后赛普拉斯(当命令轮到执行时)向执行任务的后端进程发送一条消息。
您的任务返回的数据被序列化(通过JSON.stringify 或类似的东西)并发送回浏览器,在那里它被传递给您可能使用.then(callback) 链接到您的cy.task() 命令的回调。
任务主要用于与您自己的服务器后端进行通信,例如为数据库播种;或用于 I/O,例如读取/写入文件(尽管 cypress 为这些提供命令,例如 cy.exec() 或 cy.writeFile())。
没有默认任务 --- 您执行的每个任务首先需要定义自己。
另一个重要的一点是,在进程(赛普拉斯浏览器进程和赛普拉斯节点进程)之间发送的消息是通过IPC channel 发送的,并且必须是可序列化的。这意味着您传递给cy.task(taskName, data) 的数据以及从任务本身返回的响应都是字符串化的。因此,发送例如包含方法的对象将不起作用(即根本不会转移方法)。