Selenide:如何从ElementsCollection中获取所有活动元素?

时间:2018-09-16 09:16:49

标签: java selenium selenium-webdriver selenide

我正在尝试为集合编写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方法:Filtering an 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 :(得分:1)

您在下面使用的定位符返回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"));

答案 1 :(得分:0)

您可以使用ElementsCollection的size方法进行检查:

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

答案 2 :(得分:0)

找到解决方案:为了只将活动元素放入集合中,我决定忽略类为“禁用”的li元素

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

到目前为止,该集合仅包含活动元素