Чекбоксы — один из базовых элементов веб-форм, и их корректная обработка критически важна для автоматизированного тестирования интерфейсов. В Protractor взаимодействие с чекбоксами осуществляется через объекты ElementFinder и встроенные методы управления состоянием элементов.
Основные способы поиска чекбоксов:
// По CSS-селектору
let checkbox = element(by.css('input[type="checkbox"]'));
// По id
let checkboxById = element(by.id('agree'));
// По имени
let checkboxByName = element(by.name('subscription'));
// По тексту лейбла через xpath
let checkboxByLabel = element(by.xpath('//label[text()="Подписка"]/input'));
Использование element и локаторов
by.css, by.id, by.name,
by.xpath позволяет гибко выбирать нужный элемент. Важно
помнить, что чекбокс может быть вложен в <label>,
поэтому иногда удобнее искать лейбл и получать вложенный
input.
Основные методы для проверки:
// Проверка, выбран ли чекбокс
let isChecked = await checkbox.isSelected();
console.log(isChecked); // true или false
Метод isSelected() возвращает
логическое значение true, если чекбокс установлен, и
false, если нет. Он используется как для утверждений в
тестах, так и для условий внутри сценариев.
Чтобы установить чекбокс, необходимо убедиться, что его текущее состояние отличается от желаемого:
// Установить чекбокс, если он ещё не выбран
if (!await checkbox.isSelected()) {
await checkbox.click();
}
// Снять чекбокс, если он выбран
if (await checkbox.isSelected()) {
await checkbox.click();
}
Использование условной логики предотвращает лишние клики, что важно для стабильности тестов, особенно когда изменение состояния инициирует дополнительные события на странице.
Часто на странице присутствует группа чекбоксов. Для работы с ними
применяется коллекция element.all:
let checkboxes = element.all(by.css('input[type="checkbox"]'));
// Выбрать все чекбоксы
await checkboxes.each(async (cb) => {
if (!await cb.isSelected()) {
await cb.click();
}
});
// Проверка, что все чекбоксы выбраны
let states = await checkboxes.map(async (cb) => await cb.isSelected());
console.log(states); // [true, true, true, ...]
Метод each позволяет проходить по
каждому элементу коллекции и выполнять действия, а
map — получать массив результатов для
дальнейшей проверки.
На динамических страницах чекбоксы могут появляться после загрузки данных. В таких случаях важно использовать ожидания:
let dynamicCheckbox = element(by.css('input.dynamic-checkbox'));
let EC = protractor.ExpectedConditions;
// Ждать, пока чекбокс станет кликабельным
await browser.wait(EC.elementToBeClickable(dynamicCheckbox), 5000);
await dynamicCheckbox.click();
Использование ExpectedConditions
повышает стабильность тестов и предотвращает ошибки типа
ElementNotInteractableError.
После изменения состояния чекбокса часто требуется проверка, что действие повлекло нужный эффект:
await checkbox.click();
expect(await checkbox.isSelected()).toBe(true);
// Проверка влияния на форму
let submitButton = element(by.id('submit'));
expect(await submitButton.isEnabled()).toBe(true);
Встроенные методы isSelected() и
isEnabled() позволяют строить надежные
проверки состояния интерфейса после взаимодействия с элементами.
В современных интерфейсах часто используются кастомные чекбоксы, где
<input type="checkbox"> скрыт, а кликабельный элемент
— это <div> или <span>. В таких
случаях важно:
click() на видимой части, а не на скрытом
<input>.getAttribute('checked') или
через класс CSS, если isSelected() возвращает некорректное
значение.Пример:
let customCheckbox = element(by.css('.custom-checkbox'));
await customCheckbox.click();
let isChecked = await customCheckbox.getAttribute('class');
console.log(isChecked.includes('checked'));
element.all.ExpectedConditions.isSelected() не работает.Работа с чекбоксами в Protractor строится на понимании состояния элемента, правильном выборе локаторов и использовании асинхронных ожиданий для надежного выполнения тестов.