Работа с элементами формы является одной из распространённых задач в
автоматизированном тестировании веб-приложений. Одним из таких элементов
является <select>, который представляет выпадающий
список. В автоматизированных тестах необходимо правильно выбирать нужные
опции, эмулируя действия пользователя. Puppeteer предоставляет несколько
подходов для взаимодействия с такими элементами.
<select>
Элемент <select> состоит из набора
<option>, каждая из которых представляет одну из
возможных опций для выбора. В отличие от простых текстовых полей,
<select> требует, чтобы пользователь выбирал один или
несколько элементов из списка, который может быть отображён в виде
выпадающего меню.
<select id="country" name="country">
<option value="us">США</option>
<option value="ca">Канада</option>
<option value="ru">Россия</option>
</select>
<select> в Puppeteer
Для выбора нужной опции в элементе <select> Puppeteer
предоставляет методы, которые могут эмулировать как выбор по индексу,
так и выбор по значению или тексту. Рассмотрим основные подходы.
value)
Для выбора элемента в выпадающем списке по значению используется метод
select. Этот метод принимает значение атрибута
value из одного из элементов <option> и
выбирает его.
Пример:
await page.select(&
В данном примере выбирается опция с атрибутом value=“ru”.
Такой способ полезен, если заранее известно точное значение, которое
необходимо выбрать. Если элемент с таким значением существует, Puppeteer
выполнит выбор.
Выбор по индексу
Метод select также поддерживает выбор по индексу элемента в
списке. Индексация начинается с нуля. Это может быть полезно, если
известно, какая по порядку опция должна быть выбрана.
Пример:
await page.select('#country', '1');
В этом примере будет выбрана опция с индексом 1 (второй элемент в
списке). Однако важно помнить, что выбор по индексу зависит от порядка
элементов в HTML и может быть не таким стабильным, как выбор по
значению.
Выбор по тексту опции
В Puppeteer нет встроенной функции для выбора опции непосредственно по
её текстовому содержимому. Однако это можно сделать с помощью комбинации
методов page.$</code> и
<code>option.evaluate</code>.</p>
<p>Пример:</p>
<pre class="javascript"><code>const option = await
page.$('select#country option'); await option.evaluate(el =>
el.textContent === 'Россия' && el.selected = true);
В данном примере выбирается опция с текстом «Россия». Это может быть
полезно, когда необходимо выбирать опцию, исходя не из её
value, а из отображаемого текста.
Если элемент <select> поддерживает множественный
выбор (атрибут multiple), то нужно учитывать, что Puppeteer
может выбрать несколько опций сразу.
Пример:
<select id="languages" name="languages" multiple>
<option value="en">English</option>
<option value="fr">Français</option>
<option value="de">Deutsch</option>
</select>
Для выбора нескольких опций можно передавать массив значений:
await page.select('#languages', 'en', 'fr');
В данном случае будут выбраны опции с value=“en” и
value=“fr”.
После того как был выполнен выбор, важно убедиться, что опция была выбрана корректно. Для этого можно получить текущее выбранное значение и сравнить его с ожидаемым.
Пример:
const selectedValue = await page.$eval('#country', el => el.value);
console.log(selectedValue); // должен быть 'ru'
Метод $eval позволяет извлечь значение выбранной опции и
проверить его.
Часто элементы <select> могут быть динамическими,
т.е. опции списка могут изменяться в ответ на действия пользователя или
запросы к серверу. Puppeteer позволяет работать с такими элементами даже
в случае их динамического обновления. Важно использовать методы, такие
как waitForSelector, чтобы дождаться загрузки нужных опций.
Пример:
await page.select('#country', 'us');
await page.waitForSelector('#country option[value="ca"]');
Этот код сначала выбирает опцию с value=“us”, а затем ждёт,
пока не появится опция с value=“ca”.
Когда элемент <select> находится внутри модального
окна или попапа, его взаимодействие не отличается от обычного выбора,
однако для начала работы с элементом требуется учитывать дополнительные
действия. Например, может потребоваться сначала закрыть модальное окно
или перейти в нужный фрейм.
Пример:
await page.click('#openModal');
await page.waitForSelector('#modal select');
await page.select('#modal select#country', 'ca');
Здесь выполняется клик по кнопке для открытия модального окна, после чего ждём появления нужного элемента и выполняем выбор опции внутри модального окна.
При работе с элементами формы важно учитывать, что иногда может
возникать ошибка, если элемент <select> не найден,
если опция с указанным значением не существует или если выбор происходит
слишком быстро, до того как элемент станет доступен.
В таких случаях полезно использовать конструкцию try/catch
для перехвата ошибок и вывода диагностических сообщений:
try {
await page.select('#country', 'jp');
} catch (error) {
console.log('Ошибка при выборе опции: ', error);
}
Работа с элементами формы в Puppeteer — это важный аспект тестирования
веб-приложений. Выбор опций в элементах <select>
может быть выполнен различными способами: по значению, индексу или
тексту опции. Важно учитывать особенности динамических изменений в
списках и правильно управлять асинхронностью, чтобы обеспечить
надёжность тестов.