Я пытаюсь написать оператор 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'
Вы можете проверить, используя метод 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"));
Но теперь я снова в тупике: метод может получить активные элементы, используя второй вариант, вопросы: а) как отсортировать коллекцию первого варианта, чтобы получить только активные элементы? б) как я могу использовать третий вариант?
Пример @TimurAibulatov, который я вам дал с фильтром по cssClass, должен отображать только li элементов с активным классом. Измените свой селектор, удалите > a > span
. Для отключения просто замените класс active
на disabled
Почему бы не использовать отдельные селекторы 2) и 3), а не фильтр?
Решение найдено: чтобы поместить в коллекцию только активные элементы, я решил игнорировать элементы li
с классом «disabled».
ElementsCollection colorList = $$("#j-product-info-sku > .p-property-item > .p-item-main > ul > li:not(.disabled) > a");
На данный момент коллекция содержит только активные элементы
Привет, @Sers! Спасибо, что направили меня по правильному пути. Но оказывается, что существует несколько реализаций
li
: 1)<li></li>
селектор css собирает как отключенные, так и активные элементы#j-product-info-sku > dl:nth-child(2) > dd > ul > li > a > span
2)<li class = "active"></li>
селектор собирает только активные элементы#j-product-info-sku > dl:nth-child(2) > dd > ul > li.active a span
3)<li class = "disabled"></li>
селектор собирает только отключенные элементы#j-product-info-sku > dl:nth-child(2) > dd > ul > li.disabled a span