Работа с формами — одна из ключевых задач автоматизированного тестирования веб-приложений. WebdriverIO предоставляет гибкие методы для взаимодействия с элементами форм, заполнения полей и проверки результатов отправки.
Для работы с формой необходимо корректно идентифицировать её элементы. В WebdriverIO поддерживаются различные стратегии поиска:
const usernameInput = $('#username');
const passwordInput = $('input[name="password"]');
const submitButton = $('//button[text()="Войти"]');
const emailInput = $('.email-field');
const newsletterCheckbox = $('[type="checkbox"][name="newsletter"]');
Выбор стратегии зависит от стабильности селекторов на странице и их уникальности.
Для ввода текста в поля используется метод setValue или
addValue:
usernameInput.setValue('testuser');
passwordInput.setValue('P@ssw0rd!');
setValue очищает поле перед вводом.addValue добавляет текст к существующему
содержимому.Для выбора значений в выпадающих списках
(<select>) используется метод
selectByVisibleText, selectByAttribute или
selectByIndex:
const countrySelect = $('#country');
countrySelect.selectByVisibleText('Россия');
countrySelect.selectByAttribute('value', 'RU');
countrySelect.selectByIndex(1); // выбирает второй элемент
Для работы с флажками (checkbox) и переключателями
(radio) применяются методы click и проверка
состояния через isSelected:
const agreeCheckbox = $('#agree');
if (!agreeCheckbox.isSelected()) {
agreeCheckbox.click();
}
После заполнения всех полей форма отправляется кнопкой submit. Существуют два подхода:
const submitButton = $('button[type="submit"]');
submitButton.click();
submitForm у формы:const form = $('#loginForm');
form.submitForm();
Метод submitForm особенно полезен, когда кнопка submit
динамически изменяется или отсутствует.
После отправки формы необходимо убедиться, что действие выполнено корректно. Основные подходы:
const successMessage = $('#successMessage');
expect(successMessage).toBeDisplayed();
expect(successMessage).toHaveTextContaining('Успешно');
expect(browser).toHaveUrlContaining('/dashboard');
const logoutButton = $('#logout');
expect(logoutButton).toBeClickable();
WebdriverIO по умолчанию поддерживает синхронный и асинхронный режим.
При асинхронной работе необходимо использовать await для
всех действий:
await usernameInput.setValue('testuser');
await passwordInput.setValue('P@ssw0rd!');
await submitButton.click();
await expect(successMessage).toBeDisplayed();
Использование waitFor методов помогает обрабатывать
динамически загружаемые элементы:
await successMessage.waitForDisplayed({ timeout: 5000 });
Для форм с множеством полей и вложенными элементами рекомендуется разделять действия на логические блоки:
// Личный блок
await $('#firstName').setValue('Иван');
await $('#lastName').setValue('Иванов');
// Контактный блок
await $('#email').setValue('ivan@example.com');
await $('#phone').setValue('+79991234567');
// Настройки
const subscribe = $('#subscribe');
if (!await subscribe.isSelected()) {
await subscribe.click();
}
// Отправка формы
await $('#registrationForm').submitForm();
Такой подход повышает читаемость теста и упрощает поддержку при изменении структуры страницы.
WebdriverIO позволяет ловить ошибки и проверять валидацию:
await $('#submit').click();
const errorMessages = await $$('.error-message');
for (const error of errorMessages) {
console.log(await error.getText());
}
Проверка сообщений об ошибке необходима для тестирования негативных сценариев, таких как пустые поля или некорректный формат данных.
Для форм с автодополнением, календарями и слайдерами важно использовать методы взаимодействия с UI:
// Календарь
await $('#birthDate').click();
await $('//td[text()="15"]').click();
// Слайдер
const slider = $('#volume');
await slider.dragAndDrop({ x: 50, y: 0 });
Подобные действия требуют точной работы с локаторами и контроля времени ожидания.
Для больших форм рекомендуется использовать Page Object модель, где каждый блок формы выделяется как отдельный метод или класс:
class LoginForm {
get username() { return $('#username'); }
get password() { return $('#password'); }
get submit() { return $('button[type="submit"]'); }
async login(user, pass) {
await this.username.setValue(user);
await this.password.setValue(pass);
await this.submit.click();
}
}
Такой подход упрощает поддержку тестов при изменении структуры формы и делает код более читаемым.
Заполнение и отправка форм с WebdriverIO требует сочетания точных
локаторов, управления асинхронностью и проверки результатов.
Использование методов setValue, click,
submitForm и Page Object паттерна позволяет создавать
надежные и масштабируемые автоматизированные тесты.