Пример 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);
}
Таким образом, возможности фильтрации никак не ограничены, но остаются простыми для чтения.