Selenium:如何在给定 xpath 的情况下获取子跨度元素的列表

Selenium: How to get list of child span elements given a xpath

我想获取以下 xpath 的所有子跨度元素

//label[@for='someText']/span

这应该return我

<span class="someClass">"Find this text"</span>
<span id="someId">"Find this text2"</span>

基本上,嵌套的 span 元素的数量可能会动态变化,在这种情况下我们有 2 个 span 子元素,在某些情况下可以只有 1 个或多个 span 元素。

目标: 这背后的意图是获取所有这些元素的文本以进行比较。一旦我得到这些元素,我就可以遍历它们中的每一个,并根据它们的属性获取我想要的数据。

示例 HTML 格式:

<label for="someText">
  <span class="nestedClass">
    <h2 id="id">
      <span>"Hello"</span>
    </h2>
    <span class="someClass">"Find this text"</span>
    <br>
    <span id="someId">"Find this text2"</span>
  </span>
</label>

有什么办法可以实现吗?有人可以帮我解决这个问题或更好的方法吗?

谢谢。

您可以使用 size() 遍历元素或使用 for 循环简单地迭代列表。

List<WebElement> mySpans = driver.findElements(By.xpath("//label[@for='someText']/span//span"));
        
        int totalSpans = mySpans.size(); // This is the total count of spans - dynamic
        
// or simply iterate the list of webelements using for loop
        for(WebElement span : mySpans)
        {
            System.out.print(span.getText());
        }

使用 xpath 中的任何一个应该适合您。

List<WebElement> elements = driver.findElements(By.xpath("//label[@for='someText']/span/span"));

或者忽略 span 标签 who's parents h2

List<WebElement> elements = driver.findElements(By.xpath("//label[@for='someText']/span//span[not(ancestor::h2)]"));

您可以使用以下 XPath:

//label[@for="someText"]/span/*[not(*)]/text()

这里predicate*[not(*)]会过滤leaf span节点