Dropdown (выпадающие списки) — один из наиболее часто встречающихся элементов веб-приложений. В автоматизированном тестировании с помощью Protractor важно уметь корректно взаимодействовать с ними, включая выбор опций, проверку выбранного значения и обработку динамических списков.
В Protractor элементы dropdown обычно представлены HTML-тегом
<select> с набором <option>
внутри. Первый шаг — корректное определение элементов:
const dropdown = element(by.id('dropdownId'));
const options = dropdown.all(by.tagName('option'));
element(by.id('dropdownId')) — поиск контейнера
dropdown по уникальному идентификатору.all(by.tagName('option')) — получение всех опций внутри
выпадающего списка.Альтернативные локаторы могут использовать by.css или
by.model, если используется Angular:
const dropdown = element(by.model('selectedValue'));
Для выбора опции по видимому тексту применяют метод
element.all().filter() или
element(by.cssContainingText()).
dropdown.element(by.cssContainingText('option', 'Опция 2')).click();
Здесь:
by.cssContainingText('option', 'Опция 2') — ищет
<option> с текстом «Опция 2».click() — выбирает данную опцию.Для динамических списков, где текст может меняться, можно использовать фильтрацию:
options.filter(async (option) => {
const text = await option.getText();
return text === 'Опция 2';
}).first().click();
filter возвращает массив всех элементов,
соответствующих условию.first() берёт первый совпавший элемент, после чего
вызывается click().Иногда необходимо выбрать элемент по значению атрибута
value, а не по тексту:
dropdown.element(by.css('option[value="2"]')).click();
value фиксирован.Чтобы проверить, какая опция была выбрана:
const selectedOption = dropdown.element(by.css('option:checked'));
selectedOption.getText().then(text => {
console.log('Выбрана опция:', text);
});
option:checked — CSS-селектор для текущей выбранной
опции.getText() возвращает видимый текст опции.Некоторые веб-приложения используют кастомные dropdown, которые не
являются <select> элементами, а представляют собой
<div> или <ul> с пунктами
<li>. В таких случаях необходимо использовать клики
на контейнер и элементы списка:
const dropdown = element(by.css('.custom-dropdown'));
dropdown.click(); // открытие списка
const optionToSelect = element(by.cssContainingText('.dropdown-item', 'Опция 2'));
optionToSelect.click();
Особенности:
click().ExpectedConditions:const EC = protractor.ExpectedConditions;
browser.wait(EC.visibilityOf(optionToSelect), 5000);
optionToSelect.click();
Для тестирования динамических сценариев часто требуется выбирать случайную опцию:
options.count().then(async count => {
const randomIndex = Math.floor(Math.random() * count);
await options.get(randomIndex).click();
});
count() возвращает количество опций.Math.floor(Math.random() * count) генерирует индекс
случайной опции.browser.wait() для появления dropdown и опций.await или
then.Выбор опции по тексту с проверкой результата:
const dropdown = element(by.id('dropdownId'));
const desiredText = 'Опция 3';
const option = dropdown.element(by.cssContainingText('option', desiredText));
option.click();
const selectedOption = dropdown.element(by.css('option:checked'));
expect(selectedOption.getText()).toEqual(desiredText);
Выбор опции по значению с ожиданием:
const dropdown = element(by.id('dropdownId'));
const option = dropdown.element(by.css('option[value="3"]'));
const EC = protractor.ExpectedConditions;
browser.wait(EC.elementToBeClickable(option), 5000);
option.click();
const selectedOption = dropdown.element(by.css('option:checked'));
expect(selectedOption.getAttribute('value')).toEqual('3');
Эти подходы покрывают большинство сценариев работы с dropdown в Protractor, обеспечивая стабильность тестов и корректное взаимодействие с элементами интерфейса.