Управление виджетами типа 'карусель'

Пример 12

В прошлом примере мы узнали, что фреймворк содержит абстрактные классы для описания наиболее распространённых элементов. В этом примере рассмотрим, как создать более сложный виджет – карусель (слайдер). Основная суть любой карусели – показывать изображения, зачастую с возможностью их переключения. Для этого существует абстрактный класс AbstractCarousel.

Для наглядности возьмём виджет, описанный на странице carousel.html:



HTML код виджета

<div id="carouselExampleIndicators" class="carousel slide" data-ride="carousel">
    <ol class="carousel-indicators">
        <li data-target="#carouselExampleIndicators" data-slide-to="0" class="active"></li>
        <li data-target="#carouselExampleIndicators" data-slide-to="1"></li>
        <li data-target="#carouselExampleIndicators" data-slide-to="2"></li>
    </ol>
    <div class="carousel-inner">
        <div class="carousel-item active">
            <img class="d-block w-100" src="https://images.pexels.com/photos/247599/pexels-photo-247599.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1" alt="Third slide">
        </div>
        <div class="carousel-item">
            <img class="d-block w-100" src="https://images.pexels.com/photos/416160/pexels-photo-416160.jpeg?auto=compress&cs=tinysrgb&w=800" alt="First slide">
        </div>
        <div class="carousel-item">
            <img class="d-block w-100" src="https://images.pexels.com/photos/2194261/pexels-photo-2194261.jpeg?auto=compress&cs=tinysrgb&w=600" alt="Second slide">
        </div>
    </div>
    <a class="carousel-control-prev" href="#carouselExampleIndicators" role="button" data-slide="prev">
        <span class="carousel-control-prev-icon" aria-hidden="true"></span>
        <span class="sr-only">Previous</span>
    </a>
    <a class="carousel-control-next" href="#carouselExampleIndicators" role="button" data-slide="next">
        <span class="carousel-control-next-icon" aria-hidden="true"></span>
        <span class="sr-only">Next</span>
    </a>
</div>


Сам абстрактный класс выглядит следующим образом:

@Widget
public abstract class AbstractCarousel extends AbstractWidget {
    public AbstractCarousel() {
        this.setUiElementType(ElementType.CAROUSEL.getType());
    }

    public AbstractCarousel(By rootLocator) {
        super(rootLocator);
        this.setUiElementType(ElementType.CAROUSEL.getType());
    }

    public AbstractCarousel(String selenideRootLocator) {
        super(selenideRootLocator);
        this.setUiElementType(ElementType.CAROUSEL.getType());
    }

    public AbstractCarousel(SelenideElement selenideRootElement) {
        super(selenideRootElement);
        this.setUiElementType(ElementType.CAROUSEL.getType());
    }

    public abstract void scrollForward();

    public abstract void scrollBackward();
}


Опишем наш собственный виджет, создав класс Carousel и отнаследовавшись от класса AbstractWidget:

Нам потребуется переопределить 2 абстрактных метода scrollForward() и scrollBackward()

@Widget
public class Carousel extends AbstractCarousel {

    public Carousel(String selenideLocator) {
        super(selenideLocator);
    }

    @Override
    public void scrollForward() {
        getRoot().$(".carousel-control-next-icon").click();
        UiSteps.waiting(1, "observing the slide");
    }

    @Override
    public void scrollBackward() {
        getRoot().$(".carousel-control-prev-icon").click();
        UiSteps.waiting(1, "observing the slide");
    }
}


Объявим его на странице:

@PageObject
@Getter
@Accessors(fluent = true)
public class CarouselPage extends Page {

    @Name("Random images")
    protected Carousel carousel = new Carousel("#carouselExampleIndicators");
}


И напишем сценарий:

@Test
@DisplayName("Simple carouser example")
public void carouselExample() {
    UiSteps.openBrowser(carouselPageUrl);
    carouselPage.carousel().scrollForward();
    carouselPage.carousel().scrollBackward();
    carouselPage.carousel().scrollForward();
    carouselPage.carousel().scrollForward();
    carouselPage.carousel().scrollBackward();
}


Запускаем тест, смотрим, как проходит выполнение, и анализируем отчёт. В репорте автоматически составились шаги с подстановкой имени и типа элемента.

Отчёт