Selenide: как получить все активные элементы из ElementsCollection?

Я пытаюсь написать оператор if для коллекции, но столкнулся с проблемой. Например, следующий элемент имеет тег li, который указывает, активен ли элемент:

<dl class = "p-property-item">
<dt class = "p-item-title" data-spm-anchor-id = "42e07cb3WzvrLA">Color:</dt>
    <dd class = "p-item-main">
        <ul id = "j-sku-list-3" class = "sku-attr-list util-clearfix" data-sku-prop-id = "14" data-sku-show-type = "none" data-isselect = "true" data-spm-anchor-id = "2114.10010108.1000016/B.i3.42e07cb3WzvrLA">
               <li class = "active">
                    <a data-role = "sku" data-sku-id = "29" id = "sku-2-29" href = "javascript:void(0)" data-spm-anchor-id = "2114.10010108">
                        <span data-spm-anchor-id = "42e07cb3WzvrLA">White</span>
                    </a>
               </li>
        </ul>
                    <div data-role = "msg-error" class = "msg-error sku-msg-error" style = "display: none;">
                        Please select a Color
                    </div>
    </dd>

Я беру все элементы со страницы и помещаю их в коллекцию:

@FindBy(how = How.CSS, using = "#j-product-info-sku > dl:nth-child(2) > dd > ul > li > a > span")
private ElementsCollection colorList;

public ElementsCollection getColor() { return colorList; }

Но я не знаю, как получить элементы из коллекции, у которых есть «активный» li. Я имею в виду, как получить все активные элементы, есть ли возможность их распознать?

Примечание. Все элементы видны, поэтому фильтровать по опциям видимого не имеет значения.

Я также использовал метод java, упомянутый здесь: Фильтрация коллекции Elements

    public static Condition hasChildWithCondition(final By locator, final Condition condition) {
    return new Condition("hasChildWithCondition") {
        public boolean apply(WebElement element) {
            return element.findElements(locator).stream().
                    filter(child -> condition.apply(child)).count() > 0;
        }

        public String toString() {
            return this.name;
        }
    };
}



Condition hasChild = hasChildWithCondition(By.cssSelector("li"), Condition.text("active"));

if ((page.getColor().size() != 0) && (page.getColor().filterBy(hasChild))){
            //to do
        }

но в моем случае я получаю ошибку: Operator && cannot be applied to 'boolean','com.codeborne.selenide.ElementsCollection'

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
4 026
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете проверить, используя метод ElementsCollection размер:

 && (page.getColor().filterBy(hasChild)).size() != 0){
        //to do

Локатор, который вы используете ниже, возвращает коллекцию элементов span, и вы не можете фильтровать ее с помощью родительского элемента li:

@FindBy(how = How.CSS, using = "#j-product-info-sku > dl:nth-child(2) > dd > ul > li > a > span")

Вы можете напрямую получить все активные элементы с помощью селектора css .p-property-item li.active span. Также вы можете получить коллекцию элементов li с помощью селектора .p-property-item li, затем отфильтровать ее по классу active и получить цвет.

В приведенном ниже методе вы пытаетесь фильтровать по text вместо class, используйте Condition.cssClass("active"):

Condition hasChild = hasChildWithCondition(By.cssSelector("li"), Condition.text("active"));

Ваш код должен выглядеть так:

ElementsCollection colorList = $$(".p-property-item li");
String activeColor = colorList.filterBy(Condition.cssClass("active")).shouldHaveSize(1).$("span").text();

//or

ElementsCollection colorList = $$("#j-product-info-sku > dl:nth-child(2) > dd > ul > li");
ElementsCollection activeList = colorList.filterBy(Condition.cssClass("active"));
ElementsCollection disabledList = colorList.filterBy(Condition.cssClass("disabled"));

Привет, @Sers! Спасибо, что направили меня по правильному пути. Но оказывается, что существует несколько реализаций li: 1)<li></li> селектор css собирает как отключенные, так и активные элементы #j-product-info-sku > dl:nth-child(2) > dd > ul > li > a > span2)<li class = "active"></li> селектор собирает только активные элементы #j-product-info-sku > dl:nth-child(2) > dd > ul > li.active a span3)<li class = "disabled"></li> селектор собирает только отключенные элементы #j-product-info-sku > dl:nth-child(2) > dd > ul > li.disabled a span

hamvee 16.09.2018 16:45

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

hamvee 16.09.2018 16:45

Пример @TimurAibulatov, который я вам дал с фильтром по cssClass, должен отображать только li элементов с активным классом. Измените свой селектор, удалите > a > span. Для отключения просто замените класс active на disabled

Sers 16.09.2018 16:50

Почему бы не использовать отдельные селекторы 2) и 3), а не фильтр?

Sers 16.09.2018 16:56
Ответ принят как подходящий

Решение найдено: чтобы поместить в коллекцию только активные элементы, я решил игнорировать элементы li с классом «disabled».

ElementsCollection colorList = $$("#j-product-info-sku > .p-property-item > .p-item-main > ul > li:not(.disabled) > a");

На данный момент коллекция содержит только активные элементы

Другие вопросы по теме