Фильтрация списков

Пример 9

Хотя метод get("id") в большинстве случаев избавляет от необходимости фильтраций, всё равно встречаются ситуации, когда требуется отсортировать элементы списка по какому-либо специфическому признаку — например, по наличию у элемента определённого CSS класса. Для таких случаев придётся применять фильтрацию.

В одном из прошлых примеров, где мы кликали по кнопкам в списке, вместо получения кнопки по "id" можно, как в чистом Selenide, применить фильтрацию:

@Test
@Feature("Simple elements list")
@DisplayName("Walk through the lists of simple elements")
public void fillListOfSimpleInputElements() {
    ...
    simpleListsPage.listBirdNameButtons().get("Sparrow").click();                            // так мы выбрали кнопку по "id"
    simpleListsPage.listBirdNameButtons().filter(Condition.text("Sparrow")).get(0).click();  // так нашли через фильтр
}

Результат этих шагов будет выглядеть в отчёте одинаково.

Но что будет, если взять более сложный вариант, например такой:

accordionPage.accordionSections().filter(Condition.cssClass("card")).assertSize(5);

Когда на объекте списка вызывается метод assertSize(5), перехватывается событие и производится запись шага в репорт о том, что список проверен на длину со значением 5. Однако в этом случае в цепочке вызовов присутствует подшаг фильтрации, который меняет суть проверки, о чем метод assertSize не знает.

Отсюда напрашивается предположение, что в отчёте мы должны увидеть обычную запись, например:

Assert that the <Accordion categories> list's size is 5

Чтобы этого не происходило, метод фильтрации возвращает клон текущего списка, сохраняющий все его атрибуты, но содержащий лишь отфильтрованные записи и пометку о том, что к нему была применена фильтрация. После этого при вызове любого ассёрта фреймворк будет знать, что список фильтровался, и залогирует в отчёт такую запись, например:

Assert that the <Accordion categories, filtered by: css class "card"> list's size is 5

После имени списка Accordion categories добавляются записи о всех произведённых фильтрациях.

Сделаем немного больше примеров с фильтрациями:

@Test
@DisplayName("Filtration examples")
public void listFiltering() {
    UiSteps.openBrowser(accordionPageUrl);
    AccordionPage.AccordionSection accordionSection = accordionPage.accordionSections()
                                                            .filter(Condition.text("Chapter 2")).get(0);
    accordionSection.title().click();
    accordionPage.accordionSections().filter(Condition.visible).assertSize(5);
    accordionPage.accordionSections().filter(Condition.cssClass("card")).assertSize(5);
    accordionPage.accordionSections().filter(Condition.name("some")).assertSize(0);
    accordionPage.accordionSections()
            .filter(Condition.visible)
            .filter(Condition.cssClass("card"))
            .filter(Condition.text("Chapter 2"))
            .assertSize(1);
}
Filtration report

Таким образом, возможности фильтрации никак не ограничены, но остаются простыми для чтения.