当前位置: 首页 > 知识库问答 >
问题:

如何基于XPATH过滤元素?

关昊天
2023-03-14

我想选择仅在顶级国家/地区之后或仅在其他国家/地区之后的span元素

<div>
  <div>
    <span class="hb">Top Countries</span>
  </div>
  <span>Australia</span>
  <span>Guinea-Bissau</span>
  <div>
    <span class="hb">Other</span>
  </div>
  <span>Austria</span>
  <span>Mauritania</span>
  <span>Mauritius</span>
  <span>Nauru</span>
  <span>Palau</span>
  <span>Saudi Arabia</span>
</div>

我已经尝试了//*[text()='顶级国家']/.../跟随兄弟::跨度而不是(//*[text()='其他']/.../跟随兄弟::跨度)

如果我分别尝试这两种XPATH,它们都可以工作,但如果结合使用,它们就不起作用。

我只想选择排名靠前的国家,并将其列入一个列表:[“澳大利亚”,“几内亚比绍”],然后过滤掉其他国家。

如果我使用[text()=“Top Countries”]//以下同胞::span所有国家都被选中。例如,<代码>[“澳大利亚”、“几内亚比绍”、“西班牙”、“瑞士”、“英国”、“美国”、“奥地利”、“毛里塔尼亚”、“毛里求斯”、“瑙鲁”、“帕劳”、“沙特阿拉伯”]

使用<代码>//*[文本()=“其他”]//以下兄弟姐妹::span所选项目为[“奥地利”、“毛里塔尼亚”、“毛里求斯”、“瑙鲁”、“帕劳”、“沙特阿拉伯”]

列表是动态生成的,因此我无法根据文本/国家名称选择它们。

共有3个答案

巫培
2023-03-14

您可以创建两个列表,一个包含所有元素,另一个包含不需要的元素

List<WebElement> all = driver.findElements(By.xpath("//*[text()='Top Countries']/../following-sibling::span"));
List<WebElement> other = driver.findElements(By.xpath("//*[text()='Other']/../following-sibling::span"));

然后删除其他国家/地区

all.removeAll(other);

所有现在只包含“顶级国家”

赵夕
2023-03-14

这有帮助吗?假设总是有两个国家在顶级国家之下。

//span[text() = 'Top Countries']/../following-sibling::span[1]
//span[text() = 'Top Countries']/../following-sibling::span[2]
万嘉石
2023-03-14

它是:

//span[preceding-sibling::div[1]/descendant::text()='Top Countries']

这将选择:

Element='<span>Australia</span>'
Element='<span>Guinea-Bissau</span>'
//span[preceding-sibling::div[1]/descendant::text()='Other']
 类似资料:
  • 我正在使用Jackson的JsonNode解析json。我的json结构如下所示(设为变量rawJson): 在Java中: 如何通过过滤属性<code>name</code>来获得特定的JsonNode元素?如果我想得到<code>值</code>大于X的JsonNode元素,怎么样?我是否可以在不遍历<code>结果</code>变量的情况下完成这些操作?

  • 问题内容: 我正在尝试过滤一个类的实例数组。我想要一个由类属性之一过滤的新数组。Swift过滤器在此用例中的工作方式无法完全理解。 问题答案: 这应该工作… 您可能需要使您的枚举符合等式才能进行此比较。 $ 0是一个未命名的参数,您也可以这样做。 编辑:我刚刚测试了它,它的工作而不会使枚举符合等于。我认为您只需要在枚举带有参数时执行此操作。

  • 我们在我们的环境中使用Spring Cloud Netflix Zuul和Eureka。 我知道Ribbon从Eureka获取指定serviceId的服务器列表。在我们的例子中,我们有4个服务容器,其中一个容器是执行资源密集型任务的主容器。我想从服务器列表中过滤掉主容器,这样Ribbon就不会向容器转发任何请求。 如何过滤? 任何帮助都很感激。

  • 但是..我可以跳过HTML,直接访问输入元素吗…好像?

  • 问题内容: 以下HTML的Selenium xpath选择器将是什么: 我需要让Selenium IDE根据元素文本在列表中找到第二个项目。我以为可以解决问题,但显然没有。 问题答案: 我想这就是你要找的 而且更好

  • 对于以下 HTML,硒 xpath 选择器是什么: 我需要让Selenium IDE根据元素文本定位列表中的第二项。我认为可以做到,但显然不行。