Автокомплит — это один из распространённых элементов веб-интерфейса, где пользователю предлагаются варианты ввода на основе частично введённого текста. В тестировании с использованием Protractor работа с автокомплитом требует особого подхода, так как этот элемент динамический и асинхронный.
Для взаимодействия с автокомплитом важно корректно определить элементы:
Пример поиска элементов:
let inputField = element(by.css('#autocomplete-input'));
let suggestionsList = element.all(by.css('.autocomplete-suggestions li'));
Использование element.all для списка предложений
позволяет работать с набором элементов, что удобно для перебора и
фильтрации.
Ввод текста в поле автокомплита часто сопровождается задержкой появления вариантов, поэтому необходимо использовать ожидания (ExpectedConditions):
const EC = protractor.ExpectedConditions;
inputField.sendKeys('Pro');
browser.wait(EC.visibilityOf(suggestionsList.first()), 5000);
Здесь browser.wait гарантирует, что первый элемент
списка станет видимым перед дальнейшими действиями.
Выбор конкретного варианта автокомплита можно реализовать через фильтрацию текста или индекс:
suggestionsList.filter(async (elem) => {
let text = await elem.getText();
return text.includes('Protractor');
}).first().click();
Этот подход позволяет выбрать первый элемент, который соответствует заданной подстроке.
Альтернатива — выбор по индексу:
suggestionsList.get(0).click(); // выбираем первый вариант
Автокомплит может подгружать данные с сервера, что делает элементы динамическими. Для надёжного теста рекомендуется:
visibilityOf, presenceOf).browser.wait(async () => {
let count = await suggestionsList.count();
return count > 0;
}, 5000);
let firstOption = suggestionsList.first();
browser.wait(EC.elementToBeClickable(firstOption), 3000);
firstOption.click();
После выбора варианта автокомплита важно убедиться, что поле ввода обновилось:
expect(inputField.getAttribute('value')).toEqual('Protractor');
Также можно проверять наличие текста на странице, если выбор автокомплита влияет на другие элементы.
sleep(), чтобы тесты были стабильными и быстрыми.inputField.sendKeys('Pro');
browser.wait(async () => {
let count = await suggestionsList.count();
return count > 0;
}, 5000);
let option = suggestionsList.filter(async (elem) => {
return (await elem.getText()) === 'Protractor';
}).first();
browser.wait(EC.elementToBeClickable(option), 3000);
option.click();
expect(inputField.getAttribute('value')).toEqual('Protractor');
Такой подход объединяет ввод текста, ожидания, фильтрацию и проверку результата, что обеспечивает стабильность теста при работе с автокомплитом.
Работа с автокомплитом в Protractor требует аккуратного сочетания поиска элементов, асинхронных ожиданий и фильтрации по тексту, что позволяет создавать надёжные автоматизированные сценарии для динамических интерфейсов.