A команда ( большинство методов для cy
объекта) - это функция, которая ставит в очередь (помещает) «действие» в очередь выполняемых в данный момент команд и выполняет serially и асинхронно (вот почему возвращаемое значение команды имеет .then
метод - при этом они не являются обещаниями , даже если они ведут себя какэто). Пока предыдущая команда не закончена, следующая команда не выполняется.
Команды определяются и выполняются непосредственно в браузере (но они могут отправлять сообщения вне браузера, для этого cy.task
, см. Ниже).
A customКоманда - это не более чем обычная команда, определяемая пользователем, в отличие от команд по умолчанию, которые Cypress предоставляет из коробки. Пользовательские команды полезны для автоматизации рабочего процесса, который вы повторяете в своих тестах снова и снова (например, группирование нескольких команд cy по умолчанию).
Команды используются для взаимодействия с тестируемым веб-приложением (AUT) - главным образомс DOM, например, через cy.get(selector)
для запроса DOM;и делать утверждения.
Также важно понимать, что, хотя команды выполняются последовательно, они сразу ставятся в очередь, и любые выражения, которые вы передаете им, оцениваются тут же. Это не специфичное для Cypress поведение, а специфичное для JavaScript поведение. Вот почему вы не можете делать такие вещи (я часто видел эти ошибки):
let value;
cy.get('.myInput').invoke('val').then(val => value = val);
cy.get('.mySecondInput').type(value); // value is undefined here
A task - это функция, определенная и выполненная вВнутренний процесс Cypress (узел), а не в браузере.
Чтобы выполнить задачу (которую вы ранее определили в файле cypress/plugins/index.js
), вам нужно сначала поставить ее в очередь как обычную команду в своем тесте через cy.task(taskName, data)
. Затем Cypress (когда команда выполняет свою очередь на выполнение) отправляет сообщение бэкэнд-процессу (через канал IPC - объяснено ниже), где задача выполняется.
Если ваша задача возвращает данные, этоданные сериализуются (через JSON.stringify
или что-то подобное) и отправляются обратно в браузер, где они передаются обратному вызову, который вы потенциально прикованы к вашему cy.task()
вызову, используя .then(callback)
.
В основном используются задачиобщаться с вашим собственным серверным бэкэндом, например, для заполнения базы данных;или для операций ввода-вывода, таких как чтение / запись в файл.
Насколько я знаю, нет заданий по умолчанию - каждую выполняемую задачу сначала нужно определить самостоятельно.
Другим важным моментом (как частично упомянуто выше) является то, что сообщения, которые отправляются между процессами (процесс браузера Cypress и процесс узла Cypress), отправляются через межпроцессное взаимодействие (IPC) и должны быть сериализуемыми. Это означает, что данные, которые вы передаете в cy.task(taskName, data)
, являются строковыми, а также ответом, возвращаемым самой задачей. Таким образом, отправка, например, объекта, содержащего метод, не будет работать (то есть метод вообще не будет передан).