Пример 2
Для понимания работы со списками возьмём страницу с двумя списками, состоящими из простых элементов, полей ввода и кнопок.
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();
}
Посмотрим отчёт:
Делаем этот же сценарий с 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();
}
Смотрим отчёт и сравниваем с предыдущим:
Если в Selenide для работы со списками используется класс ElementsCollection
, то в Allurium для этой цели применяется класс ListWC
. В данном примере мы создаём два списка простых элементов интерфейса — полей ввода и кнопок.
Список, как и элемент или виджет, должен иметь имя, присваиваемое аннотацией @Name
.
При объявлении списка необходимо создать его экземпляр, хотя бы с пустым конструктором, то есть new ListWC<>();
Селектор для элементов списка можно указать через аргумент конструктора с использованием класса By
, как в примере с полями ввода:
@Name("Input fields")
protected ListWC<TextField> inputTextFields = new ListWC<>(By.xpath("//input[contains(@class, 'form-control')]"));
Также селектор для списка можно задать через аннотацию @ListLocator
(например, для списка кнопок):
@Name("Buttons bird names")
@ListLocator(css = ".mt-5 .btn-primary")
protected ListWC<Button> listBirdNameButtons = new ListWC<>();
Найти элемент в списке можно различными способами:
Как в обычной коллекции, по индексу: list.get(index)
Через специальный метод get("string id")
. Например, в списке кнопок, где уникальным является текст:
simpleListsPage.listBirdNameButtons().get("Flamingo").click();
Также можно воспользоваться стандартной фильтрацией:
simpleListsPage.listBirdNameButtons().filter(Condition.text("Sparrow")).get(0).click();
И, наконец, можно обратиться напрямую к ElementsCollection
(на котором построен ListWC
):
simpleListsPage.listBirdNameButtons().getSourceElements()
.filter(Condition.text("Sparrow")).get(0).click();
Однако в этом случае действие не будет распознано как шаг и не будет логироваться в отчёт.