Cypress предоставляет гибкую и расширяемую систему плагинов, которая
позволяет модифицировать стандартное поведение фреймворка, добавлять
кастомные команды, интегрироваться с внешними инструментами и
автоматизировать процессы тестирования. Плагины в Cypress создаются с
использованием Node.js и подключаются через файл конфигурации
cypress.config.js или через отдельный файл плагинов
cypress/plugins/index.js (в старых версиях Cypress до
10).
Плагин представляет собой JavaScript-файл, экспортирующий функцию,
которая принимает два аргумента: on и
config.
on — объект, позволяющий подписываться
на события Cypress (например, before:browser:launch,
task, file:preprocessor).config — объект конфигурации Cypress,
который можно модифицировать для изменения поведения тестов.Пример минимальной структуры плагина:
module.exports = (on, config) => {
// Подписка на событие запуска браузера
on('before:browser:launch', (browser = {}, launchOptions) => {
if (browser.name === 'chrome') {
launchOptions.args.push('--disable-gpu');
}
return launchOptions;
});
// Добавление кастомной задачи
on('task', {
log(message) {
console.log(message);
return null;
}
});
// Изменение конфигурации
config.baseUrl = 'https://example.com';
return config;
};
Обработка задач Node.js через task
Событие task позволяет выполнять код на стороне Node.js,
что особенно важно для операций с файловой системой, базой данных или
внешними API.
Пример:
on('task', {
readFile(filename) {
const fs = require('fs');
return fs.readFileSync(filename, 'utf8');
}
});
before:browser:launch позволяет добавлять аргументы
запуска, менять профиль браузера, включать/отключать плагины.on('before:browser:launch', (browser = {}, launchOptions) => {
if (browser.name === 'firefox') {
launchOptions.preferences['browser.startup.homepage'] = 'https://example.com';
}
return launchOptions;
});
file:preprocessor используется для
подключения собственного препроцессора:const webpack = require('@cypress/webpack-preprocessor');
on('file:preprocessor', webpack({
webpackOptions: require('../. ./webpack.config.js')
}));
Интеграция с внешними сервисами Через плагины реализуются интеграции с системами отчетности, CI/CD, базами данных, инструментами для визуального тестирования и другими внешними сервисами. Например, можно отправлять результаты тестов в Jira или Slack.
Кастомизация конфигурации Плагины позволяют динамически изменять конфигурацию тестов перед запуском, что полезно для мультиокружений или тестирования разных версий приложения.
if (process.env.NODE_ENV === 'staging') {
config.baseUrl = 'https://staging.example.com';
}
return config;
Для поддержания читаемости и масштабируемости проекта часто создают
отдельную папку cypress/plugins/tasks и разбивают код на
несколько модулей:
cypress/
└─ plugins/
├─ index.js // основной файл подключения
└─ tasks/
├─ db.js
├─ files.js
└─ reports.js
В index.js они объединяются:
const dbTasks = require('./tasks/db');
const fileTasks = require('./tasks/files');
module.exports = (on, config) => {
on('task', {
...dbTasks,
...fileTasks
});
return config;
};
Такой подход позволяет легко добавлять новые функции и не перегружать один файл плагинов.
task для операций, которые невозможно
выполнить в браузере.Система плагинов Cypress обеспечивает мощный инструмент для расширения возможностей тестирования, позволяя интегрироваться с инфраструктурой проекта, обрабатывать данные на уровне Node.js и настраивать окружение под любые потребности автоматизации.