2

我有2ElementsCollectionsoddTableRowItemsevenTableRowItems

private static ElementsCollection oddTableRowItems() {
    return $$(By.className("odd"));
}

private static ElementsCollection evenTableRowItems() {
    return $$(By.className("even"));
}

我想将 2 组合起来,以便只执行一次 for 循环。它是行项目,只有类名出于样式目的而有所不同,我只能通过类名来识别它们。

这就是我尝试组合它的方式 - 但它不起作用:

ElementsCollection rowElements = evenTableRowItems();
rowElements.addAll(oddTableRowItems());

我得到一个:

java.lang.UnsupportedOperationException

有谁可以把 2 结合起来ElementsCollections

4

4 回答 4

2

API 在这里可能会更友好一些。但是这样你可以组合两个 ElementsCollection 实例。这里的关键是WebElementsCollectionWrapper类。

ElementsCollection evenElements = $$(By.className("even"));
ElementsCollection oddElements = $$(By.className("odd"));
List<SelenideElement> elementsCombined = new ArrayList<>(evenElement);
elementsCombined.addAll(oddElements);
WebElementsCollectionWrapper wrapper = new WebElementsCollectionWrapper(elementsCombined);
ElementsCollection selenideCollectionCombined = new ElementsCollection(wrapper);
于 2015-12-21T18:39:37.287 回答
2

所有方法都是按设计add*抛出的。UnsupportedOperationException这是因为ElementsCollections表示网页上现有网络元素的集合;并且页面元素不能通过测试修改。这就是为什么您不能在页面上添加或删除元素的原因。

最简单的方法是一次选择所有匹配的元素:

$$(".odd,.even").shouldHave(size(10));

更长一点的方法是组成一个包含两个集合的新列表:

List<String> newList = new ArrayList<String>();
newList.addAll($$(".odd"));
newList.addAll($$(".even"));

但你的目标对我来说似乎是可疑的。您将获得订单无效的列表。为什么会有用?为什么需要迭代所有元素?我无法想象一个用例。

于 2015-12-21T21:42:42.870 回答
0

根据API

请注意,除非 add(int, E) 被覆盖,否则此实现将引发 UnsupportedOperationException。

于 2015-12-17T21:17:58.573 回答
0

你可以试试这段代码。这是工作正常!

ArrayList<SelenideElement> newList = new ArrayList<SelenideElement>();
newList.addAll(Selenide.$$(By.className("odd"));
newList.addAll(Selenide.$$(By.className("even"));
于 2018-09-17T06:07:41.130 回答