WebdriverIO предоставляет мощную основу для автоматизации браузерных тестов, но в процессе разработки тестов часто возникает необходимость использовать вспомогательные функции, чтобы улучшить читабельность, повторно использовать код и сделать тесты более гибкими. В этой главе рассматривается, как создавать утилиты и хелперы, которые будут поддерживать общие операции и облегчать работу с тестами.
Утилиты и хелперы — это вспомогательные функции или модули, которые упрощают и ускоряют процесс разработки тестов. Они могут выполнять задачи, которые часто повторяются, такие как взаимодействие с элементами на странице, обработка ошибок или выполнение операций, которые используются в нескольких тестах.
Часто утилиты используются для:
Хелперы же, как правило, служат для абстрагирования более сложных операций, например, взаимодействия с элементами в модальных окнах или подтверждения действий.
Для эффективной организации кода тестов и утилит, важно придерживаться разумной структуры проекта. В типичной структуре проекта WebdriverIO может быть отдельная папка для утилит и хелперов, например:
project/
│
├── tests/
│ ├── exampleTest.js
│ └── anotherTest.js
│
├── helpers/
│ ├── formHelper.js
│ ├── apiHelper.js
│ └── uiHelper.js
│
├── utils/
│ ├── randomData.js
│ ├── logger.js
│ └── waitUtils.js
└── wdio.conf.js
В данном примере папка helpers содержит логику
взаимодействия с интерфейсами пользователя или API, а папка
utils включает утилитарные функции для обработки данных,
логирования или ожидания.
waitForExist и
waitForDisplayed могут быть полезны, но можно создать
обёртку для упрощения этих операций.// utils/waitUtils.js
/**
* Ожидание появления элемента на странице
* @param {string} selector - Селектор элемента
* @param {number} timeout - Время ожидания в миллисекундах
*/
function waitForElement(selector, timeout = 5000) {
const element = $(selector);
element.waitForExist({ timeout });
return element;
}
module.exports = { waitForElement };
Теперь в тестах можно просто вызывать waitForElement,
сокращая повторение кода:
const { waitForElement } = require('../utils/waitUtils');
describe('Тестирование формы', () => {
it('должен показывать сообщение об ошибке, если поле пустое', () => {
waitForElement('.form-submit').click();
// Дополнительные проверки
});
});
// utils/randomData.js
/**
* Генерация случайного имени
* @returns {string} Случайное имя
*/
function randomName() {
const names = ['Иван', 'Алексей', 'Мария', 'Светлана'];
return names[Math.floor(Math.random() * names.length)];
}
/**
* Генерация случайного email
* @returns {string} Случайный email
*/
function randomEmail() {
const domains = ['example.com', 'test.com', 'email.com'];
return `${randomName().toLowerCase()}@${domains[Math.floor(Math.random() * domains.length)]}`;
}
module.exports = { randomName, randomEmail };
Эти функции позволяют автоматически генерировать данные для тестов, что полезно при необходимости тестировать формы с уникальными значениями.
// utils/logger.js
const fs = require('fs');
const path = require('path');
/**
* Логирование ошибок в файл
* @param {string} errorMessage - Сообщение об ошибке
*/
function logError(errorMessage) {
const logFile = path.resolve(__dirname, 'error.log');
const logMessage = `${new Date().toISOString()} - ${errorMessage}\n`;
fs.appendFileSync(logFile, logMessage);
}
module.exports = { logError };
Эта утилита позволяет записывать ошибки в лог-файл, что полезно для дальнейшего анализа причин сбоев в тестах.
Хелперы обычно выполняют более сложные операции, чем утилиты. Они могут взаимодействовать с веб-страницей, формировать запросы к API или абстрагировать сложные проверки. Например, если требуется повторно использовать код для работы с формами, можно создать хелпер для их обработки.
// helpers/formHelper.js
/**
* Заполнение текстового поля формы
* @param {string} selector - Селектор текстового поля
* @param {string} text - Текст для ввода
*/
function fillTextField(selector, text) {
const field = $(selector);
field.setValue(text);
}
/**
* Отправка формы
* @param {string} selector - Селектор кнопки отправки
*/
function submitForm(selector) {
const submitButton = $(selector);
submitButton.click();
}
module.exports = { fillTextField, submitForm };
С помощью этого хелпера тесты можно сделать более читаемыми и легче поддерживаемыми:
const { fillTextField, submitForm } = require('../helpers/formHelper');
describe('Тестирование формы регистрации', () => {
it('должен успешно отправить форму', () => {
fillTextField('#username', 'testuser');
fillTextField('#password', 'password123');
submitForm('#submit');
});
});
Одной из сильных сторон WebdriverIO является возможность параллельного выполнения тестов. Для оптимизации работы с параллельными тестами полезно создавать вспомогательные функции, которые могут быть использованы в разных потоках.
Для параллельного выполнения можно использовать различные библиотеки
и возможности самого WebdriverIO, такие как “multiCapabilities” в
конфигурации wdio.conf.js, а также интеграцию с сервисами,
например, Sauce Labs или BrowserStack.
Создание утилит и хелперов помогает значительно улучшить структуру тестов, сделать их более читаемыми и лёгкими для поддержания. Важно продумывать структуру и разделение логики между утилитами, хелперами и тестами, чтобы код был гибким и повторно используемым. Эффективное использование вспомогательных функций позволяет ускорить процесс тестирования и устранить дублирование кода, что повышает качество автоматизированных тестов.