自定义命令和任务有什么区别?我试图了解它们应该如何使用。
自定义命令文档:https : //docs.cypress.io/api/cypress-api/custom-commands.html
dwe*_*lle 33
甲命令(全局上大多数方法cy对象)是一个函数,入列(推压)的作用,以当前正在执行的命令的队列。队列以串行和异步方式执行(这就是为什么命令的返回值是一个具有.then方法的对象的原因——但尽管如此,而且它的行为类似于 promise,但它不是 promise)。在上一个命令完成之前,下一个命令不会执行。
命令直接在浏览器中定义和执行。
一个自定义命令是一个普通的命令,但定义由你,而不是赛普拉斯默认命令提供的开箱即用。自定义命令对于自动化您在测试中反复重复的工作流很有用(例如,通过将几个默认cy命令组合在一起)。
命令用于与您的被测 Web 应用程序 (AUT) 交互——最显着的是与 DOM(例如通过cy.get(selector)查询 DOM)以及进行断言。
同样重要的是要意识到,当命令被串行执行时,它们会立即入队(在同一个事件循环滴答中),并且您传递给它们的任何表达式都会在那时和那里进行评估。这不是 Cypress 特定的行为,只是普通的 JavaScript。这就是为什么你不能做这样的事情:
// INCORRECT USAGE
let value;
cy.get('.myInput').invoke('val').then(val => value = val);
cy.get('.mySecondInput').type(value); // ? value is undefined here
Run Code Online (Sandbox Code Playgroud)
你也不能使用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);
Run Code Online (Sandbox Code Playgroud)
甲任务是定义和执行对赛普拉斯后端处理(Node.js的)的函数,而不是在浏览器中。
要执行任务(您之前在cypress/plugins/index.js文件中定义),您需要首先通过cy.task(taskName, data). 然后赛普拉斯(当命令轮到它执行时)向执行任务的后端进程发送一条消息。
你的任务返回的数据被序列化(通过JSON.stringify或类似的东西)并发送回浏览器,在那里它被传递给一个回调,你可能cy.task()使用.then(callback).
任务主要用于与您自己的服务器后端通信,例如为数据库做种子;或用于 I/O,例如读取/写入文件(尽管 cypress 提供了诸如cy.exec()或 之类的命令cy.writeFile())。
没有默认任务 --- 您执行的每个任务首先需要定义自己。
另一个重要的一点是,进程(Cypress 浏览器进程和 Cypress 节点进程)之间发送的消息是通过IPC 通道发送的,并且必须是可序列化的。这意味着您传递给的数据cy.task(taskName, data)以及从任务本身返回的响应都是字符串化的。因此,发送例如包含方法的对象将不起作用(即,根本不会传输该方法)。
| 归档时间: |
|
| 查看次数: |
4688 次 |
| 最近记录: |