基于 parent 的 Selenide 元素创建 children ElementsCollection

Creating children ElementsCollection based on parent's one in Selenide

我正在使用 Selenide 并寻找机会基于 [=17= 创建 children ElementsCollection ]parent的一个。例如,我有一个 web table 和一个由 table 行组成的 parent ElementsCollection。因此,在按某些条件过滤此集合后,我得到了例如 50 个结果行。然后需要将每行中的第一个单元格保存为新 ElementsCollection (children) 中的 SelenideElement。 如果我使用 List,这种情况没有任何问题,因为我可以使用 stream() 来做到这一点:

List<SelenideElement> parents = $$("parent_css_selector");
List<SelenideElement> children = parents.stream().filter(s -> s.getText().equals("some_text")).map(s -> s.$("child_css_locator")).collect(Collectors.toList());

//or even in List<String> if I need to...

List<String> childrenTexts = parents.stream().filter(s -> s.getText().equals("some_text")).map(s -> s.$("child_css_locator")).getText().collect(Collectors.toList());

但是由于 stream() 在 Selenide 6.2.0 中被弃用,我找不到机会这样做。

您的 IDE 应该会为您解决这个问题。由于 stream() 已弃用,您可以将其替换为 for 循环,例如

List<SelenideElement> children;
    
{
  List<SelenideElement> list = new ArrayList<>();
  for (SelenideElement s : parents) {
    if (s.getText().equals("some_text")) {
      SelenideElement child_css_locator = s.$("child_css_locator");
      list.add(child_css_locator);
    }
  }
  children = list;
}

IntelliJ 自动生成,如果它不是您想要的,我们深表歉意,但它不再依赖于 stream()

我在 Gitter 和 GitHub 的专业 Selenide 主题中提出了这个问题。我想指出,我在一个小时内收到了回复,这在项目开发和支持中是非常有价值的方法。 )) 这是 Selenide 创始人 Andrei Solntsev 的回答。

I recommend to avoid such long iterations etc. It causes slow tests. Instead, I would write a proper xpath that finds all the needed elements with just one web driver call.

I registered a feature request for adding non-deprecated stream() method: #1773

I really DON’T RECOMMEND using iterating elements this way. Such a test is highly ineffective. Just write a CollectionCondition as the deprecation notice recommends.

据我了解,他会return non-deprecated stream() in ElementsCollection.