Списки простых элементов, поиск и использование

Пример 2

Для понимания работы со списками возьмём страницу с двумя списками, состоящими из простых элементов, полей ввода и кнопок.



Рассматриваем вариант на обычном Selenide

1. Описываем Page Object

@Getter
@Accessors(fluent = true)
public class SimpleListPage {
    protected ElementsCollection inputTextFields = $$x("//input[contains(@class, 'form-control')]")
            .as("Input fields");
    protected ElementsCollection listBirdNameButtons = $$(".mt-5 .btn-primary").as("Buttons bird names");
}

2. Создаём сценарий в котором заполним все текстовые поля, проверим выборочно значения пары текстовых полей из списка, а затем нажмём на все кнопки:

@Test
@Feature("Simple elements list")
@DisplayName("Walk through the lists of simple elements")
public void fillListOfSimpleInputElements() {
    Selenide.open(listsPageUrl);
    simpleListPage.inputTextFields().get(0).sendKeys("Eagle");
    simpleListPage.inputTextFields().get(1).sendKeys("Sparrow");
    simpleListPage.inputTextFields().get(2).sendKeys("Parrot");
    simpleListPage.inputTextFields().get(3).sendKeys("Penguin");
    simpleListPage.inputTextFields().get(4).sendKeys("Owl");
    simpleListPage.inputTextFields().get(5).sendKeys("Flamingo");
    simpleListPage.inputTextFields().get(6).sendKeys("Peacock");
    simpleListPage.inputTextFields().get(7).sendKeys("Hummingbird");
    simpleListPage.inputTextFields().get(8).sendKeys("Woodpecker");
    simpleListPage.inputTextFields().get(9).sendKeys("Crow");
    Assertions.assertThat(simpleListPage.inputTextFields().get(5).getAttribute("value"))
            .as("Input 5 value").isEqualTo("Flamingo");
    Assertions.assertThat(simpleListPage.inputTextFields().get(7).getAttribute("value"))
            .as("Input 7 value").isEqualTo("Hummingbird");
    simpleListPage.listBirdNameButtons().filter(Condition.text("Eagle")).first().click();
    simpleListPage.listBirdNameButtons().filter(Condition.text("Sparrow")).first().click();
    simpleListPage.listBirdNameButtons().filter(Condition.text("Parrot")).first().click();
    simpleListPage.listBirdNameButtons().filter(Condition.text("Penguin")).first().click();
    simpleListPage.listBirdNameButtons().filter(Condition.text("Owl")).first().click();
    simpleListPage.listBirdNameButtons().filter(Condition.text("Flamingo")).first().click();
    simpleListPage.listBirdNameButtons().filter(Condition.text("Peacock")).first().click();
    simpleListPage.listBirdNameButtons().filter(Condition.text("Hummingbird")).first().click();
    simpleListPage.listBirdNameButtons().filter(Condition.text("Woodpecker")).first().click();
    simpleListPage.listBirdNameButtons().filter(Condition.text("Crow")).first().click();
}

Посмотрим отчёт:

Отчёт Selenide

Сценарий с использованием Allurium

Делаем этот же сценарий с Allurium.

1. Описываем Page Object

@PageObject
@Getter
@Accessors(fluent = true)
public class SimpleListsPage extends Page {
    @Name("Input fields")
    protected ListWC<TextField> inputTextFields = new ListWC<>(By.xpath("//input[contains(@class, 'form-control')]"));
    
    @Name("Buttons bird names")
    @ListLocator(css = ".mt-5 .btn-primary")
    protected ListWC<Button> listBirdNameButtons = new ListWC<>();
}

2. Описываем сценарий

@Test
@Feature("Simple elements list")
@DisplayName("Walk through the lists of simple elements")
public void fillListOfSimpleInputElements() {
    UiSteps.openBrowser(listsPageUrl);
    simpleListsPage.inputTextFields().get(0).clearAndWrite("Eagle");
    simpleListsPage.inputTextFields().get(1).clearAndWrite("Sparrow");
    simpleListsPage.inputTextFields().get(2).clearAndWrite("Parrot");
    simpleListsPage.inputTextFields().get(3).clearAndWrite("Penguin");
    simpleListsPage.inputTextFields().get(4).clearAndWrite("Owl");
    simpleListsPage.inputTextFields().get(5).clearAndWrite("Flamingo");
    simpleListsPage.inputTextFields().get(6).clearAndWrite("Peacock");
    simpleListsPage.inputTextFields().get(7).clearAndWrite("Hummingbird");
    simpleListsPage.inputTextFields().get(8).clearAndWrite("Woodpecker");
    simpleListsPage.inputTextFields().get(9).clearAndWrite("Crow");
    simpleListsPage.inputTextFields().get(5).assertCurrentValue("Flamingo");
    simpleListsPage.inputTextFields().get(7).assertCurrentValue("Hummingbird");
    simpleListsPage.listBirdNameButtons().get("Eagle").click();
    simpleListsPage.listBirdNameButtons().get("Sparrow").click();
    simpleListsPage.listBirdNameButtons().get("Parrot").click();
    simpleListsPage.listBirdNameButtons().get("Penguin").click();
    simpleListsPage.listBirdNameButtons().get("Owl").click();
    simpleListsPage.listBirdNameButtons().get("Flamingo").click();
    simpleListsPage.listBirdNameButtons().get("Peacock").click();
    simpleListsPage.listBirdNameButtons().get("Hummingbird").click();
    simpleListsPage.listBirdNameButtons().get("Woodpecker").click();
    simpleListsPage.listBirdNameButtons().get("Crow").click();
}

Смотрим отчёт и сравниваем с предыдущим:

Отчёт Allurium

Подробнее о работе со списками

Если в Selenide для работы со списками используется класс ElementsCollection, то в Allurium для этой цели применяется класс ListWC. В данном примере мы создаём два списка простых элементов интерфейса — полей ввода и кнопок.

Найти элемент в списке можно различными способами:

  1. Как в обычной коллекции, по индексу: list.get(index)

  2. Через специальный метод get("string id"). Например, в списке кнопок, где уникальным является текст:

    simpleListsPage.listBirdNameButtons().get("Flamingo").click();
    
  3. Также можно воспользоваться стандартной фильтрацией:

    simpleListsPage.listBirdNameButtons().filter(Condition.text("Sparrow")).get(0).click();
    
  4. И, наконец, можно обратиться напрямую к ElementsCollection (на котором построен ListWC):

    simpleListsPage.listBirdNameButtons().getSourceElements()
        .filter(Condition.text("Sparrow")).get(0).click();
    

    Однако в этом случае действие не будет распознано как шаг и не будет логироваться в отчёт.