Selenide: Как получить все активные элементы из ElementsCollection? - PullRequest
0 голосов
/ 16 сентября 2018

Я пытаюсь написать оператор 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; }

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

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

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

    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'

Ответы [ 3 ]

0 голосов
/ 16 сентября 2018

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

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

. Вы можете напрямую получить все активные элементы с помощью селектора .p-property-item li.active span css..
Также вы можете получить коллекцию 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"));
0 голосов
/ 29 сентября 2018

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

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

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

0 голосов
/ 16 сентября 2018

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

 && (page.getColor().filterBy(hasChild)).size() != 0){
        //to do
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...