Метод filter для локаторов

Урок: Метод filter для локаторов

Введение

Представь, что ты ищешь товар в интернет-магазине. Ты вводишь «кроссовки» — и получаешь сотни результатов. Но тебе нужны не любые кроссовки, а, например, только чёрные и только определённого размера.

Ты начинаешь фильтровать: по цвету, по бренду, по цене. В итоге остаются только те варианты, которые тебе действительно подходят.

В Playwright происходит похожая ситуация. Иногда ты находишь не один элемент, а сразу несколько. И среди них нужно выбрать именно тот, который соответствует нужному условию.

Для этого используется метод filter.

Он позволяет «сузить» набор элементов и работать только с нужными.


Когда возникает необходимость в filter

Рассмотрим пример.

await page.getByRole('listitem').click();

Если на странице несколько элементов списка (listitem), Playwright не поймёт, какой именно нужно кликнуть.

Можно выбрать по индексу:

await page.getByRole('listitem').nth(0).click();

Но это плохая практика:

  • порядок может измениться;
  • тест станет нестабильным.

Гораздо лучше выбрать элемент по смыслу — и здесь появляется filter.


Как работает filter

Метод filter применяется к локатору и уточняет его.

const item = page.getByRole('listitem').filter({ hasText: 'Товар 1' });
await item.click();

Разберём:

  • сначала мы нашли все элементы listitem;
  • затем отфильтровали их по тексту;
  • в результате остался только нужный элемент.

filter не создаёт новый поиск с нуля — он уточняет уже найденные элементы.


Фильтрация по тексту (hasText)

Самый частый вариант — фильтрация по тексту.

await page.getByRole('listitem').filter({ hasText: 'Apple' }).click();

Здесь:

  • ищем все элементы списка;
  • оставляем только те, где есть текст «Apple».

Это удобно, потому что:

  • пользователь тоже ориентируется по тексту;
  • тест становится читаемым.

Фильтрация по вложенным элементам (has)

Иногда нужно выбрать элемент, внутри которого есть другой элемент.

await page
  .getByRole('listitem')
  .filter({
    has: page.getByRole('button', { name: 'Купить' }),
  })
  .click();

Разберём:

  • ищем элементы списка;
  • оставляем те, внутри которых есть кнопка «Купить».

Это очень мощный инструмент, когда структура сложная.


Комбинирование условий

Можно комбинировать фильтры.

await page
  .getByRole('listitem')
  .filter({ hasText: 'iPhone' })
  .filter({
    has: page.getByRole('button', { name: 'Купить' }),
  })
  .click();

Здесь:

  • сначала фильтруем по тексту;
  • затем уточняем по вложенному элементу.

Это делает выбор максимально точным.


Пример из реального сценария

Представим список товаров:

<li>
  <span>iPhone</span>
  <button>Купить</button>
</li>

<li>
  <span>Samsung</span>
  <button>Купить</button>
</li>

Задача — нажать кнопку «Купить» у iPhone.

await page
  .getByRole('listitem')
  .filter({ hasText: 'iPhone' })
  .getByRole('button', { name: 'Купить' })
  .click();

Что происходит:

  • находим нужный товар;
  • внутри него ищем кнопку;
  • кликаем.

Это читается как человеческое действие: «найти iPhone → нажать купить».


Почему filter лучше nth

Сравним два подхода.

Через nth:

await page.getByRole('listitem').nth(0).click();

Проблемы:

  • зависит от порядка;
  • неочевидно, что это за элемент.

Через filter:

await page.getByRole('listitem').filter({ hasText: 'iPhone' }).click();

Преимущества:

  • понятно, что выбирается;
  • устойчиво к изменениям;
  • ближе к логике пользователя.

Как это работает внутри

Когда ты пишешь:

page.getByRole('listitem').filter({ hasText: 'iPhone' });

Playwright:

  • сначала находит все элементы;
  • затем проверяет каждый;
  • оставляет только подходящие;
  • выполняет действие.

При этом:

  • используется автоматическое ожидание;
  • элементы проверяются в реальном времени.

Где это используется на практике

Метод filter используется везде, где:

  • есть списки (товары, таблицы);
  • элементы повторяются;
  • нужно выбрать конкретный элемент по условию;
  • структура сложная.

Например:

  • выбор строки в таблице;
  • выбор карточки товара;
  • поиск нужного пользователя;
  • работа с динамическими списками.

Итоговое понимание

Метод filter — это способ уточнить локатор и выбрать нужный элемент среди нескольких.

Он позволяет:

  • делать тесты более точными;
  • избегать нестабильных решений (nth);
  • писать код, похожий на действия пользователя.

Ключевая идея в том, что filter — это не просто инструмент, а способ мыслить правильно: не «взять первый элемент», а «найти нужный по смыслу».

Именно это делает тесты надёжными и понятными.


Веб-страница из видео

Демо для отработки filter и связанных локаторов: locator_filter — демо-страница.