3

我正在尝试创建一个函数来过滤ElementsCollection, 每个元素的子元素而不是元素本身的条件。

这是我想出的:

 public static ElementsCollection filterByChild(ElementsCollection elementsCollection, String childCssSelector,
        Condition condition) {

        Predicate<SelenideElement> childHasConditionPredicate = element -> element.$(childCssSelector).has(condition);
        elementsCollection.removeIf(childHasConditionPredicate);
        return elementsCollection;
    }

当像这样调用这个函数时:

myCollection = SelenideHelpers.filterByChild(myCollection, "a", Condition.text("http://www.link.com");

我收到以下错误消息:

java.lang.UnsupportedOperationException: Cannot remove elements from web page

我没有找到有关此错误消息的任何相关信息可以应用于我的代码。我想知道为什么会出现这条消息。

4

1 回答 1

2

检查SelenideElementIterator是如何设计的:

@Override
public void remove() {
  throw new UnsupportedOperationException("Cannot remove elements from web page");
}

要使其工作,您需要创建自定义条件,例如:

import com.codeborne.selenide.Condition;
import com.codeborne.selenide.ElementsCollection;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;

import static com.codeborne.selenide.Selenide.$$;


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

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

然后用它来过滤:

ElementsCollection collection = $$(".parent");
Condition hasChild = hasChildWithCondition(By.cssSelector("a"), Condition.text("http://www.link.com"));
collection.filterBy(hasChild);
于 2017-11-15T22:07:39.507 回答