В WebdriverIO цепочки селекторов позволяют создавать сложные логические структуры поиска элементов на странице, комбинируя различные стратегии поиска. Это особенно важно для динамических и сложных DOM-структур, где один селектор не обеспечивает однозначного доступа к элементу.
В WebdriverIO каждый элемент можно искать с помощью функции
$ (для одного элемента) и $$ (для коллекции
элементов). Селекторы могут быть CSS, XPath, а также специфичными для
платформы (например, accessibility id для мобильного
тестирования).
Примеры базовых селекторов:
const button = await $('button.submit');
const inputs = await $$('input[type="text"]');
const item = await $('//div[@class="item"]');
Цепочки селекторов позволяют искать элемент внутри другого элемента, что улучшает точность поиска и снижает вероятность конфликтов. В WebdriverIO поддерживаются следующие методы:
$ и $$ на найденных
элементахelement.$() для вложенного
поискаelement.$$() для получения коллекции
внутри элементаПример:
const form = await $('#loginForm');
const usernameInput = await form.$('input[name="username"]');
const passwordInput = await form.$('input[name="password"]');
В этом примере поиск usernameInput ограничен областью
найденного элемента #loginForm, что исключает другие поля с
таким же именем на странице.
WebdriverIO позволяет фильтровать коллекции элементов для более
точного поиска. Методы filter, find,
map используются после получения коллекции с
$$.
const items = await $$('ul li');
const activeItem = await items.find(async item => {
return (await item.getAttribute('class')).includes('active');
});
Здесь создается цепочка: сначала собираются все элементы списка, затем выбирается только активный.
Часто элементы появляются на странице с задержкой. В таких случаях цепочки селекторов удобно комбинировать с ожиданиями:
const card = await $('#cardsContainer').$('div.card');
await card.waitForDisplayed({ timeout: 5000 });
Это позволяет не только найти элемент, но и убедиться, что он доступен для взаимодействия.
XPath дает больше гибкости для сложных структур. В WebdriverIO можно строить цепочки через XPath, используя вложенные селекторы:
const parent = await $('//div[@id="menu"]');
const menuItem = await parent.$('.//a[text()="Settings"]');
Обратите внимание на использование .// — поиск
начинается внутри найденного элемента parent.
Иногда удобно комбинировать CSS и XPath для точного доступа:
const container = await $('#main');
const link = await container.$('//a[contains(@href, "profile")]');
Цепочка начинается с CSS-селектора, затем уточняется XPath для ссылки внутри контейнера.
Для сложных страниц с повторяющимися блоками часто необходимо обрабатывать вложенные коллекции:
const cards = await $$('div.card');
for (const card of cards) {
const title = await card.$('h2.title').getText();
const buttons = await card.$$('button');
}
Каждая карточка обрабатывается отдельно, элементы внутри ищутся в контексте конкретной карточки.
waitForDisplayed, waitForExist) для
стабильности.Цепочки селекторов — основа надежного и поддерживаемого тестирования с WebdriverIO. Они позволяют структурировать код, минимизировать зависимость от структуры страницы и упрощают работу с динамическим контентом.